行列式
三角形的外接圆圆心也就是三角形的外心,一搜到处都有球外心的公式:
如果我们想推导一下的话,首先圆的方程式为: ,代入三个点:
写成矩阵形式:
也就是行列式:
展开:
对比就是上面的方程式:
对比一下这个方程式和圆的圆心方程式:
对比上下两式可知:
所以有最上面的求外心的式子。
同时值得指出的还有其实分母是三角形面积公式的4倍,即:
这个式子可以通过简单的叉乘也可以通过格林公式证明。
初中几何
如果我们就是简单的算一下2维平面上的三角形的外心还要引入矩阵,行列式在有些情况下就显得有点大材小用。有时候就从简,直接利用这个三角形的外心是三边的垂直平分线的交点既可。可能有以下几种情况:
算出两条直线,找到它们的交点,即算出三角形的外心:
def circumcircle(triangle):
v1, v2, v3 = triangle
x1, y1 = v1
x2, y2 = v2
x3, y3 = v3
absy1y2 = abs(y1 - y2)
absy2y3 = abs(y2 - y3)
# 这种情况三点共线,无法生成外接圆
if absy1y2 < EPSION and absy2y3 < EPSION:
return
# 第一种情况, v1和v2基本水平
if absy1y2 < EPSION:
m2 = -(x3-x2)/(y3-y2)
mx2 = (x2+x3)/2
my2 = (y2+y3)/2
xc = (x2+x1)/2
yc = m2 *(xc-mx2) + my2
# 第二种情况: v2和v3基本水平
elif absy2y3 < EPSION:
m1 = -(x2-x1)/(y2-y1)
mx1 = (x1+x2)/2
my1 = (y1+y2)/2
xc = (x2+x3)/2
yc = m1*(xc - mx1) + my1
# 情况三:
else:
m1 = -(x2-x1)/(y2-y1)
m2 = -(x3-x2)/(y3-y2)
mx1 = (x1+x2)/2
mx2 = (x2+x3)/2
my1 = (y1+y2)/2
my2 = (y2+y3)/2
xc = (m1 * mx1 - m2 * mx2 + my2 - my1) / (m1 - m2)
# y1y2 之间差距更大,更不容易出现直线非常靠近垂直的状况,靠近垂直线意味着斜率很大,这样相乘的话误差可能会比较极端
yc = m1*(xc - mx1) + my1 if (absy1y2 > absy2y3) else m2 * (xc - mx2) + my2
dx = x2 - xc
dy = y2 - yc
return Circle(Point(xc, yc), math.sqrt(dx*dx+dy*dy))
产生题图代码: |