三角形的外接圓,就是其圓心到三個頂點的距離都相等。設三角形的座標爲(x1,y1),(x2,y2),(x3,y3),圓心座標爲(x,y),那麼它們滿足以下方程組:
(x-x1)^2+(y-y1)^2=(x-x2)^2+(y-y2)^2
(x-x1)^2+(y-y1)^2=(x-x3)^2+(y-y3)^2
解方程之後,可以得到x和y的表達式。我硬着頭皮解了一次,發現表達式很複雜,沒辦法化簡。公式不單獨列出,直接上代碼(C#):
/// <summary>
/// 三角形外接圓
/// </summary>
/// <param name="triangle">三角形頂點</param>
/// <param name="center">圓心</param>
/// <param name="radius">半徑</param>
public static void Circumcircle(Point2D[] triangle, out Point2D center, out double radius)
{
double x1 = triangle[0].X;
double y1 = triangle[0].Y;
double x2 = triangle[1].X;
double y2 = triangle[1].Y;
double x3 = triangle[2].X;
double y3 = triangle[2].Y;
double x3y2 = x3 * y2;
double x3y1 = x3 * y1;
double x2y3 = x2 * y3;
double x1y3 = x1 * y3;
double x2y1 = x2 * y1;
double x1y2 = x1 * y2;
double x1x2 = x1 * x2;
double x2x3 = x2 * x3;
double x1x3 = x1 * x3;
double y = (x3y2 * y2 - x3y1 * y1 - x2y3 * y3 + x1y3 * y3 + x2y1 * y1 - x1y2 * y2 +
x1x2 * (x1 - x2) + x2x3 * (x2 - x3) + x1x3 * (x3 - x1)) /
(x3y2 - x3y1 - x2y3 + x1y3 + x2y1 - x1y2) / 2;
double x = 0;
if (Math.Abs(x2 - x1) > 1e-6)
{
x = (x2 + x1) / 2 +
(y2 + y1 - 2 * y) * (y2 - y1) / (x2 - x1) / 2;
}
else
{
x = (x3 + x2) / 2 +
(y3 + y2 - 2 * y) * (y3 - y2) / (x3 - x2) / 2;
}
center = new Point2D(x, y);
radius = Math.Sqrt(Math.Pow(x - x1, 2) + Math.Pow(y - y1, 2));
}
上述公式經過驗證,是沒有問題的。