bounds op• Datenarten: points → primitive
• Aufruf: import fullseye as fs; fs.ledger.min_enclosing_sphere(points, refine_iters: 'int' = 1000) -> 'Dict[str, object]' (die Implementierung direkt: import hull3d; hull3d.min_enclosing_sphere(points, refine_iters: 'int' = 1000) -> 'Dict[str, object]'; aus dem Register: ops3d.get("min_enclosing_sphere"))
Punktmenge (N,3) → die (näherungsweise) kleinste umschließende Kugel aller Punkte, {center(3), radius}.
Anders als fit_sphere_3d (Kugelanpassung) oder ransac_sphere / hough_sphere_3d (Kugeldetektion) löst dies die kleinste Kugel, die alle Punkte enthält (minimum enclosing ball, MEB). Ein 2-stufiges Verfahren verkleinert den Radius und hält dabei "alle Punkte enthalten" strikt ein:
1. Ritter (1990) Initialisierung -- grob das am weitesten entfernte Punktpaar als Startkugel nehmen, dann die Punkte durchlaufen; liegt ein Punkt außerhalb der Kugel, 1-mal auf die kleinste Kugel "die sowohl diesen Punkt als auch die bisherige Kugel enthält" vergrößern (Vergrößerung new_r=(r+d)/2 / den Mittelpunkt um (d-r)/(2d) in Richtung des Punkts verschieben). Da die neue Kugel die alte vollständig enthält, garantiert 1 Durchlauf, dass alle Punkte enthalten sind.
2. Verfeinerung durch Bădoiu–Clarkson (2003) Core-Set-Iteration -- in Iteration i den Mittelpunkt um 1/(i+2) zum entferntesten Punkt q hin verschieben. Konvergiert monoton zur wahren minimalen umschließenden Kugel (verkleinert die Drift des Ritter-Radius, der zu groß ist). Zuletzt wird der Radius als "maximaler Abstand vom Mittelpunkt" festgelegt, sodass auch nach der Verfeinerung stets alle Punkte enthalten sind (die Näherung macht den Radius nie zu klein, sodass Punkte herausfallen; sie liegt auf der sicheren Seite).
Der verfeinerte Mittelpunkt wird nur übernommen, wenn er den Umkreisradius gegenüber Ritter verkleinert (also stets <= Ritter). Nicht die wahre minimale Kugel (die exakte Lösung ist Welzls randomisiertes Linearzeitverfahren), sondern eine schnelle (1+ε)-Näherung.
points : array_like (N,3)
Eingabe-Punktwolke (>= 1 Punkt).
refine_iters : int
Anzahl der Iterationen der Bădoiu–Clarkson-Verfeinerung (Standard 1000). 0 bedeutet nur Ritter.
dict
• center: (3,) float64 -- Kugelmittelpunkt (Weltkoordinaten).
• radius: float -- Radius (enthält alle Punkte).
ValueError
Bei ungültiger Form, nicht endlichen Werten, 0 Punkten oder negativem refine_iters (fail-closed).
• blender_interop — Zusammen mit Blender — Form bauen, mit fullseye messen (Fallstricke: Achsen, Einheiten, Referenzdaten)
• Katalog der Beispieldaten (Download-URLs / Lizenzen) — 2-D nutzt skimage.data (BSD/Public Domain) plus synthetische Bilder, 3-D nennt Download-URLs echter Datenquellen (Stanford, PDS, …).
• Herkunft und Literatur der Operatoren — die Quellen der Forschung/Verfahren, auf denen diese Operatorfamilie beruht.
• hull_bounds — py -3.11 examples_3d/hull_bounds.py
primitive als Eingabe)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. Diese Notiz wird von tools/opdocs.py md erzeugt (nicht von Hand bearbeiten).*
© 2026 Kazufumi Furuse — Fullseye operator documentation. Licensed under Apache-2.0.