有人请解释这个交叉口测试功能

时间:2016-10-09 21:22:22

标签: math

我正在查看几何类中提供的一些函数,我发现这个评论很差的函数显然测试了两行之间是否存在交集。有人可以向我解释一下这是如何运作的吗?

inline bool LineIntersection2D(Vector2D A,
                               Vector2D B,
                               Vector2D C, 
                               Vector2D D)
{
   double rTop = (A.y-C.y)*(D.x-C.x)-(A.x-C.x)*(D.y-C.y);
   double sTop = (A.y-C.y)*(B.x-A.x)-(A.x-C.x)*(B.y-A.y);

   double Bot = (B.x-A.x)*(D.y-C.y)-(B.y-A.y)*(D.x-C.x);

   if (Bot == 0)//parallel
   {
      return false;
   }

    double invBot = 1.0/Bot;
    double r = rTop * invBot;
    double s = sTop * invBot;

    if( (r > 0) && (r < 1) && (s > 0) && (s < 1) )
    {
        //lines intersect
        return true;
    }

//lines do not intersect
return false;
}

从我收集的内容来看,A和B是第一行的两个点,C和D是第二行的两个点。在那之后,我完全迷失了。提前谢谢!

1 个答案:

答案 0 :(得分:0)

首先让我们识别一些向量。设u = B - Av = D - Cw = A - C。第一行

double rTop = (A.y-C.y)*(D.x-C.x)-(A.x-C.x)*(D.y-C.y);
double sTop = (A.y-C.y)*(B.x-A.x)-(A.x-C.x)*(B.y-A.y);
double Bot = (B.x-A.x)*(D.y-C.y)-(B.y-A.y)*(D.x-C.x);

转换为

rtop = v X w 
stop = u X w
bot  = u X v

此处u X v是交叉积的2D版本,它给出了带有边uv的平行四边形的有符号区域。

让我们假设有一个交点P,我们可以写

P = r u  + A.

参数r的范围是0到1,以给出线段。我们也可以写

P = s v + C

我们可以将它们设置为彼此相等

r u + A = s v + C

并减去C

r u + A - C = s v

r u + w = s v

这是两个变量r和s中的二维矢量方程。我们可以通过将uv作为u X u = 0的交叉产品来消除r或s。

r u X u + w X u = s v X u

所以

w X u = s v X u

s = ( w X u ) / ( v X u )

同样地使用v的交叉产品消除了s。

r u X v + w X v = s v X v
r u X v + w X v = 0
r = - (w X v) / (u X v)
r = ( v X w )/ (u X v)

某个地方有一个标志,但我希望它给出了要点。

r和s必须介于0和1之间,以便交叉点位于段上。

我们可以几何解释这个。让我们举个例子,其中u是水平的,v是垂直的

enter image description here

现在u X v给出矩形区域,w X v给出平行四边形的区域。我们可以看到两个区域的比率与长度AB与AP的比率相同。

这是一个更一般的立场案例的另一种观点。

enter image description here

sTop = v X w是平行四边形ACDE的区域,Bot = u X v是较大的平行四边形ABFE的区域。两者的比率告诉你沿着AB线的交点是多远。