我正在查看几何类中提供的一些函数,我发现这个评论很差的函数显然测试了两行之间是否存在交集。有人可以向我解释一下这是如何运作的吗?
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是第二行的两个点。在那之后,我完全迷失了。提前谢谢!
答案 0 :(得分:0)
首先让我们识别一些向量。设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
此处u X v
是交叉积的2D版本,它给出了带有边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 u + w = s v
这是两个变量r和s中的二维矢量方程。我们可以通过将u
或v
作为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是垂直的
现在u X v
给出矩形区域,w X v
给出平行四边形的区域。我们可以看到两个区域的比率与长度AB与AP的比率相同。
这是一个更一般的立场案例的另一种观点。
sTop = v X w
是平行四边形ACDE的区域,Bot = u X v
是较大的平行四边形ABFE的区域。两者的比率告诉你沿着AB线的交点是多远。