如圖,點p在三角形abc內部,可以通過以下三個條件判斷:
點p和點c在直線ab同側
點p和點b在直線ac同側
點p和點a在直線bc同側
如果以上三個條件同時滿足,則點p在三角形abc內部。
下面將會用到叉乘這個數學工具來確定乙個點在直線的哪一側。
叉乘是乙個判斷點在直線哪一側的數學工具。先看一下叉乘的定義:a⃗
×b⃗ =
∥a⃗ ∥
∥b⃗ ∥
sinθn⃗
其中,θ 為向量夾角,n⃗
是乙個向量,與a⃗
和b⃗ 都垂直,方向滿足右手螺旋法則,即下圖所示:
於是,從第乙個向量的方向看,如果第二個向量在左邊,那個叉乘是正的,在右邊,則是負的,在同乙個方向上,則是0.叉乘的大小,則是兩個向量組成的平行四邊形的面積。
那麼叉乘具體如何計算呢?先將x、y、z軸方向的單位向量分別記為i⃗
、j⃗ 和k⃗
,則如果有兩個向量,分別為: u⃗
=u1i
⃗ +u2
j⃗ +u
3k⃗ =
(u1,
u2,u
3)v⃗
=v1i
⃗ +v2
j⃗ +v
3k⃗ =
(v1,
v2,v
3)則有: u⃗
×v⃗ =
(u2v
3−u3
v2)i
⃗ +(u
3v1−
u1v3
)j⃗ +
(u1v
2−u2
v1)k
⃗
可以用以下行列式來簡記: u⃗
×v⃗ =
∣∣∣∣
∣i⃗ u
1v1j
⃗ u2v
2k⃗ u
3v3∣
∣∣∣∣
如果叉乘的兩個向量都是平面向量,則可以看作是第三個分量為0的三維向量。
以下processing程式可以驗證叉乘用於點在直線哪一側的判斷的正確性:
pvector a = new pvector(100, 200);
pvector b = new pvector(300, 300);
pvector c = pvector.sub(b, a);
void setup()
void draw()
有興趣的讀者也可以把cross方法展開試試。
現在演算法已經很明顯啦!其中有一點小技巧,三角形的三個頂點是轉著來的,算一次就行了。比如,在上圖中,點c在直線ab左側,點b在直線ca的左側,點a在直接bc的左側。所以,第一步是先計算三角形的方向:
float signoftrig = (b.x - a.x)*(c.y - a.y) - (b.y - a.y)*(c.x - a.x);
注意這樣一下子寫出來不太容易看明白,但是如果看成向量ab和向量ac叉乘之後的z座標就好懂的多了。
再分別計算p在ab、ca、bc的哪一側:
float signofab = (b.x - a.x)*(p.y - a.y) - (b.y - a.y)*(p.x - a.x);
float signofca = (a.x - c.x)*(p.y - c.y) - (a.y - c.y)*(p.x - c.x);
float signofbc = (c.x - b.x)*(p.y - c.y) - (c.y - b.y)*(p.x - c.x);
最後判斷它們是否在同一側:
boolean d1 = (signofab * signoftrig > 0);
boolean d2 = (signofca * signoftrig > 0);
boolean d3 = (signofbc * signoftrig > 0);
println(d1 && d1 && d3);
這就是所有的演算法了!最後來個程式驗證一下。
pvector trig;
float r = 150
;float t = 0
;float interval = 30
;void setup()
void draw() else
ellipse(i, j, 2, 2);
}} t += 0.5;}
void updatetrig()
boolean intrig(float x, float y)
效果如下:
判斷點在三角形內
二維向量叉乘公式a x1,y1 b x2,y2 則a b x1y2 x2y1 設有向線段ab,兩端點a xa,ya b xb,yb 另一點c xc,yc float f xb xa yc ya xc xa yb ya if f 0 點c位於有向線段ab的左側 else if f 0 點c位於有向線段...
判斷乙個點是否在三角形內部
題目 在二維座標系中,所有的值都是double型,那麼乙個三角形可以由三個點來代表,給定三個點代表的三角形,再給定乙個點 x,y 判斷 x,y 是否在三角形中 基本思路 如果乙個點o在三角形的內部,那麼從三角形的乙個點出發,逆時針走過所有邊的過程中,點o始終在走過邊的左邊。如果點o在外側,則不滿足這...
判斷乙個點是否在三角形內部
判斷乙個點是否在三角形內部 在二維座標系中,所有的值都是double型別,那麼乙個三角形可以由3個點來代表,給定3個點代表的三角形,再給定乙個點 x,y 判斷 x,y 是否在三角形中 輸入描述 輸入有四行,每行兩個浮點數。前三行的6個數分別代表三角形的三個頂點的座標 最後兩個數分別表示 x,y 輸出...