我有一個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