我不能为我的生活弄清楚如果片段交叉如何让它返回true。任何帮助将不胜感激。
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 :(得分:3)
两个线段 AB 和 CD 交叉iff A 和 B 位于的不同侧CD ,反之亦然。要测试点 X 是否位于定向段 PQ 的左侧,请使用 ccw 原语。对于某些代码,请参阅http://algs4.cs.princeton.edu/91primitives/中的线段交叉点和http://www.cs.princeton.edu/~rs/AlgsDS07/16Geometric.pdf处的一些幻灯片。
答案 1 :(得分:2)
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))
在比较浮点数/双打时使用整数常量是不好的形式,但不一定是错误