我有一个3d世界,我有几个2d的圆形面向天空铺设在地上。线 - 在3D世界中的圆形交叉点测试?
如何检查一条线是否会与其中一个圆圈相交?
我试图寻找,但我得到的是这种相交测试的: http://mathworld.wolfram.com/Circle-LineIntersection.html
,但它不是我所需要的,这里是像我的意思: http://imageshack.us/m/192/8343/linecircleintersect.png
我有一个3d世界,我有几个2d的圆形面向天空铺设在地上。线 - 在3D世界中的圆形交叉点测试?
如何检查一条线是否会与其中一个圆圈相交?
我试图寻找,但我得到的是这种相交测试的: http://mathworld.wolfram.com/Circle-LineIntersection.html
,但它不是我所需要的,这里是像我的意思: http://imageshack.us/m/192/8343/linecircleintersect.png
如果你是在一个坐标系,其中地面由z = c给定,对于某个常数,则可以简单地计算z = c的线的x,y坐标。现在对于原点圆圈x0,y0和半径R,您只需检查是否
(x-x0)^ 2 +(y-y0)^ 2 < = R^2。
如果这是真的,则该线与圆相交。
在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)
其中您可以检查到圆心的距离。
你在哪里定义了我的3d线的矢量?即时通讯不试图检查一个圆内的一个点 – Rookie 2011-05-19 13:40:52
线和圆之间的交点将是一个点。如果该点在圆内,则该线相交。 – unwind 2011-05-19 13:55:29
我不明白这一点,但我会尝试......我只是想知道为什么你不定义z在那里 – Rookie 2011-05-19 15:24:54