【数学】求三角形的外接圆圆心

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代码和上述直推公式都不直观,下面给一个更直观的构造方式

原理:

【数学】求三角形的外接圆圆心

根据直推公式写出C语言代码:

【数学】求三角形的外接圆圆心