Реализация обнаружения столкновений - PullRequest
1 голос
/ 22 августа 2010

У меня есть класс обнаружения столкновений, который работает путем определения расстояния между центрами и определения того, достаточно ли это расстояние для столкновения (см. Ошибка обнаружения столкновения ). Моя проблема состоит в том, чтобы попытаться заставить это фактически работать с сталкивающимися эллипсами. Я объясню больше, если это необходимо. Thx

Ответы [ 2 ]

2 голосов
/ 23 августа 2010

У меня недавно была такая же проблема. Круг перекрытия легко определить. С эллипсами это сложнее, но не так уж плохо. Некоторое время вы играете с уравнением эллипса, и результат получается:

//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);
}
2 голосов
/ 22 августа 2010

Наилучшим способом было бы реализовать обнаружение столкновений на пиксель, когда изображения перекрываются, вы можете узнать больше об этом в следующих ссылках

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

Проблема столкновений на пиксель в C #

Я также сделал такую ​​проблему для проекта несколько лет назад, когда мне нужно было определить, перекрываются ли два круга там, где я использовал следующий код

    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;
    }

Не очень хороший код, но я написал его, выполняя свою первую игру XNA

...