2010-03-04 4 views
3

В моей игре XNA мне нужно было определить неправильную форму, основанную на нескольких координатах Vector2 в 2D-пространстве. Причина заключалась в том, чтобы выполнить проверку на столкновение (например, Rectangle.Intersects()).Создание формы с использованием серии Vector2 - XNA

Например:

Vector2 point1 = new Vector(20,30); 
Vector2 point2 = new Vector(60,30); 
Vector2 point3 = new Vector(60,80); 
Vector2 point4 = new Vector(40,90); 
Vector2 point5 = new Vector(20,80); 

бы создать форму, которая имеет пути, который идет от point1 ->point2 ->point3 ->point4 ->point5 затем обратно в point1.

Однако я не смог найти правильное решение для его реализации. Пожалуйста помоги. Благодарю.

ответ

2

Существует несколько различных подходов к тому, что вы хотите сделать. Вы упомянули обнаружение столкновений: хотите ли вы определить, пересекает ли точка фигуру, или вы хотите определить, пересекаются ли два полигона?

Если вам нужна точка, то, что вы ищете, называется «точкой в ​​полигоне». Существует несколько разных подходов, но одним из самых быстрых и самых прямых подходов является лучевой тест. Вы создаете луч из своей точки и подсчитываете количество раз, когда оно пересекает края. Если число четное, точка находится снаружи. Если это странно, точка внутри.

Вы можете найти хорошую статью об этом здесь: http://www.ecse.rpi.edu/Homepages/wrf/Research/Short_Notes/pnpoly.html

Реализация кода из статьи выглядит так:

int pnpoly(int nvert, float *vertx, float *verty, float testx, float testy) 
{ 
    int i, j, c = 0; 
    for (i = 0, j = nvert-1; i < nvert; j = i++) { 
    if (((verty[i]>testy) != (verty[j]>testy)) && 
    (testx < (vertx[j]-vertx[i]) * (testy-verty[i])/(verty[j]-verty[i]) + vertx[i])) 
     c = !c; 
    } 
    return c; 
} 

Определение, если два многоугольника пересекаются более сложная, но не совсем непохожи. Многие игры на самом деле просто проверяют углы полигонов с точки в-поли, как легко и дешево, но также можно проверить полное пересечение.

Один из способов, по которым вы можете приблизиться к нему, - рассматривать каждый край как разделительную плоскость/полупространство. Пересечение полупространств определяет, пересекаются ли эти два полигона.

Попытайтесь найти "Разделительную теорию осей".

0

ZiggyWare (ранее www.ziggyware.com) имеет учебное пособие по обнаружению двумерных многоугольников, но, похоже, ZW находится в процессе перехода к новому дому. Here's a video, как выглядит учебник.

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