判斷一點是否在三角形的外接圓內

2021-07-03 14:44:49 字數 3414 閱讀 1303

在平面上,如果已知△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度,那麼點...