Math 请解释一下这个交叉测试函数

Math 请解释一下这个交叉测试函数,math,Math,我查看了geometry类中提供的几个函数,发现这个注释非常糟糕的函数,它显然测试两条直线之间是否存在交点。有人能给我解释一下这是怎么回事吗 inline bool LineIntersection2D(Vector2D A, Vector2D B, Vector2D C, Vector2D D) { d

我查看了geometry类中提供的几个函数,发现这个注释非常糟糕的函数,它显然测试两条直线之间是否存在交点。有人能给我解释一下这是怎么回事吗

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;
}
内联布尔线相交2D(矢量2D A,
向量2db,
向量C,
向量(2D)
{
双rTop=(A.y-C.y)*(D.x-C.x)-(A.x-C.x)*(D.y-C.y);
双止点=(A.y-C.y)*(B.x-A.x)-(A.x-C.x)*(B.y-A.y);
双机器人=(B.x-A.x)*(D.y-C.y)-(B.y-A.y)*(D.x-C.x);
如果(Bot==0)//并行
{
返回false;
}
双invBot=1.0/Bot;
双r=rTop*invBot;
双s=停止*invBot;
如果((r>0)&(r<1)&(s>0)&(s<1))
{
//线相交
返回true;
}
//直线不相交
返回false;
}

从我收集的数据来看,A和B是第一行的两点,C和D是第二行的两点。从那以后,我完全迷路了。提前谢谢

首先让我们确定一些向量。设
u=B-A
v=D-C
w=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
这里的
uxv
是二维版的叉积,它给出了平行四边形的有符号区域和边
u
v

假设有交点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和s。我们可以通过将与
u
v
的叉积取为
uxu=0
来消除r或s

r u X u + w X u = s 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是垂直的

现在,
uxv
给出矩形的面积,
wxv
给出平行四边形的面积。我们可以看到,两个面积的比率与长度AB与AP的比率相同

下面是一个更一般的立场案例的另一个视图


sTop=vxw
是平行四边形ACDE的面积,
Bot=uxv
是较大的平行四边形ABFE的面积。两者的比率告诉您交点沿AB线有多远。

您一般了解直线交点方程式吗?不是这个函数,而是数学方程。如果需要的话,我可以在谷歌上搜索一下。我会说,第1步,让你从代码中了解方程。然后,再看一遍代码,看看是否有什么对你更有意义。顺便说一句,这个问题现在已经离题了。这不是一个需要解释的地方。如果坡度相同,直线平行(或同一直线)。否则它们会在某个地方相交,但这段代码希望线段相交,所以它会检查相交点是否在每组点之间(通过对从一个点到相应端点的航向进行一种参数化查看),好的,但为什么我们要定义这些向量:u、v和w。它们分别代表什么?它们使剩下的计算更容易。u只是从第一段开始到结束的向量。v是从第二段起点到终点的矢量,w是从第二段底部到第一段底部的矢量。
w X u = s v X u
s = ( w X u ) / ( v X u )
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)