對於任意四邊形ABCD,其對角線AC、BD的中點分別為M、N,邊AB與CD延長線交於R。定理聲稱:三角形RMN的面積等於四邊形ABCD面積的四分之一。
由於電腦浮點運算精度有限,採用double型別儲存座標與中間結果。最終計算出的面積比值若接近4,即視為驗證通過。
#include <stdio.h>
#include <math.h>
typedef struct { double x, y; } Point;
#define A P[0]
#define B P[1]
#define C P[2]
#define D P[3]
ok():檢測是否為平行四邊形(AB∥CD),若是則無法求交點,退出joind():計算兩線段延長線交點座標,處理垂直線、平行線等邊界情況si_area():用海龍公式計算四邊形面積(將四邊形視為兩三角形拼合)// 中點計算
m.x = (a.x + c.x) / 2.0; m.y = (a.y + c.y) / 2.0;
n.x = (b.x + d.x) / 2.0; n.y = (b.y + d.y) / 2.0;
// 海龍公式求四邊形面積
double si_area(double s[]) {
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]));
}
// 餘弦定理求三角形面積
tmp = cos((m1*m1 + m2*m2 - m3*m3) / (2*m1*m2));
sos = m1 * m2 * sqrt(1 - tmp*tmp);
此程式展示了如何用C語言將幾何問題轉化為座標計算,並處理浮點精度、邊界條件(平行線、垂直線)等工程實務問題。雖然受限於double精度只能得到近似驗證,但足以證明定理的正確性。