我在2D平面上有两条射线延伸到无穷远,但是它们都有起点。它们均由起点和沿射线方向延伸至无穷大的向量描述。我想找出两条光线是否相交,但是我不需要知道它们相交的位置(这是碰撞检测算法的一部分)。
到目前为止,我看过的所有内容都描述了如何找到两条线或线段的交点。有没有一种快速的算法可以解决这个问题?
给定:两条射线a,b,其起点(原始矢量)为bs,方向矢量ad,bd。
如果存在交点p,则两条线相交:
p = as + ad * u p = bs + bd * v
如果该方程组对u> = 0和v> = 0(正方向是使它们发出光线的原因)的解,则光线相交。
对于2d向量的x / y坐标,这意味着:
p.x = as.x + ad.x * u p.y = as.y + ad.y * u p.x = bs.x + bd.x * v p.y = bs.y + bd.y * v
进一步的步骤:
as.x + ad.x * u = bs.x + bd.x * v as.y + ad.y * u = bs.y + bd.y * v
解决v:
v := (as.x + ad.x * u - bs.x) / bd.x
针对u插入并求解:
as.y + ad.y * u = bs.y + bd.y * ((as.x + ad.x * u - bs.x) / bd.x) u := (as.y*bd.x + bd.y*bs.x - bs.y*bd.x - bd.y*as.x ) / (ad.x*bd.y - ad.y*bd.x)
计算u,然后计算v,如果两者都为正,则光线相交,否则不相交。