Python 找到适合给定起点的一组点的最大圆(numpy)

Python 找到适合给定起点的一组点的最大圆(numpy),python,numpy,geometry,linear-algebra,computational-geometry,Python,Numpy,Geometry,Linear Algebra,Computational Geometry,给定一个起点(82186)和一组周围点[(105186)、(95157)、(81159)、(64173)、(52188)、(127195)],我如何确定适合这些点的最大圆 注意:中心不必是起点 cX, cY = (82, 186) points = [(105, 186), (95, 157), (81, 159), (64, 173), (52, 188), (127, 195)] def closest_node(node, nodes): nodes = np.asarray(n

给定一个起点
(82186)
和一组周围点
[(105186)、(95157)、(81159)、(64173)、(52188)、(127195)]
,我如何确定适合这些点的最大圆

注意:中心不必是起点

cX, cY = (82, 186)
points = [(105, 186), (95, 157), (81, 159), (64, 173), (52, 188), (127, 195)]

def closest_node(node, nodes):
    nodes = np.asarray(nodes)
    deltas = nodes - node
    dist = np.linalg.norm(deltas, axis=1)
    min_idx = np.argmin(dist)
    return nodes[min_idx], dist[min_idx], deltas[min_idx][1]/deltas[min_idx][0]  # point, distance, slope

(pX, pY), d, m = closest_node((cX, cY), points)
cv2.circle(img, (cX, cY), int(d), (255, 0, 255), 1)  # circle with center C, touching point P

# learning rate
a = 0.2

# sign for direction
sX = 1 if cX - pX > 0 else -1
sY = 1 if cY - pY > 0 else -1

dx = (d * a) * np.sqrt(1 / (1 + m**2))

# New center
nX = cX + sX * dx
nY = cY + sY * m * dx
cv2.circle(img, (int(nX), int(nY)), int(d + (d * a)), [0, 0, 0], 1)
因此,我试图迭代地接近第二点(然后是第三点),但我认为如果有一个矢量化方法会更好。我该怎么做

编辑:使用Voronoi的解决方案

from scipy.spatial import Voronoi

points = np.array(points)

if len(points) >= 4:

    vor = Voronoi(points)

    max_d = 0
    max_v = None
    for v in vor.vertices:
        cv2.circle(img, (int(v[0]), int(v[1])), 3, [200, 200, 0], 1)
        _, d, _ = closest_node(v, points)
        if d > max_d:
            max_d = d
            max_v = v

    cv2.circle(img, (int(max_v[0]), int(max_v[1])), int(max_d), [0, 0, 0], 1)

这是一个查找点云的问题(其中心位于点云的凸包内)

它在O(nlogn)时间内使用Voronoi图


对于python-scipy包含

如果不是中心,那么起点是什么?还有一点吗?如果是,为什么不在清单上?如果它不是中心,为什么叫它
cx
cy
?你的意思是找到包含所有点的最小圆吗?因为否则你总能在远离所有点的地方找到一个更大的圆圈…@Julien我刚试过你的答案。。。不错,但我要找的是下面建议的最大内接圆,而不是最小的封闭圆:)这是定义不明确的,除非您明确指定所需解如何绑定到起点。它不绑定到起点,但我恰好知道,起点将在包含最大圆环的区域内,我将给它一个效果相当好的快照,尽管有时它会选择一个位于区域外的圆作为我的“起点”。有什么方法可以限制这一点,或者我应该用我的“起点”做一个“圈内”测试吗?也许你可以检查一下Voronoi单元格包含的起点并选择它