2015-11-13 105 views
0

我知道如何計算一個射線平面相交,但是如何測試交點是否在該平面上的一個正方形內?我正在測試這個點是否在離廣場中心的一段距離內,但我不確定這是否正確。Ray-square十字路口3D

+0

如果你正在測試一個點是否與中心的距離是不是半徑,I.E.測試一個圓圈?你可以在你的代碼中編輯這個測試嗎? – Knells

回答

0

答案取決於你的廣場是如何定義的。

如果正方形是軸對齊,這是不夠檢查

(P.X >= Square.Left) and (P.X <= Square.Right) and 
(P.Y >= Square.Top) and (P.Y <= Square.Bottom) 

如果正方形旋轉時,使點的投影到兩個相鄰的邊緣,並檢查它們在邊緣範圍。

1

這裏是任何凸多邊形奏效的方法: (見方塊簡化版本,在回答結束)

讓P1,P2,P3,P4表示你的正方形的四個頂點,讓q表示射線和支撐平面之間的交點。令n表示 與支撐平面垂直的向量(例如,取交叉積(p2-p1)x(p3-p1))。

要確定是否q被在廣場上,計算出以下四個量:

o1=orient(q,p1,p2,n) 
o2=orient(q,p2,p3,n) 
o3=orient(q,p3,p4,n) 
o4=orient(q,p4,p1,n) 

其中

orient(a,b,c,n) = [(b-a) x (c-a)] . n 
x: cross product; .: dot product 

如果O1,O2,O3和O4都相同的符號,那麼q是在廣場上(P1,P2,P3,P4)

它也適用於任何凸多邊形(P1,P2,P3,P4,...,PN)

它是如何工作:

如果你是2D,你會計算:

o1 = det(p1-q, p2-q) 
o2 = det(p2-q, p3-q) 
o3 = det(p3-q, p4-q) 
o4 = det(p4-q, p1-q) 

其中det(v1,v2) = (x1*y2)-(x2*y1)表示兩個向量之間的決定因素。

在英語中,如果o1,o2,o3,o4具有相同的符號,例如正數,則表示角度(p1,q,p2)爲「左轉」。如果所有角度(p1,q,p2),(p2,q,p3),(p3,q,p4)和(p4,q,p1)左轉,則q在多邊形內。每當它在外面時,有一個邊(pi,pj)使得(pi,q,pj)進行「右轉」。

現在,如果我們在3D的任意平面中,不再有像「左轉」和「右轉」這樣的事物,但我們可以引入法向量n,並且測試(q-p1, q-p2,n)是正面或負面的3D基礎(這是orient()計算的結果)。

特殊情況下爲方形

計算

X = (q-p1).(p2-p1)/||(p2-p1)|| 
Y = (q-p1).(p3-p1)/||(p3-p1)|| 

如果X >= 0 && X <= 1 && Y >= 0 && Y <= 1然後q是在廣場上(見姆博的答案)。

+0

非常感謝。正方形的逆時針或逆時針順序的頂點?訂單是否重要? – Stackmm

+0

不,這個順序對我給出的公式無關緊要。 – BrunoLevy