线 - 在3D世界中的圆形交叉测试?

时间:2011-05-19 13:12:54

标签: c++ algorithm math geometry line-intersection

我有一个三维世界,我有几个2d圆圈躺在面向天空的地面上。

我怎样才能检查一条线是否会从上到下与这些圆圈中的一个相交?

我试图搜索,但我得到的是这种相交测试: http://mathworld.wolfram.com/Circle-LineIntersection.html

但它不是我需要的,这里是我的意思: http://imageshack.us/m/192/8343/linecircleintersect.png

2 个答案:

答案 0 :(得分:4)

如果你在一个坐标系中,地面由z = c给出,对于某个常数,那么你可以简单地计算z = c的直线的x,y坐标。现在,对于原点x0,y0和半径R,您只需检查是否

(x-x0)^ 2 +(y-y0)^ 2< = R ^ 2.

如果是这样,则该线与圆相交。

答案 1 :(得分:4)

在3D意义上,您首先关注的不是圆形,而是圆形所在的平面。然后你可以找到光线(线)和平面(光盘)之间的交点。

我喜欢对点,平面和线使用齐次坐标,我希望您熟悉矢量点·和交叉积×。这是方法:

平面(磁盘)由点矢量r=[rx,ry,rz]和法线方向矢量n=[nx,ny,nz]定义。他们一起形成一个平面W=[W1,W2]=[n,-r·n]

线(光线)由两个点矢量r_A=[rAx,rAy,rAz]r_B=[rBx,rBy,rBz]定义。他们一起形成了行L=[L1,L2]=[r_B-r_A, r_A×r_B]

交叉点由P=[P1,P2]=[L1×W1-W2*L2, -L2·W1]定义,或扩展为

P=[ (r_B-r_A)×n-(r·n)*(r_A×r_B), -(r_A×r_B)·n ]

点的坐标由r_P = P1/P2找到,其中P1有三个元素,P2是标量。

获得坐标后,您需要d=sqrt((r_p-r)·(r_p-r))检查圆圈中心的距离并选中d<=R,其中R是圆的半径。请注意标量乘法*和点积·

之间的符号差异

如果您确定圆圈位于地面(r=[0,0,0])并面朝上(n=[0,0,1]),那么您可以对上述一般情况进行大量简化。

[参考:Plucker Coordinates]

<强>更新

当使用地面(+ Z向上)作为平面(圆圈所在的位置)时,使用r=[rx,ry,0]n=[0,0,1]并将上述交点简化为

r_p = [ rBy-rAy, rAx-rBx, 0] / (rAy*rBx-rAx*rBy)

你可以检查到圆心的距离。