Implementação de Detecção de Colisão

Eu tenho uma class de detecção de colisão que funciona encontrando a distância entre os centros e se essa distância é pequena o suficiente para ser uma colisão (consulte Erro de detecção de colisão ). Meu problema é tentar fazer isso realmente funcionar, com elipses colidindo. Eu explicarei mais se necessário. THX

A melhor maneira de implementar a detecção de colisão por pixel quando as imagens estão sobrepostas, você pode ler mais sobre isso nos links a seguir

http://www.codeproject.com/KB/game/collision3.aspx

Problema de colisão por pixel em c #

Eu também fiz um problema como este para um projeto há alguns anos, quando eu precisava detectar se dois círculos se sobrepunham onde eu usei o seguinte código

public static bool Intersect(Rectangle rectangle1, Rectangle rectangle2) { if (((rectangle1.X < (rectangle2.X + rectangle2.Width)) && (rectangle2.X < (rectangle1.X + rectangle1.Width))) && (rectangle1.Y < (rectangle2.Y + rectangle2.Height)) && (rectangle2.Y < (rectangle1.Y + rectangle1.Height))) { Vector2 rect1Centre = new Vector2(rectangle1.X + rectangle1.Width / 2, rectangle1.Y + rectangle1.Height / 2); Vector2 rect2Centre = new Vector2(rectangle2.X + rectangle2.Width / 2, rectangle2.Y + rectangle1.Height / 2); double radius1 = ((rectangle1.Width / 2) + (rectangle1.Height / 2)) / 2; double radius2 = ((rectangle2.Width / 2) + (rectangle2.Height / 2)) / 2; double widthTri = rect1Centre.X - rect2Centre.X; double heightTri = rect1Centre.Y - rect2Centre.Y; double distance = Math.Sqrt(Math.Pow(widthTri, 2) + Math.Pow(heightTri, 2)); if (distance <= (radius1 + radius2)) return true; } return false; } 

Código não muito legal, mas eu escrevi fazendo meu primeiro jogo XNA

Eu tive o mesmo problema recentemente. A sobreposição de círculos é fácil de determinar. Com elipses é mais complicado, mas não tão ruim assim. Você brinca com a equação da elipse por um tempo, e o resultado surge:

 //Returns true if the pixel is inside the ellipse public bool CollisionCheckPixelInEllipse(Coords pixel, Coords center, UInt16 radiusX, UInt16 radiusY) { Int32 asquare = radiusX * radiusX; Int32 bsquare = radiusY * radiusY; return ((pixel.X-center.X)*(pixel.X-center.X)*bsquare + (pixel.Y-center.Y)*(pixel.Y-center.Y)*asquare) < (asquare*bsquare); } // returns true if the two ellipses overlap private bool CollisionCheckEllipses(Coords center1, UInt16 radius1X, UInt16 radius1Y, Coords center2, UInt16 radius2X, UInt16 radius2Y) { UInt16 radiusSumX = (UInt16) (radius1X + radius2X); UInt16 radiusSumY = (UInt16) (radius1Y + radius2Y); return CollisionCheckPixelInEllipse(center1, center2, radiusSumX, radiusSumY); }