概述
給定三角形abc和一點p(x,y,z),判斷點p是否在abc內。這是遊戲設計中乙個常見的問題。需要注意的是,這裡假定點和三角形位於同乙個平面內。
本文介紹三種不同的方法,由淺入深
一 內角和法
連線點p和三角形的三個頂點得到三條線段pa,pb和pc,求出這三條線段與三角形各邊的夾角,如果所有夾角之和為360度,那麼點p在三角形內,否則不在,此法直觀,但效率低下。
二 同向法
三 重心法
上面這個方法簡單易懂,速度也快,下面這個方法速度更快,只是稍微多了一點數學而已
三角形的三個點在同乙個平面上,如果選中其中乙個點,其他兩個點不過是相對該點的位移而已,比如選擇點a作為起點,那麼點b相當於在ab方向移動一段距離得到,而點c相當於在ac方向移動一段距離得到。
所以對於平面內任意一點,都可以由如下方程來表示
p = a + u * (c – a) + v * (b - a) // 方程1
如果係數u或v為負值,那麼相當於朝相反的方向移動,即ba或ca方向。那麼如果想讓p位於三角形abc內部,u和v必須滿足什麼條件呢?有如下三個條件
u >= 0
v >= 0
u + v <= 1
幾個邊界情況,當u = 0且v = 0時,就是點a,當u = 0,v = 1時,就是點b,而當u = 1, v = 0時,就是點c
整理方程1得到p – a = u(c - a) + v(b - a)
令v0 = c – a, v1 = b – a, v2 = p – a,則v2 = u * v0 + v * v1,現在是乙個方程,兩個未知數,無法解出u和v,將等式兩邊分別點乘v0和v1的到兩個等式
(v2) • v0 = (u * v0 + v * v1) • v0
(v2) • v1 = (u * v0 + v * v1) • v1
注意到這裡u和v是數,而v0,v1和v2是向量,所以可以將點積展開得到下面的式子。
v2 • v0 = u * (v0 • v0) + v * (v1 • v0) // 式1
v2 • v1 = u * (v0 • v1) + v * (v1• v1) // 式2
解這個方程得到
u = ((v1•v1)(v2•v0)-(v1•v0)(v2•v1)) / ((v0•v0)(v1•v1) - (v0•v1)(v1•v0))
v = ((v0•v0)(v2•v1)-(v0•v1)(v2•v0)) / ((v0•v0)(v1•v1) - (v0•v1)(v1•v0))
關於重心座標
判斷點是否在三角形內
給定三角形abc和一點p x,y,z 判斷點p是否在abc內。這是遊戲設計中乙個常見的問題。需要注意的是,這裡假定點和三角形位於同乙個平面內。本文介紹三種不同的方法,由淺入深 連線點p和三角形的三個頂點得到三條線段pa,pb和pc,求出這三條線段與三角形各邊的夾角,如果所有夾角之和為180度,那麼點...
判斷點是否在三角形內
問題 在二維座標系中,已知三角形頂點的座標,那麼對於座標系中的任意一點p,判斷是否在三角形內?double area point a,point b,point c bool is point a,point b,point c,point d 設s area abc s1 area abd s2 ...
判斷點是否在三角形內
1.面積法 如果三角形pab pac和pbc的面積之和與三角形abc的面積相等,則可判定點p在三角形abc內 包括在三條邊上 已知三角形頂點a b c 的座標分別為 ax,ay bx,by cx,cy 即可計算其面積 s ax by bx cy cx zy ay bx by cx cy ax 2 2...