You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

寻找外接圆的算法逻辑问题求助

寻找外接圆的算法逻辑问题求助

嘿,我懂你现在的困扰啦!你用“先找离原点最远的点,再找离这个点最远的点,把这俩当直径端点”的方法求外接圆,确实没法覆盖所有情况——比如如果点集里有个“偏僻”的点,不在这两个最远点的连线为直径的圆里,那这个方法直接就失效了。

咱先拆解下问题:这种方法其实是想找点集的直径(点集中距离最远的两个点),但点集的最小外接圆的直径,不一定等于这个点集直径。举个例子,假设你有三个点:(0,0)、(2,0)、(1,2),这时候最远点对是(0,0)和(1,2)(距离√5≈2.236),或者(2,0)和(1,2)(同样√5),但如果把这俩当直径画圆,圆心在(0.5,1),半径≈1.118,这时候(2,0)到圆心的距离是√((2-0.5)²+(0-1)²)=√3.25≈1.802,比半径大,这个点就不在圆里,显然不对。而真正的最小外接圆应该是以(1,1)为圆心,半径√2≈1.414,能把三个点都包进去。

那该怎么改进呢?给你两个实用的思路:

思路1:逐步验证的暴力优化法

  • 先随便选两个点作为初始直径,画出圆;
  • 遍历所有点,检查每个点是否在圆内(点到圆心的距离≤半径);
  • 如果发现有个点不在圆里,就把这个点和之前的某个点重新组合成新的直径,或者以这个点为圆心、到最远点的距离为半径,再重复验证;
  • 直到所有点都被包含在圆里为止。

思路2:用Welzl算法(高效的最小外接圆算法)

这是专门用来求点集最小外接圆的递归算法,核心逻辑是:

  • 如果点集为空,或者当前圆已经包含所有点,返回当前圆;
  • 随机选一个不在圆内的点p,以p为圆心、半径0作为初始圆;
  • 遍历剩下的点,对每个不在当前圆内的点q,以pq为直径画圆;
  • 再遍历剩下的点,对每个不在当前圆内的点r,求p、q、r三点的外接圆;
  • 递归处理剩下的点集。

这个算法效率很高,适合处理较多点的情况。

另外,你写的point2D类已经很实用了,比如distance方法可以直接用来计算点之间的距离。下面把你提供的代码整理成规范的代码块:

from tkinter import *

class point2D:
    def __init__(self, x=0, y=0):
        self.__x = x
        self.__y = y
    
    def x(self):
        return self.__x
    
    def y(self):
        return self.__y
    
    def setx(self, x):
        self.__x = x
    
    def sety(self, y):
        self.__y = y
    
    def __str__(self):
        return f"({self.__x}, {self.__y})"
    
    def distance(self, other):
        return ((self.__x-other.__x)**2 + (self.__y-other.__y)**2) ** 0.5

class box:
    def __init__(self):
        root = Tk()
        root.title("Bounding Circle")
        width, height = 600, 600
        root.geometry(f"{width}x{height}")
        # 这里可以补充你的画布创建、点集处理、绘图等逻辑
        root.mainloop()

如果需要具体实现Welzl算法的代码片段,我可以再给你补充哦!

备注:内容来源于stack exchange,提问作者Adwaidh Chandran A

火山引擎 最新活动