打比賽遇到一道外心的題(HDU - 6206),不去搜板子,根本不會,所以打算總結一下三角形的四心。
給出三角形的三個點 的對邊分別爲 。
重心:
定義:三條中線的交點。·常用 表示。
性質:
1. 重心座標
point GravityCenter(point A, point B, point C) {
double Gx = (A.x + B.x + C.x) / 3;
double Gy = (A.y + B.y + C.y) / 3;
return point(Gx, Gy);
}
2.
3.
4.
性質4證明:
外心:
定義:三條中垂線的交點,常用 來表示。
性質:
1. 外心座標:有點複雜,,,
設外心座標爲 ,外接圓半徑爲 。那麼外接圓的方程就爲 。
由此可得:
,化簡之後可得:
令:
運用簡單的線性代數知識(好像是叫克拉默法則),即可求得:
將相應字母代入,可得(公式太長 ):
還是代碼來得實在:
point CircumCenter(point A, point B, point C) {
double d = 2 * ((A.x - B.x) * (A.y - C.y) - (A.x - C.x) * (A.y - B.y)); //分母
double a = (A.y - C.y) * ((A.x * A.x - B.x * B.x) + (A.y * A.y - B.y * B.y)); //Ox的分子
a = a - (A.y - B.y) * ((A.x * A.x - C.x * C.x) + (A.y * A.y - C.y * C.y));
double b = (A.x - B.x) * ((A.x * A.x - C.x * C.x) + (A.y * A.y - C.y * C.y)); //Oy的分子
b = b - (A.x - C.x) * ((A.x * A.x - B.x * B.x) + (A.y * A.y - B.y * B.y));
double Ox = a / d;
double Oy = b / d;
return point(Ox, Oy);
}
我還從一本書上看到另外一種求法,比較簡潔,但不太懂:
point CircumCenter(point A, point B, point C) {
double a1 = B.x - A.x, b1 = B.y - A.y, c1 = (a1 * a1 + b1 * b1) / 2;
double a2 = C.x - A.x, b2 = C.y - A.y, c2 = (a2 * a2 + b2 * b2) / 2;
double d = a1 * b2 - a2 * b1;
double Ox = A.x + (b2 * c1 - b1 * c2) / d;
double Oy = A.y + (a1 * c2 - a2 * c1) / d;
return point(Ox, Oy);
}
2.
在說垂心之前,先說一個歐拉的定理:三角形外心 、重心 、垂心 三點共線,且(此直線叫做歐拉線)
證明:,,,,,,
所以,若已知三角形外心 、重心 、垂心 三點中任意兩點的座標,都可求得第三點的座標。
垂心:
定義:三條垂線的交點,常用 表示。
性質:
1. 垂心座標:
ps:其實也可以想外心那樣推,,,,要是喫飽了沒事幹,
point VerticalCenter(point A, point B, point C) {
return 3.0 * GravityCenter(A, B, C) - 2.0 * CircumCenter(A, B, C);
}
內心:
定義:三條角平分線的交點,常用 表示。
性質:
1.內心座標:
point InternalCenter(point A, point B, point C) {
double a = dis(B, C);
double b = dis(A, C);
double c = dis(A, B);
double Ix = (a * A.x + b * B.x + c * C.x) / (a + b + c);
double Iy = (a * A.y + b * B.y + c * C.y) / (a + b + c);
return point(Ix, Iy);
}
2. 點 是 的內心
證明:先略,,,
2. 爲平面任意一點,有
證明:先略,,,
再說一個歐拉的定理:
外心爲 ,內心爲 , 分別爲外接圓和內接圓的半徑,則有: