Понимание теоремы о разделяющей оси и глобальных / локальных координат - PullRequest
1 голос
/ 08 декабря 2010

У меня проблемы с преобразованием между локальными и глобальными координатами при проецировании прямоугольника на разные оси с использованием теоремы о разделенной оси: http://en.wikipedia.org/wiki/Separating_axis_theorem. В конце я хотел бы проверить наличие столкновения с другим объектом.

Допустим, у меня есть прямоугольник с вершинами в глобальных координатах:

(10,20),(10,10),(20,10),(20,20)

Таким образом, локальные координаты будут:

(-5,5),(-5,-5),(5,-5),(5,5)

Это сделает 4 нормалиследующее: (1 для каждой оси)

(1,0),(0,1),(-1,0),(0,-1)

Минимальная / максимальная точка для этого значения будет:

(1,0) . (-5,5)   = -5
(1,0) . (-5,-5)  = -5
(1,0) . (5,-5)   =  5
(1,0) . (5,5)    =  5

Таким образом, минимальная / максимальная пара для этой нормали равна (-5,5), как и все остальные в этом случае из-за симметрии.

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

Это прекрасно работает при использовании векторов положительных единиц:

unit    center of rect
(1,0) . (15, 15)        = 15

Это означает, что скорректированные минимальные / максимальные значения будут 15-5,15 + 5 = 10,20, что является правильным

Однако, когда я делаю это для отрицательных единичных векторов, я получаю:

(-1,0) . (15, 15)      = -15, meaning that the min,max values are now (-20,-10)

Не думаю, что это правильно?Так должен работать алгоритм?

Примечание. Я пытаюсь заставить код работать для всех выпуклых многоугольников, поэтому я не могу просто игнорировать отрицательные единичные векторы для этого прямоугольника.

1 Ответ

0 голосов
/ 08 декабря 2010

Вы просто не можете держать свои координаты прямыми.Результат (-20, -10) является совершенно непротиворечивым и даст вам правильный ответ при тестировании полигонов на разделение (вдоль этой оси).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...