如何判斷乙個點在三角形內部

2021-07-11 21:00:54 字數 2557 閱讀 1485

如圖,點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 輸出...