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 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 के स्रोत।
• 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
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
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.