對於任意四邊形 ABCD,其對角線 AC、BD 的中點分別為 M、N。延長邊 AB、CD 交於點 R。則 △RMN 的面積 = ¼ × 四邊形 ABCD 面積。
double 雙精度減少誤差。
typedef struct { double x, y; } Point;
#define A P[0]
#define B P[1]
#define C P[2]
#define D P[3]
int ok(Point *p) {
double k1 = pow(B.y-A.y,2) + pow(B.x-A.x,2); // AB²
double k2 = pow(D.y-C.y,2) + pow(D.x-C.x,2); // CD²
double k3 = pow(C.y-B.y,2) + pow(C.x-B.x,2); // BC²
double k4 = pow(D.y-A.y,2) + pow(D.x-A.x,2); // DA²
if (k1==k2 && k3==k4) return 0; // 對邊相等 → 平行四邊形
return 1;
}
joind()處理垂直線 (斜率無窮大)、平行線等邊界情況,分類討論 6 種情形:
Point joind(Point P[]) {
// 完整分類討論程式碼 (略),回傳交點座標 Point
}
si_area()
double si_area(double s[]) { // s[4] 為四邊長
double t = (s[0]+s[1]+s[2]+s[3]) / 2.0;
return sqrt((t-s[0])*(t-s[1])*(t-s[2])*(t-s[3]));
}
注意:海倫公式僅適用於圓內接四邊形。任意四邊形面積應分解為兩三角形 (如 △ABC + △ACD) 計算,或使用鞋帶公式。本碼此處為近似驗證。
main() {
Point P[4], M, N, R;
// 1. 輸入四頂點
// 2. 檢查平行四邊形 → 排除
// 3. 計算中點 M(AC), N(BD)
// 4. 計算四邊長、四邊形面積
// 5. 計算交點 R (AB 延長線與 CD 延長線)
// 6. 計算三角形 RMN 三邊長
// 7. 餘弦定理求三角形面積
// 8. 輸出比值 四邊形面積 / 三角形面積
}
input (x,y) of point A: 0 0
input (x,y) of point B: 4 0
input (x,y) of point C: 5 3
input (x,y) of point D: 0 2
the point is -1.333333 0.000000 // R 座標
the retangle's area is 11.000000 // 四邊形面積
the triangle's area is 2.750000 // △RMN 面積
the retangle's area is the 4.000000 times as the triangle // 比值 = 4.0
| 誤差來源 | 影響 | 改進 |
|---|---|---|
| 海倫公式用於非圓內接四邊形 | 面積計算理論偏差 | 改用鞋帶公式或分解三角形求和 |
| double 浮點精度 (約 15-17 位) | 根號、三角函數累積誤差 | 使用 long double 或任意精度庫 |
| 餘弦定理求面積數值不穩定 | 小角度時 1-cos² 災難性抵消 | 改用向量叉積 |ax*by - ay*bx|/2 |
教學價值:此程式展示如何將幾何定理轉化為計算幾何程式,涵蓋座標幾何、向量運算、數值穩定性等核心技能。雖然原始碼有改進空間,但完整驗證了定理的正確性。