我有一个 3d 世界,我有几个 2d 圆圈躺在地面上,面向天空。
我如何检查一条线是否会从上到下与其中一个圆圈相交?
我试图搜索,但我得到的只是这种交叉测试: http: //mathworld.wolfram.com/Circle-LineIntersection.html
但这不是我需要的,这是我的意思:http: //imageshack.us/m/192/8343/linecircleintersect.png
我有一个 3d 世界,我有几个 2d 圆圈躺在地面上,面向天空。
我如何检查一条线是否会从上到下与其中一个圆圈相交?
我试图搜索,但我得到的只是这种交叉测试: http: //mathworld.wolfram.com/Circle-LineIntersection.html
但这不是我需要的,这是我的意思:http: //imageshack.us/m/192/8343/linecircleintersect.png
如果您在一个坐标系中,其中地面由 z = c 给定,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
where找到,P1
具有三个元素并且P2
是标量。
获得坐标后,您可以检查与圆心的距离,d=sqrt((r_p-r)·(r_p-r))
并检查圆的半径在d<=R
哪里。注意标量乘法和点积R
之间的符号差异*
·
如果您确定圆圈位于地面 ( r=[0,0,0]
) 并且朝上 ( n=[0,0,1]
),那么您可以对上述一般情况进行大量简化。
[参考:Plucker 坐标]
更新:
当使用地面(+Z 向上)作为平面(圆圈所在的位置)时,然后使用r=[rx,ry,0]
andn=[0,0,1]
和上面的交点简化为
r_p = [ rBy-rAy, rAx-rBx, 0] / (rAy*rBx-rAx*rBy)
其中您可以检查到圆心的距离。