Я пишу простой графический редактор, в котором пользователь может нарисовать треугольник (в направлении по часовой стрелке или против часовой стрелки), а затем выбрать треугольник и перетащить его.
Моя проблема сводится к поиску илине координаты курсора мыши пересекаются с треугольником.Поскольку я использую GLFW, мое оконное пространство определено в декартовой системе координат, где x / y имеет диапазон [-1, 1].
Это вызывает проблему, когда я пытаюсь определить, есть ли у меня пересечение, используябарицентрические координаты (или любой другой найденный метод здесь )
Мой текущий подход заключается в следующем:
double xpos, ypos;
glfwGetCursorPos(window, &xpos, &ypos);
// Get the size of the window
int width, height;
glfwGetWindowSize(window, &width, &height);
// Convert screen position to world coordinates
xworld = ((xpos / double(width)) * 2) - 1;
yworld = (((height - 1 - ypos) / double(height)) * 2) - 1; // NOTE: y axis is flipped in glfw
double area = 0.5 * (-p1y * p2x + p0y * (-p1x + p2x) + p0x * (p1y - p2y) + p1x * p2y);
double s = 1 / (2 * area) * (p0y * p2x - p0x * p2y + (p2y - p0y) * xworld + (p0x - p2x) * yworld),
t = 1 / (2 * area) * (p0x * p1y - p0y * p1x + (p0y - p1y) * xworld + (p1x - p0x) * yworld);
if (s > 0 && t > 0 && 1 - s - t > 0)
return true;
return false;
Какой тип работает, если треугольник в первом квадранте и ориентированный счетчик- по часовой стрелке, однако, он также распознается как пересечение, если слева от треугольника.
Спасибо за любую помощь.
РЕДАКТИРОВАТЬ: Проблема была опечатка, которую я имел вмой код (неправильное значение для вершины в моем треугольнике) закончился с использованием вычисления площади подхода для обнаружения пересечения.