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²를 최소제곱 피팅 → 제1/제2 기본 형식에서 shape operator의 고윳값을 구하고, 볼록을 양으로 하여 k1 >= k2로 정렬한다.
• 단위는 1/길이(점군의 단위에 의존). 반지름 R의 구라면 k1 = k2 = 1/R, 원기둥은 (1/R, 0), 평면은 0.
• k는 근방 점 수(기본값 25). 클수록 매끄럽고 곡률은 낮게, 작을수록 잡음을 줍는다.
• normals는 (N,3)이며 유한하고 0이 아닌 행이 필수(ValueError). 결정론적.
• 후단: mean_curvature / gaussian_curvature / shape_index(모두 내부에서 같은 계산을 반복한다). shape index와 굽음의 쌍이 필요하면 2개를 (N,2)로 나란히 놓고 curvature_to_shape_index.
• blas_threads_and_memory — 행렬 분해가 느린 이유 — BLAS 스레드·캐시·메모리 배치
• 샘플 데이터 카탈로그(DL URL / 라이선스) —— 2-D 는 skimage.data(BSD/public)+ 합성, 3-D 는 실데이터 소스(Stanford/PDS 등)의 DL 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 연산자 레지스트리. 이 op 노트는 tools/opdocs.py md 가 자동 생성합니다(직접 편집하지 마세요).*
© 2026 Kazufumi Furuse — Fullseye operator documentation. Licensed under Apache-2.0.