У меня проблемы с преобразованием между локальными и глобальными координатами при проецировании прямоугольника на разные оси с использованием теоремы о разделенной оси: 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)
Не думаю, что это правильно?Так должен работать алгоритм?
Примечание. Я пытаюсь заставить код работать для всех выпуклых многоугольников, поэтому я не могу просто игнорировать отрицательные единичные векторы для этого прямоугольника.