求平面中若干点的覆盖圆的最小半径
已知平面上有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