2015-08-20 4 views
2

Я делаю игру на C# и XNA, и я использую три Точка, чтобы представлять hitbox вражеского объекта. Переменная Rectangle используется для представления hitbox игрока. Я использую три Точка для врага, а не прямоугольник, поскольку враг имеет форму треугольника.Как проверить, перекрывает ли Rectangle область между тремя точками? (C# и XNA)

//Example coordinates 
Point pointOne = new Point(0, 50); 
Point pointTwo = new Point(50, 50); 
Point pointThree = new Point(25, 0); 
Rectangle rect = new Rectangle(0, 0, 10, 10); 

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

enter image description hereenter image description hereenter image description here

+1

Смотрите этот ответ: http://stackoverflow.com/questions/2272179/a-simple-algorithm-for-polygon-intersection/2984003 # 2984003 – Rob

+0

вам нужно обнаружение столкновения полигона –

ответ

2

Вот альтернативная реализация:

class Triangle 
{ 
    Vector2 topPoint, rightPoint, leftPoint; 


    public Triangle(Vector2 p1, Vector2 p2, Vector2 p3) 
    { 
     topPoint = p1; 
     rightPoint = p2; 
     leftPoint = p3; 
    } 



    public bool IsRectIntersecting(List<Vector2> corners)//corners are the corners of the polygon being tested 
    { 


     if (AreAnyOfTheCornesInsideTriangleLineSegment(topPoint, rightPoint, corners) && 
      AreAnyOfTheCornesInsideTriangleLineSegment(rightPoint, leftPoint, corners) && 
      AreAnyOfTheCornesInsideTriangleLineSegment(leftPoint, topPoint, corners)) 
     { 
      return true; 
     } 

     return false; 
    } 

    private bool AreAnyOfTheCornesInsideTriangleLineSegment(Vector2 pointA, Vector2 pointB, List<Vector2> corners) 
    { 
     Vector2 lineSegment = pointA - pointB; 
     Vector3 lineSegment3D = new Vector3(lineSegment, 0); 
     Vector3 normal3D = Vector3.Cross(lineSegment3D, Vector3.UnitZ); 
     Vector2 normal = new Vector2(normal3D.X, normal3D.Y); 

     foreach (Vector2 corner in corners) 
     { 
      if (Vector2.Dot(normal, corner - pointB) < 0) 
      { 
       return true; 
      } 
     } 

     return false; 
    } 
} 
+0

Хорошее решение. Гораздо меньше подробней, чем у меня. Единственное различие, которое я заметил, заключается в том, что ваше решение не рассматривает касательное пересечение как пересечение (если касаются только углы прямоугольника и треугольника, они считаются неперекрывающимися). Просто указывая, поскольку иногда существуют разные требования к краевым случаям. –

+1

Для прямоугольного угла, расположенного на краю треугольника (или прямоугольного угла, расположенного вместе с треугольным углом), условие Dot можно изменить следующим образом: 'if (Vector2.Dot (normal, corner-pointB) <= 0) ' –

+0

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

Смежные вопросы