Определение пересечения 2D треугольника в декартовой системе координат - PullRequest
0 голосов
/ 05 октября 2018

Я пишу простой графический редактор, в котором пользователь может нарисовать треугольник (в направлении по часовой стрелке или против часовой стрелки), а затем выбрать треугольник и перетащить его.

Моя проблема сводится к поиску илине координаты курсора мыши пересекаются с треугольником.Поскольку я использую 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;

Какой тип работает, если треугольник в первом квадранте и ориентированный счетчик- по часовой стрелке, однако, он также распознается как пересечение, если слева от треугольника.

Спасибо за любую помощь.

РЕДАКТИРОВАТЬ: Проблема была опечатка, которую я имел вмой код (неправильное значение для вершины в моем треугольнике) закончился с использованием вычисления площади подхода для обнаружения пересечения.

1 Ответ

0 голосов
/ 06 октября 2018

Если вы не знаете порядок намотки вашего треугольника, вы можете проверить, находится ли курсор мыши слева от каждого края и справа от каждого края.Если что-то из этого верно, значит курсор мыши действительно находится внутри треугольника.

К счастью, в случае треугольника любая 2-комбинация его вершин дает свое ребро.Таким образом, задача состоит в том, чтобы вычислить шесть перекрестных произведений.

Но также, после того, как пользователь закончил рисовать треугольник, вы можете сохранить вершины треугольника с определенным порядком намотки, тогда вы можете сделать только три перекрестных произведения.

...