bounds op• Data kinds: points → primitive
• Call: import fullseye as fs; fs.ledger.min_enclosing_sphere(points, refine_iters: 'int' = 1000) -> 'Dict[str, object]' (to call the implementation directly, import hull3d; hull3d.min_enclosing_sphere(points, refine_iters: 'int' = 1000) -> 'Dict[str, object]'; from the registry, ops3d.get("min_enclosing_sphere"))
Point set (N,3) → the (approximate) minimum enclosing sphere containing every point, {center(3), radius}.
Unlike fit_sphere_3d (sphere fitting) or ransac_sphere / hough_sphere_3d (sphere detection), this solves for the smallest sphere containing all points (minimum enclosing ball, MEB). A 2-stage scheme tightens the radius while strictly keeping "all points enclosed":
1. Ritter (1990) initialization -- roughly take the farthest point pair as the initial sphere, then scan the points; whenever a point lies outside the sphere, grow 1 time to the smallest sphere "containing both that point and the existing sphere" (growth new_r=(r+d)/2 / move the center toward the point by (d-r)/(2d)). Since the new sphere fully contains the old one, 1 pass guarantees that all points are enclosed.
2. Refinement by Bădoiu–Clarkson (2003) core-set iteration -- at iteration i, move the center toward the farthest point q by 1/(i+2). It converges monotonically to the true minimum enclosing sphere (tightening the drift of Ritter, whose radius is too large). Finally the radius is fixed as "the maximum distance from the center", so even after refinement it always encloses all points (being an approximation never makes the radius too small and lets points leak out; it errs on the safe side).
The refined center is adopted only when it shrinks the circumscribed radius below Ritter's (so it is always <= Ritter). It is not the true minimum sphere (the exact solution is Welzl's randomized linear-time method) but a fast (1+ε) approximation.
points : array_like (N,3)
Input point cloud (>= 1 point).
refine_iters : int
Number of Bădoiu–Clarkson refinement iterations (default 1000). 0 means Ritter only.
dict
• center: (3,) float64 -- sphere center (world coordinates).
• radius: float -- radius (encloses all points).
ValueError
When the shape is invalid, values are non-finite, the point count is 0, or refine_iters is negative (fail-closed).
• blender_interop — Using Blender alongside — build the shape, measure it with fullseye (pitfalls: axes, units, ground truth)
• Sample-data catalog (download URLs / licences) — 2-D uses skimage.data (BSD/public domain) plus synthetic images; 3-D lists download URLs for real data sources (Stanford, PDS, …).
• Operator provenance and references — the sources of the research/methods this op family came from.
• hull_bounds — py -3.11 examples_3d/hull_bounds.py
primitive as input)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 operator registry. This per-op note is generated by tools/opdocs.py md (do not hand-edit).*
© 2026 Kazufumi Furuse — Fullseye operator documentation. Licensed under Apache-2.0.