Haaf's Game EngineСтатьи

Класс проверки пересечений многоугольников в 2D

Автор:

Работа с классом для обработки пересечений двумерных многоугольников.
Описание используемых методов.
Исходные коды.

Класс проверки пересечений многоугольников в 2D - VMPolygon

Скачать: PolyDetector

Данный класс реализует полигональную проверку пересечений многоугольников, может применяться в любой 2D и 2,5D игре.
Основан на принципе "если хотя бы одна вершина одного многоугольника лежит внутри другого многоугольника или наоборот, то данные многоугольники пересекаются". Правда есть одно исключение, которое изображено на иллюстрации 1, это когда многоугольники пересекаются, но вершины их, находятся за переделами друг друга. В данном случае необходима дополнительная проверка на пересечение отрезков многоугольников.

Свойства и методы:
void AddVertice(VPoint2D p)
Добавление вершины в полигон (перечисление вершин идет по часовой стрелке).
Параметры:
  - координаты вершины.

bool Test(VPoint2D p)
Тест на вхождение точки в полигон. Возвращает true, если точка находится "внутри" многоугольника.
Параметры:
  - координаты точки.

int  VerticesCount()
Возвращает количество вершин в полигоне
Параметры:
  - нет.

VPoint2D GetVertice(int i)
Возвращает вершину с индексом i.
Параметры:
  - номер вершины.

void GetAABB(VPoint2D & p_topleft, VPoint2D & p_bottomright)
Возвращает координаты верхнего левого угла и нижнего правого для ограничивающего прямоугольника (AABB).
Параметры:
  - ссылка на переменные в которые будут занесены координаты точек.

void Reset()
Сброс трансформаций полигона.
Важно! Необходимо вызывать после заполнения полигона вершинами.
Параметры:
  - нет.

void FlipHorizontal()
Отражение вершин многоугольника по горизонтали.
Параметры:
  - нет.

void FlipVertical()
Отражение вершин многоугольника по вертикали.
Параметры:
  - нет.

void Rotate(float f_angle)
Вращение многоугольника на угол f_angle.
Параметры:
  - угол поворота в радианах.

void Scale(float f_w, float f_h)
Маштабирование вершин многоугольника.
Если параметр f_h равен 0, то многоугольник маштабируется к коэффициентом f_w  в горизонтальном и вертикальном направлении одинаково.
Параметры:
  - коэффициент растяжения по оси 0X;
  - коэффициент растяжения по оси 0Y.

void Translate(float f_x, float f_y)
Перемещение многоугольника.
Параметры:
  - количество пикселей на которое необходимо сместить многоугольник по оси 0X;
  - количество пикселей на которое необходимо сместить многоугольник по оси 0Y.

bool IsIntersect(VMPolygon * p, bool Accurate)
Проверка пересечения многоугольника с другим многоугольником. Вовращает true если есть пересечение, иначе false.
Параметр Accurate рекомендуется задавать в true если:
1. Ограничивающие прямоугольники(AABB) проверяемых многоугольников разнятся более чем в 2 раза.
2. Расстояние между вершинами одного многоугольника превышает AABB второго многоугольника.
Информация: параметр Accurate понижает производительность в N*M раз при проверке столкновений, где N-кол-во вершин одного многоугольника, M-второго.
Параметры:
  - указатель на полигон с которым проверяется пересечение.
  - параметр, разрешающий проверку по пересечению отрезков, если тест на вхождение вершин не был пройден. (см. иллюстрацию 1).

Частный случай пересечения.
Иллюстрация 1.
Частный случай пересечения многоугольников | Класс проверки пересечений многоугольников в 2D
Вершины многоугольника A, не входят в многоугольник B и наоборот.

Страницы: 1 2 Следующая »

#2D, #collision, #polygon, #многоугольник, #пересечение, #полигон

22 октября 2007 (Обновление: 25 ноя 2011)

Комментарии [14]