首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> C++ 入門

POJ 1673 三角形垂心:幾何證明與坐標計算

     編輯:C++ 入門

幾何問題重述

給定三角形 ABC,在每邊外部作正方形,連接正方形頂點得線段,取中點與對應三角形頂點連線並延長,三線交於一點。證明該點為三角形垂心,並求座標。

幾何證明要點

  1. 作 A 關於 K 的對稱點 A',連 A'D, A'K;
  2. 證 △AGK ≌ △A'GK(SAS),得 ∠1 = ∠4;
  3. 推導 ∠2 = ∠5,進而證 △ABC ≌ △DAA';
  4. 最終得 ∠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),純幾何計算,無數值穩定性問題。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved