在平面上,如果已知△p
0p1p
2 的三個頂點座標p0
(x0,
y0),
p1(x
1,y1
),p2
(x2,
y2) 和另一點
p 的座標(x
,y),要判斷點p是否在△p
0p1p
2 內。
這裡給出兩種判斷方法,第一種方法是先求出△p
0p1p
2 的外接圓圓心座標,然後得到三角形的半徑,比較半徑和圓心到點
p 的距離,就能判斷點
p和外接圓的位置關係。第二種方法是選擇△p
0p1p
2 的一條邊作為界線,如邊p0
p2,然後根據點p1
和點p 是否在p0
p2同側,比較∠p
0p1p
2 和∠p
0pp2
的大小,判斷點
p 和外接圓的位置關係。
三角形的外心座標公式為: x=
∣∣∣∣
∣x20
+y20
x21+
y21x
22+y
22y0
y1y2
111∣
∣∣∣∣
2∣∣∣
∣∣x0
x1x2
y0y1
y211
1∣∣∣
∣∣,y
=∣∣∣
∣∣x0
x1x2
x20+
y20x
21+y
21x2
2+y2
2111
∣∣∣∣
∣2∣∣
∣∣∣x
0x1x
2y0y
1y21
11∣∣
∣∣∣根據這個外心的座標公式計算出外置圓的圓心座標,就能得到圓的半徑,從而判斷出點
p 與外接圓的位置關係。
定義平面點的資料結構:
struct pointtri
;
求解行列式用到能夠計算
n階行列式的子函式:
// 求 aij 的代數余子式
vector
< vector
> cofactor(vector
< vector
> vecdet_ij, int i, int j)
}return vecreturn;
}// 計算行列式的值, 採用遞迴
double det_array(vector
< vector
> vecdet)
else
return sum;}}
主要的判斷函式為:
// 判斷點 p 是否在圓內
bool innerorout(pointtri vrtx0, pointtri vrtx1, pointtri vrtx2, pointtri vrtx)
else
}
這種採用通用的計算行列式值的方法**會比較多,針對三階行列式的求解可以採用固定的公式,展開求解,針對這個特定的求解問題會顯得簡化一些:
// 判斷點 p 是否在圓內
bool innerorout1(pointtri vrtx0, pointtri vrtx1, pointtri vrtx2, pointtri vrtx)
else
}
主函式的呼叫示例:
基本思路:
step1 計算∠p
0p1p
2 和∠p
0pp2
的大小,兩個角的大小在[0,
π ]範圍內。
step1.1 如果∠p
0pp2
=0,則點
p 不在圓內,結束;如果∠p
0pp2
=π,則點p
在圓內,結束。
setp2 判斷點p和
p1是否在p0
p2同側。
step2.1 這裡通過判斷向量積 p1
p0−→
−−×p
1p2−
→−− 與pp
0−→−
×pp2
−→− 是否同號,如果同號則在同一側,否則在兩側。
step3 如果點
p 和p1
是在p0p
2 同一側,若∠p
0p1p
2≤∠p
0pp2
,則點p 在圓內,否則在圓外,結束;如果點p和
p1是在p0
p2不在側,若∠p
0p1p
2+∠p
0pp2
≥π,則點
p 在圓內,否則在圓外,結束。
// 若果點 vrtx 在外置圓內或在圓上返回 true, 否則返回 false
bool innerorout2(pointtri vrtx0, pointtri vrtx1, pointtri vrtx2, pointtri vrtx)
else
// 計算角 p0pp1,
double angle_p0pp1;
if (pp0.x*pp0.x + pp0.y*pp0.y
< 0.000001 || pp1.x*pp1.x + pp1.y*pp1.y
< 0.000001)
else
if (angle_p0pp1 < 0.000001)
if ((pi/2.0 - angle_p0pp1) < 0.000001)
// 判斷點 p2 和 p 在否在直線 p0p1 的同一側
// 通過向量積來判斷,pp0 x pp1, p2p0 x p2p1
double product_p2 = p2p0.x * p2p1.y - p2p1.x * p2p0.y
; double product_p = pp0.x * pp1.y - pp1.x * pp0.y
; if (product_p2 * product_p > 0) // 點 p,p2同側
else
}else
else}}
判斷一點是否在三角形內
一點 d 是否在三角形 abc 內,相對於ab邊來說,d點在三角形內一定要和c點在 ab 邊同側,對於a,b 點也用相同的方法去判斷d點是否於其在相應邊的同側,這種方法還可以用來判斷多點是不是可以構成乙個凸多邊形。下邊以 ab 為邊例,驗證 c,d兩點是否在ab邊同側,ab 的在二維座標中的線性方程...
判斷點是否在三角形內
概述 給定三角形abc和一點p x,y,z 判斷點p是否在abc內。這是遊戲設計中乙個常見的問題。需要注意的是,這裡假定點和三角形位於同乙個平面內。本文介紹三種不同的方法,由淺入深 一 內角和法 連線點p和三角形的三個頂點得到三條線段pa,pb和pc,求出這三條線段與三角形各邊的夾角,如果所有夾角之...
判斷點是否在三角形內
給定三角形abc和一點p x,y,z 判斷點p是否在abc內。這是遊戲設計中乙個常見的問題。需要注意的是,這裡假定點和三角形位於同乙個平面內。本文介紹三種不同的方法,由淺入深 連線點p和三角形的三個頂點得到三條線段pa,pb和pc,求出這三條線段與三角形各邊的夾角,如果所有夾角之和為180度,那麼點...