0

如果分段交叉,我一生都无法弄清楚如何让它返回 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;   
}
4

2 回答 2

3

两条线段ABCD相交当且仅当AB在CD的不同侧,反之亦然。要测试点X是否在有向线段PQ的左侧,请使用ccw原语。有关某些代码,请参阅http://algs4.cs.princeton.edu/91primitives/中的线段相交和http://www.cs.princeton.edu/~rs/AlgsDS07/16Geometric.pdf中的一些幻灯片。

于 2012-09-13T23:57:14.097 回答
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))

在比较浮点数/双精度数时使用整数常量是不好的形式,尽管不一定是错误

于 2012-09-14T00:01:35.583 回答