线段交叉点(仅交叉,无触点)

时间:2017-06-11 12:30:17

标签: c++ geometry intersection

我尝试找到" Line Segment Crossings"。所以我希望下面的函数只有在两条线真正相互交叉时才返回true,而不是它们在相同的点上开始/结束。从我读到的内容来看,似乎有一种琐事"数学上的解决方案,但无论如何提到这一点,它并没有真正以我能理解的方式解释。

以下是正确检测细分交叉的功能,包括"触摸"点。有没有一种简单的方法可以根据我的需要进行修改?

真的很感谢你的帮助!

inline double Dot(sf::Vector2f a, sf::Vector2f  b) { return (a.x*b.x) + (a.y*b.y); }
inline double PerpDot(sf::Vector2f a, sf::Vector2f b) { return (a.y*b.x) - (a.x*b.y); }

static bool LineCollision(const sf::Vector2f A1, const sf::Vector2f A2,
    const sf::Vector2f B1, const sf::Vector2f B2,
    double* out = 0)
{
    sf::Vector2f a(A2 - A1);
    sf::Vector2f b(B2 - B1);

    double f = PerpDot(a, b);
    if (!f)      // lines are parallel
        return false;

    sf::Vector2f c(B2 - A2);
    double aa = PerpDot(a, c);
    double bb = PerpDot(b, c);

    if (f < 0)
    {
        if (aa > 0)     return false;
        if (bb > 0)     return false;
        if (aa < f)     return false;
        if (bb < f)     return false;
    }
    else
    {
        if (aa < 0)     return false;
        if (bb < 0)     return false;
        if (aa > f)     return false;
        if (bb > f)     return false;
    }

    if (out)
        *out = 1.0 - (aa / f);
    return true;
}

1 个答案:

答案 0 :(得分:0)

要排除细分受众群结束,请将所有内部<中的严格比较>if's更改为<=>=,如下所示:

    if (aa >= 0)     return false;