detect_reflection_symmetry — 3D symmetry op

• Datenarten: points → primitive

• Aufruf: import fullseye as fs; fs.ledger.detect_reflection_symmetry(points) (die Implementierung direkt: import symmetry3d; symmetry3d.detect_reflection_symmetry(points); aus dem Register: ops3d.get("detect_reflection_symmetry"))

Verwendung

Wählt die beste Spiegelsymmetrieebene unter Kandidaten, deren Normalen die PCA-Hauptachsen sind (durch den Schwerpunkt).

→ dict{plane_point, plane_normal, score, all_scores, margin}. Je kleiner der score, desto symmetrischer.

★ Nicht allein anhand von score über Annahme entscheiden. margin ansehen (ergänzt am 2026-09-06). margin ist die Differenz der scores von Platz 2 und Platz 1 und warnt: liegen die Kandidaten dicht beieinander, ist die Antwort ein Losentscheid (so die Warnung). Gemessen (1500 Punkte):

========================== ======== ======== =========

Form best Platz 2 margin

========================== ======== ======== =========

Box (3 Spiegelebenen) 0.9397 0.9499 0.0102

Box mit Prisma 0.9876 0.9918 0.0043

Kugel 1.0490 1.0551 0.0062

Gleichverteilter Würfel 1.0608 1.3435 0.2828

========================== ======== ======== =========

Je mehr Symmetrieebenen eine Form hat, desto kleiner ist margin; das ist kein Fehler, sondern die Information, dass die Form eben so ist. Ein PoC zur Punktwolken-Registrierung misst dieselbe Struktur: Die PCA- Kandidaten greifen bei einem einfachen Quader zu 83 % einen gespiegelten Quadranten, und was dabei zuerst kollabiert, ist nicht das Residuum, sondern die margin zwischen den Kandidaten (0.42 → 0.066 → 0.039). Annahme nach margin statt nach dem Residuum beurteilen ist das gemeinsame Fazit beider.

★ score nähert sich nicht 0. Selbst bei einer exakt symmetrischen Form bildet der Punktabstand eine Untergrenze (in der Tabelle oben liegt die Box bei 0.94). Statt "liegt er nahe 0" vergleiche man mit "dem Wert, der an derselben Form ohne Spiegelung gemessen wurde" oder mit "dem Punktabstand".

★ Kandidaten sind nur die 3 PCA-Achsen. Bei einer Form, deren wahre Symmetrieebene mit keiner Hauptachse übereinstimmt, wird sie nicht gefunden, und trotzdem wird stillschweigend die beste der 3 zurückgegeben. Werden dicht gestreute Kandidaten benötigt, reflection_symmetry_score direkt durchlaufen (Sweep).

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)

• dl_mesh_symmetry — py -3.11 examples_3d/dl_mesh_symmetry.py

• itokawa_symmetry_honest — py -3.11 examples_3d/itokawa_symmetry_honest.py

• reflection_symmetry — py -3.11 examples_3d/reflection_symmetry.py

• symmetry — py -3.11 examples_3d/symmetry.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 (symmetry)

detect_rotational_symmetry · reflect_points · reflection_symmetry_score


*Provenance: symmetry3d.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.