min_enclosing_sphere — 3D 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"))

Verwendung

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.

Parameters

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.

Returns

dict

• center: (3,) float64 -- Kugelmittelpunkt (Weltkoordinaten).

• radius: float -- Radius (enthält alle Punkte).

Raises

ValueError

Bei ungültiger Form, nicht endlichen Werten, 0 Punkten oder negativem refine_iters (fail-closed).

Hintergrundwissen (Physik und Konventionen hinter diesem Operator)

• blender_interop — Zusammen mit Blender — Form bauen, mit fullseye messen (Fallstricke: Achsen, Einheiten, Referenzdaten)

Referenzen (Beispieldaten, Literatur)

• 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.

Ausführbare Beispiele (verifizierte Samples, die diesen Operator wirklich aufrufen)

• hull_bounds — py -3.11 examples_3d/hull_bounds.py

Typkompatible Folge-Operatoren (nehmen 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

Gleiche Kategorie (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.