shape_index — 3D curvature op

• Datenarten: points → descriptor

• Aufruf: import fullseye as fs; fs.ledger.shape_index(points, k=25, normals=None) (die Implementierung direkt: import curvature3d; curvature3d.shape_index(points, k=25, normals=None); aus dem Register: ops3d.get("shape_index"))

Verwendung

Koenderinks Formindex s∈[-1,1] (konvexe Kugel +1, Zylinder +0,5, Sattel 0, konkave Kugel −1). → (N,).

Die Nabelpunkt/Ebene-Entscheidung ist relativ zur Krümmungsskala (kein absoluter Schwellwert). Sanfte konvexe/konkave Bereiche (auch bei winziger Krümmung) behalten ihr Vorzeichen = konkav/konvex, und nur Punkte, deren Krümmung relativ zur Krümmungsskala der gesamten Daten 0 ist, erhalten als Ebene s=0.

normals (orientierte Referenznormalen, (N,3)): ohne Angabe ist das Konkav/Konvex-Vorzeichen einer offenen Fläche unbestimmt (als konvexe Magnitude gemeldet). Werden orientierte Normalen übergeben, richtet sich das Ergebnis nach der globalen Orientierung und liefert das korrekte Vorzeichen (konkave Kugel = cup → -1).

Berechnung (pro Punkt, derselbe Fit wie bei principal_curvatures):

• Ebenentest: Ist die curvedness sqrt((k1² + k2²) / 2) kleiner als der Median der curvedness aller Punkte × 1e-3, dann s = 0. Ist der Median 0 (kein Krümmungssignal), sind alle Punkte 0.

• Nabelpunkttest: Wenn |k1 - k2| < 1e-2 × (|k1| + |k2|), dann s = sign(k1 + k2) (exakt ±1).

• Sonst: s = (2/π) · arctan((k1 + k2) / (k1 - k2)).

• Der Schwellwert ist nicht absolut, sondern relativ zur Krümmungsskala der gesamten Daten; daher ändert sich selbst bei gleicher Form, welche Punkte als eben gelten, je nachdem, wie sie mit anderen Punkten gemischt sind. Für die Klassifikation einer einzelnen Punktwolke gedacht.

• Punkte mit weniger als 5 Nachbarn erhalten k1 = k2 = 0 → Ebene (0). k wird auf N-1 gekürzt.

• normals muss (N,3) mit endlichen, von null verschiedenen Zeilen sein (ValueError). Ohne Angabe ist das Vorzeichen einer offenen Fläche unbestimmt (konvexe Seite).

• Die Stärke der Biegung ist nicht enthalten. Wird auch die Stärke benötigt, stapelt man die 2 Werte von principal_curvatures zu (N,2) und gibt sie an curvature_to_shape_index.

Hintergrundwissen (Physik und Konventionen hinter diesem Operator)

• blas_threads_and_memory — Warum Matrixzerlegungen langsam sind — BLAS-Threads, Caches, Speicherlayout

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)

• curvature_grasp — py -3.11 examples_3d/curvature_grasp.py

• itokawa_curvature — py -3.11 examples_3d/itokawa_curvature.py

Typkompatible Folge-Operatoren (nehmen descriptor als Eingabe)

fuse_to_voxel · shape_distance

Gleiche Kategorie (curvature)

principal_curvatures · mean_curvature · gaussian_curvature · estimate_normals


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