給定三角形 ABC,在每邊外部作正方形,連接正方形頂點得線段,取中點與對應三角形頂點連線並延長,三線交於一點。證明該點為三角形垂心,並求座標。
A 關於 K 的對稱點 A',連 A'D, A'K;△AGK ≌ △A'GK(SAS),得 ∠1 = ∠4;∠2 = ∠5,進而證 △ABC ≌ △DAA';∠9 = 90°,即連線垂直於對邊,交點為垂心。垂心 H 為三條高線交點。利用向量旋轉 90° 構造高線:
C 垂直於 AB:方向向量 (A.y - B.y, B.x - A.x);B 垂直於 AC:方向向量 (A.y - C.y, C.x - A.x);#include <bits/stdc++.h>
using namespace std;
struct Point { double x, y; };
struct Line { Point a, b; };
Point intersection(Line u, Line v) {
Point ret = u.a;
double t = ((u.a.x - v.a.x)*(v.a.y - v.b.y) - (u.a.y - v.a.y)*(v.a.x - v.b.x))
/ ((u.a.x - u.b.x)*(v.a.y - v.b.y) - (u.a.y - u.b.y)*(v.a.x - v.b.x));
ret.x += (u.b.x - u.a.x) * t;
ret.y += (u.b.y - u.a.y) * t;
return ret;
}
Point orthocenter(Point A, Point B, Point C) {
Line l1, l2;
l1.a = C;
l1.b = { C.x - A.y + B.y, C.y + A.x - B.x }; // 旋轉 90°
l2.a = B;
l2.b = { B.x - A.y + C.y, B.y + A.x - C.x };
return intersection(l1, l2);
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int T; cin >> T;
while (T--) {
Point A, B, C;
cin >> A.x >> A.y >> B.x >> B.y >> C.x >> C.y;
Point H = orthocenter(A, B, C);
cout << fixed << setprecision(4) << H.x << ' ' << H.y << '\n';
}
return 0;
}
每測試用例 O(1),純幾何計算,無數值穩定性問題。