【数学】求三角形的外接圆圆心
1. 外心定义
三角形的三条边的垂直平分线一定相交于一点,这点是三角形外接圆圆心,即外心。
证明中垂线相交于一点:
∵XX′,YY′分别是△ABC的BC边与AC边的中垂线,
∴XX′,YY′必相交于一点,设为O(否则,XX′∥YY′,那么∠C必等于180°,这是不可能的).
∵OB=OC,OC=OA,∴OB=OA,
∴O点必在AB的垂直平分线ZZ′上,∴XX′,YY′,ZZ′相交于一点。
2. 求外心
代码:
def triangle_csc(pts): # pts是一个3行2列的二维数组,存储着一个三角形的三个顶点
rows, cols = pts.shape
A = np.bmat([[2 * np.dot(pts, pts.T), np.ones((rows, 1))],
[np.ones((1, rows)), np.zeros((1, 1))]])
# np.bmat从数组建立矩阵, pts.T是转置
b = np.hstack((np.sum(pts * pts, axis=1), np.ones((1))))
# hstack的字母h来自于horizontal,表示两个数组是水平的,hstack((a,b))将把b排在a的右边的意思
x = np.linalg.solve(A, b)
# solve函数有两个参数a和b:a是一个N*N的二维数组,而b是一个长度为N的一维数组;
# solve函数找到一个长度为N的一维数组x,使得a和x的矩阵乘积正好等于b,数组x就是多元一次方程组的解
bary_coords = x[:-1] # 除去x数组的最后一个元素
# tile函数将一个数组重复一定次数形成一个新的数组
# tile(a,(m,n)):即是把a数组里面的元素复制n次放进一个数组c中,然后再把数组c复制m次放进数组b
# np.sum(arr, axis=0), 表示按列相加 (axis=1表示按行相加)
return np.sum(pts * np.tile(bary_coords.reshape((pts.shape[0], 1)), (1, pts.shape[1])), axis=0)
if __name__ == "__main__":
tri = [[[1. 0. ],[1. 0.8],[0. 0. ]],
[[1. 0.8], [0. 1. ], [0. 0. ]]]
triangle_csc(tri)
3. 外心直推公式
python代码和上述直推公式都不直观,下面给一个更直观的构造方式