Что не так с этим кодом, чтобы определить, пересекаются ли два отрезка линии?

Я не могу понять, как заставить его вернуть истину, если сегменты пересекаются. Любая помощь будет принята с благодарностью.

bool doCross(int x1, int y1, int x2, int y2, int x3, int y3, int x4, int y4)
{
bool cross = true;
double denom, uA, uB;

denom = (y4 - y3) * (x2 - x1) - (x4 - x3) * (y2 - y1);

if(denom == 0)
{
cross = false;
}
else
{
uA = (x4 - x3) * (y1 - y3) - (y4 - y3) * (x1 - x3) / denom;
uB = (x2 - x1) * (y1 - y3) - (y2 - y1) * (x1 - x3) / denom;
}
if (abs(0 < uA) && abs(uA < 1) && abs(0 < uB) && abs(uB < 1))
{
cross = true;
}
else
{
cross = false;
}
return cross;
}

0

Решение

вы сказали:

uA = (x4 - x3) * (y1 - y3) - (y4 - y3) * (x1 - x3) / denom;
uB = (x2 - x1) * (y1 - y3) - (y2 - y1) * (x1 - x3) / denom;

Я думаю, что вы хотите:

uA = ((x4 - x3) * (y1 - y3) - (y4 - y3) * (x1 - x3)) / denom;
uB = ((x2 - x1) * (y1 - y3) - (y2 - y1) * (x1 - x3)) / denom;

вы сказали:

if (abs(0 < uA) && abs(uA < 1) && abs(0 < uB) && abs(uB < 1))

вы берете абсолютную ценность сравнений, что не имеет никакого смысла.
Вы хотели:

if ((0 < abs(uA)) && (abs(uA) < 1) && (0 < abs(uB)) && abs(uB) < 1))

Это плохая форма, хотя и не обязательно ошибка, использовать целочисленные константы при сравнении чисел с плавающей точкой

2

Другие решения

Два отрезка AB а также CD крест если а также В по разные стороны CD и наоборот. Чтобы проверить, является ли точка Икс находится слева от ориентированного сегмента PQ, использовать CCW примитивный. Для некоторого кода, см. Пересечение отрезка в http://algs4.cs.princeton.edu/91primitives/ и некоторые слайды в http://www.cs.princeton.edu/~rs/AlgsDS07/16Geometric.pdf .

3

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector