本算法实现了给定点集 求出能够覆盖所有点的最小圆
最小覆盖圆算法
Python版
前置算法
1.检验算法
1 | def jc(p, r, c): |
算法使用两点距离公式求取点到圆心距离 然后与半径比较 判断点是否在目标圆内
2.二点生成圆
1 | def y2(p1, p2): |
二点生成圆算法十分简单 两点连线中点就是圆心 连线长度就是直径
3.三点生成圆
1 | def solfun(a, b, c, d, e, f): |
分为两个部分 第一部分solfun()求取形似
$$
ax+by=e\
cx+dy=f
$$
方程的解
第二部分使用公式
公式推导
首先假设所求圆心为$x_0,y_0$ 半径为r 得
$$
(x_1-x_0)^2+(y_1-y_0)^2=r^2①\
(x_2-x_0)^2+(y_2-y_0)^2=r^2②\
(x_3-x_0)^2+(y_3-y_0)^2=r^2③
$$
展开后③式-②式 ②式-①式
$$
\frac{x_2^2-x_1^2+y_2^2-y_1^2}2=(x_2-x_1)x_0+(y_2-y_1)y_0\
\frac{x_3^2-x_2^2+y_3^2-y_2^2}2=(x_3-x_2)x_0+(y_3-y_2)y_0
$$
求出abcdef参数 并带入公式求解
得到圆心 再与任一点求距离 得半径
主函数
1 | def main(): |
2-8行生成一个随机点数列
11行对数列随机排序
13-29行为主要逻辑
分析
使用p1遍历a中所有点 如果发现某点p1不在当前圆中 说明p1在p1之前的点中一定是边点
接着重新遍历p1之前的点 如果发现某点p2不在当前圆中 说明p2在p2之前的点中一定是第二个边点
接着重新遍历p2之前的点 如果发现某点p3不在当前圆中 说明p3在p3之前的点中一定是第三个边点
以上三种情况 如果发现搜索点在当前圆中 则直接跳过
直到遍历完成 寻找到三个或两个边点和一个最小圆