detect_reflection_symmetry — 3D symmetry op

• Data kinds: points → primitive

• Call: import fullseye as fs; fs.ledger.detect_reflection_symmetry(points) (implementation को सीधे call करना हो तो import symmetry3d; symmetry3d.detect_reflection_symmetry(points), registry से लेना हो तो ops3d.get("detect_reflection_symmetry"))

उपयोग

PCA principal axes को normal मानने वाले candidate planes (centroid से गुज़रते) में से सबसे अच्छा reflection symmetry plane चुनता है।

→ dict{plane_point, plane_normal, score, all_scores, margin}। score जितना छोटा, उतना अधिक symmetric।

★ केवल score से स्वीकार/अस्वीकार तय न करें। margin देखें (2026-09-06 को जोड़ा गया)। margin 2nd और 1st स्थान के score का अंतर है: candidates एक-दूसरे के पास गुच्छे में हों तो उत्तर लॉटरी है — यही इसकी चेतावनी है। मापा गया (1500 points):

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

आकार best 2nd margin

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

box (3 mirror planes) 0.9397 0.9499 0.0102

prism वाला box 0.9876 0.9918 0.0043

sphere 1.0490 1.0551 0.0062

uniform random cube 1.0608 1.3435 0.2828

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

जिस आकार में जितने अधिक symmetry planes हों, margin उतना छोटा होता है; यह bug नहीं, बल्कि यह जानकारी है कि आकार ही ऐसा है। point cloud registration का PoC यही संरचना मापता है: PCA के candidates साधारण cuboid पर 83 % बार उलटा quadrant पकड़ते हैं, और उस समय पहले जो ढहता है वह residual नहीं, बल्कि candidates के बीच का margin था (0.42 → 0.066 → 0.039)। residual से नहीं, margin से स्वीकार/अस्वीकार देखें — यही दोनों का साझा निष्कर्ष है।

★ score 0 के पास नहीं पहुँचता। पूरी तरह symmetric आकार में भी points की दूरी एक निचली सीमा बनाती है (ऊपर की table में box 0.94 पर है)। "क्या यह 0 के पास है" के बजाय "उसी आकार को mirror किए बिना मापा गया मान" या "point spacing" से तुलना करें।

★ candidates केवल PCA के 3 axes हैं। जिस आकार का असली symmetry plane किसी भी principal axis से मेल नहीं खाता, उसमें यह नहीं मिलता, और फिर भी चुपचाप 3 में से सबसे अच्छा लौटाता है। घने रूप से फैलाए गए candidates चाहिए हों तो reflection_symmetry_score को सीधे sweep करें।

संदर्भ (sample data, साहित्य)

• Sample data catalog (DL URL / license) — 2-D के लिए skimage.data (BSD/public) + synthetic, 3-D के लिए real data sources (Stanford/PDS आदि) के DL URL।

• Operators का स्रोत और संदर्भ — इस op family के मूल research/methods के स्रोत।

चलाए जा सकने वाले उदाहरण (verified samples जो सच में यह op call करते हैं)

• 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

वे अगले ops जिनसे type जुड़ता है (primitive को 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

इसी category के (symmetry)

detect_rotational_symmetry · reflect_points · reflection_symmetry_score


*Provenance: symmetry3d.py — 3D operator registry. यह per-op note tools/opdocs.py md से अपने-आप generate होता है (हाथ से edit न करें)।*

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