Существует несколько различных подходов к тому, что вы хотите сделать. Вы упомянули обнаружение столкновений: хотите ли вы определить, пересекает ли точка фигуру, или вы хотите определить, пересекаются ли два полигона?
Если вам нужна точка, то, что вы ищете, называется «точкой в полигоне». Существует несколько разных подходов, но одним из самых быстрых и самых прямых подходов является лучевой тест. Вы создаете луч из своей точки и подсчитываете количество раз, когда оно пересекает края. Если число четное, точка находится снаружи. Если это странно, точка внутри.
Вы можете найти хорошую статью об этом здесь: 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;
}
Определение, если два многоугольника пересекаются более сложная, но не совсем непохожи. Многие игры на самом деле просто проверяют углы полигонов с точки в-поли, как легко и дешево, но также можно проверить полное пересечение.
Один из способов, по которым вы можете приблизиться к нему, - рассматривать каждый край как разделительную плоскость/полупространство. Пересечение полупространств определяет, пересекаются ли эти два полигона.
Попытайтесь найти "Разделительную теорию осей".