principal_curvatures — 3D 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 를 입력으로 받는 것)

fuse_to_voxel

같은 카테고리(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.