min_enclosing_sphere — 3D bounds op

• 数据种类:points → primitive

• 调用: import fullseye as fs; fs.ledger.min_enclosing_sphere(points, refine_iters: 'int' = 1000) -> 'Dict[str, object]'(要直接调用实现,import hull3d; hull3d.min_enclosing_sphere(points, refine_iters: 'int' = 1000) -> 'Dict[str, object]';从台账取用则 ops3d.get("min_enclosing_sphere"))

用法

点群 (N,3) → 包含全部点的(近似)最小包围球 {center(3), radius}。

与 fit_sphere_3d(球面拟合)或 ransac_sphere / hough_sphere_3d(球检测)不同,本 op 求解包含全部点的最小球(minimum enclosing ball, MEB)。采用 2 段结构,在严格保证“包含全部点”的同时收紧半径:

1. Ritter (1990) 初始化 —— 粗略取最远点对作为初始球,扫描各点,若有点在球外,则 1 次性膨胀为“同时包含该点和现有球”的最小球(膨胀式 new_r=(r+d)/2 / 中心向该点方向前进 (d-r)/(2d))。新球完全包含旧球,因此 1 遍即保证包含全部点。

2. 基于 Bădoiu–Clarkson (2003) core-set 迭代的精化 —— 第 i 次迭代时把中心向最远点 q 靠近 1/(i+2)。单调收敛到真正的最小包围球(收紧半径过大的 Ritter 的漂移)。最后以“到中心的最大距离”确定半径,因此精化后也 必定包含全部点(不会因近似导致半径过小而漏点,偏于安全)。

仅当精化后的中心比 Ritter 能缩小外接半径时才采用(始终不大于 Ritter)。不是真正的最小球(严格解为 Welzl 的随机线性时间法),而是快速的 (1+ε) 近似。

Parameters

points : array_like (N,3)

输入点云(>= 1 个点)。

refine_iters : int

Bădoiu–Clarkson 精化的迭代次数(默认 1000)。0 表示只用 Ritter。

Returns

dict

• center:(3,) float64 —— 球心(世界坐标)。

• radius:float —— 半径(包含全部点)。

Raises

ValueError

形状不正确、非有限、点数为 0,或 refine_iters 为负时(fail-closed)。

背景知识指南(该算子背后的物理与约定)

• blender_interop — 与 Blender 配合使用 —— 在 Blender 中建形、用 fullseye 测量(坐标轴、单位、真值数据的陷阱)

参考(示例数据、文献)

• 示例数据目录(下载 URL / 许可证) —— 2-D 用 skimage.data(BSD/公有领域)加合成图,3-D 给出真实数据源(Stanford/PDS 等)的下载 URL。

• 算子来历与参考文献 —— 该算子族所依据的研究/方法出处。

可运行的示例(实际调用该算子并已验证的样例)

• hull_bounds — py -3.11 examples_3d/hull_bounds.py

类型可衔接的下一个算子(可接受 primitive 作为输入)

fuse_to_voxel · angle_between_lines · angle_between_planes · angle_line_plane · distance_point_plane · distance_point_line · distance_line_line · distance_segment_segment

同类别(bounds)

convex_hull · aabb · obb


*Provenance: hull3d.py — 3D 算子登记表。本条目由 tools/opdocs.py md 自动生成(请勿手工编辑)。*

© 2026 Kazufumi Furuse — Fullseye operator documentation. Licensed under Apache-2.0.