curvature op• 資料種類:points → curvature
• 呼叫: import fullseye as fs; fs.ledger.principal_curvatures(points, k=25, normals=None)(要直接呼叫實作,import curvature3d; curvature3d.principal_curvatures(points, k=25, normals=None);從台帳取用則 ops3d.get("principal_curvatures"))
各點的主曲率 (k1>=k2)。→ (k1 (N,), k2 (N,))。
未指定 normals(有向參考法線,(N,3))時為凸側幅值(開放曲面的凹/凸正負號不定)。傳入有向法線則與全域方向一致,得到正確的正負號(凹=負,凸=正)。
步驟(每個點,Python 迴圈):
• 以 cKDTree 取包含自身的 k+1 個鄰域點(k 截斷為 N-1)。鄰域少於 5 個點時回傳 k1 = k2 = 0(因為無法建構 5 係數的二次曲面)。
• 把鄰域座標平移到以查詢點為原點,取 local.T @ local 的最小特徵向量作為法線(若有 normals 則方向與之一致,否則取遠離鄰域質心的一側)。
• 投影到切線基底 (t1, t2) 上,對 w = d·u + e·v + a·u² + b·uv + c·v² 做最小平方擬合 → 由第一/第二基本形式求 shape operator 的特徵值,使凸為正,並依 k1 >= k2 排列。
• 單位為 1/長度(取決於點雲的單位)。半徑 R 的球為 k1 = k2 = 1/R,圓柱為 (1/R, 0),平面為 0。
• k 是鄰域點數(預設 25)。越大越平滑、曲率偏低,越小越容易拾取雜訊。
• normals 必須為 (N,3),有限且列非零(ValueError)。決定性。
• 後續:mean_curvature / gaussian_curvature / shape_index(皆在內部重複同樣的計算)。需要 shape index 與彎曲度這一對時,把 2 個並排成 (N,2) 用 curvature_to_shape_index。
• blas_threads_and_memory — 矩陣分解為何慢 —— BLAS 執行緒、快取、記憶體配置
• 範例資料目錄(下載 URL / 授權) —— 2-D 用 skimage.data(BSD/公有領域)加合成圖,3-D 給出真實資料源(Stanford/PDS 等)的下載 URL。
• 運算子來歷與參考文獻 —— 該運算子族所依據的研究/方法出處。
• 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 作為輸入)curvature)mean_curvature · gaussian_curvature · shape_index · estimate_normals
*Provenance: curvature3d.py — 3D 運算子登記表。本條目由 tools/opdocs.py md 自動產生(請勿手動編輯)。*
© 2026 Kazufumi Furuse — Fullseye operator documentation. Licensed under Apache-2.0.