Обнаружение столкновения для повернутых прямоугольников с координатной математикой - PullRequest
0 голосов
/ 22 февраля 2012

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

Вот как работает мое решение:

Он получает координаты для 4 вершин каждого прямоугольника, переводит их так, чтобы они относились к 0, 0, а не к источникам прямоугольников, и поворачивает их соответственно, используя следующие формулы:

rotatedX = unrotatedX * cos( radiansOfCounterClockwiseRotation ) - 
           unrotatedY * sin( radians ); 

и

rotatedY = unrotatedX * sin( radians ) + y * cos( radians ); 

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

Затем он вычисляет значения x и y оси для сравнения разделения путем вычитания верхнего левого и нижнего правогокоординаты вершин из координат верхней правой вершины, всего 4 оси (1 для каждой пары параллельных ребер 2 прямоугольников)

Затем вычисляется значение x для каждой повернутой вершины, котораялежит на оси, используя эту формулу:

x = -( -( axis.x / axis.y ) * vertice.x - vertice.y ) / 
     ( axis[i].y / axis[i].x + axis[i].x / axis[i].y ); 

, которая получается из получения точки пересечения междуЛиния оси e и линия, перпендикулярная оси, проходящей через вершину

. Сравнивает эти значения для каждой оси и проверяет:

maxXValueForRect0 >= minXValueForRect1 AND minXValueForRect0 <= maxXValueForRect1; 

, если это верно для каждой оси, топроисходит столкновение

Однако во время отладки я обнаружил, что область значений min x всегда ниже значений max x, независимо от положения и размеров прямоугольников

Может кто-нибудь сказать мне, чтоздесь не так?

1 Ответ

0 голосов
/ 22 февраля 2012

Это работает отлично, и я допустил очень незначительную ошибку в самом коде, из-за которой обе группы вершин были переведены относительно первого прямоугольника после их вращения. Таким образом, логика, представленная здесь, является надежной и будет работать, если вы не совершите глупую ошибку, как я: D

...