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