编程心得

95 篇文章 2 订阅

求平面中若干点的覆盖圆的最小半径

已知平面上有6个点的坐标为:(7, 1), (4, 6), (5, 8), (6, 2), (3, 9), (2, 7)。
试求覆盖这6个点的覆盖圆的最小半径。
解题思路:
遍历任意三个点的所有组合
确定三个点的关系:共线、直角三角形、钝角三角形、锐角三角形
如果是共线、直角三角形、钝角三角形,最小覆盖圆的半径为最远两个点的距离之半或三角形最大边长的一半;如果是锐角三角形,最小覆盖圆的半径为三角形外接圆半径
根据荣格定理,在上述最小覆盖圆半径中的最大值就是所有这些点的覆盖圆的最小半径

point_list = [[7, 1], [4, 6], [5, 8], [6, 2], [3, 9], [2, 7]]


def triangle_type(p1, p2, p3):
    # 判断是否共线
    mark = 0  # 不共线
    if p1[0] == p2[0] and p1[0] == p3[0]:
        mark = 1  # 共线
    elif p1[0] == p2[0] or p1[0] == p3[0]:
        mark = 0
    elif (p1[1] - p2[1]) / (p1[0] - p2[0]) == (p1[1] - p3[1]) / (p1[0] - p3[0]):
        '''斜率相同共线'''
        mark = 1
    dis_squared12 = (p1[0] - p2[0]) ** 2 + (p1[1] - p2[1]) ** 2
    dis_squared13 = (p1[0] - p3[0]) ** 2 + (p1[1] - p3[1]) ** 2
    dis_squared23 = (p2[0] - p3[0]) ** 2 + (p2[1] - p3[1]) ** 2
    dis_squared = [dis_squared12, dis_squared13, dis_squared23]
    dis_squared = sorted(dis_squared)
    if mark == 1 or dis_squared[2] >= dis_squared[0] + dis_squared[1]:
        '''满足三点共线或直角三角形或钝角三角形条件'''
        radius = math.sqrt(dis_squared[-1]) / 2
    else:
        '''满足锐角三角形条件'''
        a = math.sqrt(dis_squared[0])
        b = math.sqrt(dis_squared[1])
        c = math.sqrt(dis_squared[2])
        p = (a + b + c) / 2
        radius = (a * b * c) / (4 * math.sqrt(p * (p - a) * (p - b) * (p - c)))
    return radius


if __name__ == '__main__':
    import math
    result = []
    length = len(point_list)
    for i in range(length - 2):
        for j in range(i + 1, length - 1):
            for k in range(j + 1, length):
                result.append(triangle_type(point_list[i], point_list[j], point_list[k]))
    print(max(result))
D:\Python\study\venv\Scripts\python.exe D:/Python/study/test18.py
4.47213595499958

Process finished with exit code 0
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值