2017-09-26 54 views
-1

我使用这个代码被张贴作为回答这个问题: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

+0

请指出,你几乎相交的意思。在二维飞机上,我不知道这应该是什么样子。 – schorsch312

+0

也许这是interrest:https://stackoverflow.com/questions/563198/how-do-you-detect-where-two-line-segments-intersect – 4386427

+0

在链接的问答中的参考应该有答案/ s你需要。 –

回答

0

它仍然不正是你想要计算“接近路口”什么清除。在您的示例图像中,可以通过将每条线(在两个方向上)延伸选定的容差量,然后检查延长线之间的(精确)交点来找到交点。

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

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

1

我不是一个图形专家,但这是我会做什么:

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

+1

这是一个非常好的主意。如果两个直线段不相交,则它们之间的最小距离在4个端点之一中达到。尽管如此,仍然有必要检查段相交的可能性。 此外,我没有看到一个简单的方法来检查段是否与圆相交 – Nevado

+0

@Nevado确定圆和线之间的交点。然后看看这些点(如果有的话)是否在线段上。 – bolov

+0

我认为给定一条线(有两个点)和一个圆(有点和半径),找出它们是否相交并不是一件小事。这当然是可能的,但值得评论一个解决方案,因为它的难度几乎与原始问题相同。 – Nevado

相关问题