在平面幾何中,求兩條直線的交點是基礎運算。以下提供一個通用的 Java 實作,利用參數方程法避免斜率不存在的問題。
class Point {
double x;
double y;
public Point() { this.x = 0; this.y = 0; }
}
class Line {
Point a;
Point b;
public Line() {
this.a = new Point();
this.b = new Point();
}
// 計算兩直線交點,若平行則返回 u.a
Point intersection(Line u, Line v) {
Point res = u.a;
double t = ((u.a.x - v.a.x) * (v.b.y - v.a.y) - (u.a.y - v.a.y) * (v.b.x - v.a.x))
/ ((u.a.x - u.b.x) * (v.b.y - v.a.y) - (u.a.y - u.b.y) * (v.b.x - v.a.x));
res.x += (u.b.x - u.a.x) * t;
res.y += (u.b.y - u.a.y) * t;
return res;
}
}
原理說明: 以向量參數形式表達直線 P = A + t(B - A),透過叉積解出參數 t,再代入求得交點座標。此法不需判斷斜率,自動處理垂直線情況。
利用向量性質:外心 G 滿足 (GA + GB)·AB = (GB + GC)·BC = (GC + GA)·CA = 0。程式碼採用構造中垂線並求交點的方式:
// 三角形外接圓圓心(外心)
Point center(Point a, Point b, Point c) {
Line u = new Line(), v = new Line();
// AB 邊中點
u.a.x = (a.x + b.x) / 2;
u.a.y = (a.y + b.y) / 2;
// AB 中垂線方向向量 (垂直於 AB)
u.b.x = u.a.x + (u.a.y - a.y);
u.b.y = u.a.y - (u.a.x - a.x);
// AC 邊中點
v.a.x = (a.x + c.x) / 2;
v.a.y = (a.y + c.y) / 2;
// AC 中垂線方向向量
v.b.x = v.a.x + (v.a.y - a.y);
v.b.y = v.a.y - (v.a.x - a.x);
// 兩中垂線交點即為外心
return intersection(u, v);
}
優勢: 完全避開斜率計算,無需處理垂直線特例,數值穩定性佳。
設三角形頂點 A(x₁,y₁)、B(x₂,y₂)、C(x₃,y₃),對邊長分別為 a=BC、b=CA、c=AB,內心座標為:
x = (a·x₁ + b·x₂ + c·x₃) / (a + b + c)
y = (a·y₁ + b·y₂ + c·y₃) / (a + b + c)
內心 M 到三邊距離相等,滿足 a·MA + b·MB + c·MC = 0(向量和)。展開得:
a(x₁ - X) + b(x₂ - X) + c(x₃ - X) = 0
a(y₁ - Y) + b(y₂ - Y) + c(y₃ - Y) = 0
解得上述公式。同理可證:a·OA + b·OB + c·OC = 0(O 為內心)。
由海倫公式得面積 S = √[p(p-a)(p-b)(p-c)],其中 p = (a+b+c)/2。內切圓半徑 r = 2S / (a+b+c)。