确定两个线段是否与公差

时间:2017-09-26 13:09:46

标签: c range line intersect segment

我正在使用此代码作为此问题的答案发布:How do you detect where two line segments intersect?

据我了解,如果两个线段完全相交,此函数仅返回一个交点。我需要修改此函数以包含公差,因此如果线段几乎相交(即在0.01范围内),它将返回一个交点。我不太了解支撑这个功能的数学,所以我希望有人可以提供帮助。

由于

// Returns 1 if the lines intersect, otherwise 0. In addition, if the lines 
// intersect the intersection point may be stored in the floats i_x and i_y.
char get_line_intersection(float p0_x, float p0_y, float p1_x, float p1_y, 
    float p2_x, float p2_y, float p3_x, float p3_y, float *i_x, float *i_y)
{
    float s1_x, s1_y, s2_x, s2_y;
    s1_x = p1_x - p0_x;     s1_y = p1_y - p0_y;
    s2_x = p3_x - p2_x;     s2_y = p3_y - p2_y;

    float s, t;
    s = (-s1_y * (p0_x - p2_x) + s1_x * (p0_y - p2_y)) / (-s2_x * s1_y + s1_x * s2_y);
    t = ( s2_x * (p0_y - p2_y) - s2_y * (p0_x - p2_x)) / (-s2_x * s1_y + s1_x * s2_y);

    if (s >= 0 && s <= 1 && t >= 0 && t <= 1)
    {
        // Collision detected
        if (i_x != NULL)
            *i_x = p0_x + (t * s1_x);
        if (i_y != NULL)
            *i_y = p0_y + (t * s1_y);
        return 1;
    }

    return 0; // No collision
}

编辑:为了澄清,下图描绘了两种线段几乎相交的场景。

Nearly intersecting lines - image

2 个答案:

答案 0 :(得分:1)

我不是图形专家,但这就是我要做的事情:

对于每个端点:查看半径为threshold的端点上居中的圆是否与另一个线段相交。然后这些线几乎相交。

答案 1 :(得分:0)

目前还不清楚你想要算什么作为“近交会”。在示例图像中,您可以通过按所选公差量扩展每条线(在两个方向上)找到交叉点,然后检查扩展线之间的(精确)交点。

如果要检测更锐角的线的交点,可以将每条线展开为矩形区域(宽度由公差确定),然后检查矩形区域之间的重叠。

在这两种情况下,容差量都意味着略有不同。你没有在你的问题中定义它。公差值到底意味着什么?是否需要扩展其中一条线以与另一条线形成交叉点的数量?它是每条线上任何可以被视为交叉点的点之间的最大距离吗?等