curvature op• Data kinds: points → curvature
• Call: import fullseye as fs; fs.ledger.principal_curvatures(points, k=25, normals=None) (to call the implementation directly, import curvature3d; curvature3d.principal_curvatures(points, k=25, normals=None); from the registry, ops3d.get("principal_curvatures"))
The principal curvatures at each point (k1 >= k2). → (k1 (N,), k2 (N,)).
When normals (oriented reference normals, (N,3)) is not given: convex-side magnitude (the concave/convex sign of an open surface is indeterminate). Passing oriented normals makes it consistent with the global orientation and gives the correct sign (concave = negative, convex = positive).
Procedure (per point, Python loop):
• Take the k+1 neighbours including itself with cKDTree (k is clipped to N-1). If there are fewer than 5 neighbours, return k1 = k2 = 0 (a quadric with 5 coefficients cannot be built).
• Translate the neighbour coordinates so the query point is the origin, and take the smallest eigenvector of local.T @ local as the normal (its orientation follows normals if given, otherwise the side away from the neighbour centroid).
• Project onto the tangent basis (t1, t2) and least-squares fit w = d·u + e·v + a·u² + b·uv + c·v² → take the eigenvalues of the shape operator from the first/second fundamental forms, make convex positive, and order them as k1 >= k2.
• The unit is 1/length (depends on the unit of the point cloud). For a sphere of radius R, k1 = k2 = 1/R; a cylinder gives (1/R, 0), a plane 0.
• k is the number of neighbours (default 25). Larger is smoother with lower curvature, smaller picks up noise.
• normals must be (N,3), finite and with non-zero rows (ValueError). Deterministic.
• Downstream: mean_curvature / gaussian_curvature / shape_index (each repeats the same computation internally). If you need the pair of shape index and curvedness, put the 2 side by side as (N,2) and use curvature_to_shape_index.
• blas_threads_and_memory — Why matrix decompositions are slow — BLAS threads, caches, memory layout
• Sample-data catalog (download URLs / licences) — 2-D uses skimage.data (BSD/public domain) plus synthetic images; 3-D lists download URLs for real data sources (Stanford, PDS, …).
• Operator provenance and references — the sources of the research/methods this op family came from.
• curvature_grasp — py -3.11 examples_3d/curvature_grasp.py
• itokawa_curvature — py -3.11 examples_3d/itokawa_curvature.py
• minimal_surfaces — py -3.11 examples_3d/minimal_surfaces.py
curvature as input)curvature)mean_curvature · gaussian_curvature · shape_index · estimate_normals
*Provenance: curvature3d.py — 3D operator registry. This per-op note is generated by tools/opdocs.py md (do not hand-edit).*
© 2026 Kazufumi Furuse — Fullseye operator documentation. Licensed under Apache-2.0.