당신의 추측은 맞습니다. 대칭 검사는 훌륭한 아이디어입니다. (가우스) 곡률은 표면의 고유 속성입니다. 따라서 그리드를 회전해도 변경되지 않아야합니다. 그러나 90 도의 배수로 회전을 제외한 회전은 이산화 오차를 발생시킵니다. 따라서 이러한 회전은 곡률을 유지해야합니다.
미분 미적분학의 첫 번째 아이디어를 활용하여 진행 상황을 이해할 수 있습니다 . 미분은 미분 몫의 한계입니다. 그것이 우리가 정말로 알아야 할 전부입니다.
dxx
x- 방향의 2 차 도함수에 대한 이산 근사값이어야합니다. 이 특정 근사치는 (많은 것들 중에서) 셀을 통한 수평 트랜스 섹트를 따라 표면을 샘플링함으로써 계산됩니다. (2,2)로 쓰여진 행 2와 열 2에서 중앙 셀을 찾은 상태에서 트랜스 펙트는 (1,2), (2,2) 및 (3,2)의 셀을 통과합니다.
이러한 전환을 따라, 제 1 도함수는 그들의 차분 지수, (* x32- * x22) / L 및 (* x22- * x12) / L에 의해 근사된다. 여기서 L은 셀들 사이의 (공통) 거리이다 (명확하게 동일 함 cellSizeAvg
). 이차 미분은 이들의 차이 지수에 의해 얻어지고,
dxx = ((*x32-*x22)/L - (*x22-*x12)/L)/L
= (*x32 - 2 * *x22 + *x12) / L^2.
L ^ 2에 의한 구분에 주목하십시오!
마찬가지로 dyy
된다 되어 Y 방향의 제 2 부분 유도체 이산 근사한다. transect는 수직이며 (2,1), (2,2) 및 (2,3)에서 셀을 통과합니다. 수식은 dxx
아래 첨자가 바뀌었을 때와 동일하게 보입니다 . 그것은 문제 의 세 번째 공식 일 것입니다. 그러나 여전히 L ^ 2로 나눌 필요가 있습니다.
혼합 된 두 번째 부분 도함수는 두 셀의 dxy
차이를 차감하여 추정 할 수 있습니다 . 예를 들어, 셀 (2,3) (중앙 셀이 아닌 맨 위 중간 셀!)에서 x에 대한 첫 번째 미분 값은 오른쪽의 값에서 왼쪽의 값 * x13을 빼서 추정 할 수 있습니다. x33, 그리고 그 세포들 사이의 거리, 2L로 나눔. 셀 (2,1) (하단 중간 셀)에서 x에 대한 1 차 도함수는 (* x31-* x11) / (2L)로 추정됩니다. 2L로 나눈 그들의 차이 는 혼합 부분을 추정하여
dxy = ((*x33 - *x13)/(2L) - (*x31 - *x11)/(2L))/(2L)
= (*x33 - *x13 - *x31 + *x11) / (4 L^2).
"전체"곡률의 의미가 확실하지 않지만 가우시안 곡률 (주 곡률의 곱)이 될 수 있습니다. 따르면 선량 및 월튼 2,000 , 수학 식 2.4은 가우시안 DXY ^ 2 - 곡률있는 Dxx * dyy 나눔으로써 얻어진다 (통지 마이너스 기호! - 이것은 인 결정 ) 표면의 기울기의 놈의 제곱. 따라서 질문에 인용 된 반환 값은 곡률이 아니지만 가우시안 곡률에 대한 엉망 부분 표현처럼 보입니다.
그러면 코드에서 6 개의 오류가 발견 되는데 ,이 중 대부분은 매우 중요합니다.
dxx는 1이 아니라 L ^ 2로 나누어야합니다.
dyy는 1이 아니라 L ^ 2로 나누어야합니다.
dxy의 부호가 잘못되었습니다. (그러나 이것은 곡률 공식에는 영향을 미치지 않습니다.)
dyy와 dxy에 대한 공식은주의하십시오.
반환 값의 용어에 음수 부호가 없습니다.
실제로 곡률을 계산하는 것이 아니라 곡률에 대한 합리적인 표현의 분자 만 계산합니다.
매우 간단한 점검으로 수정 된 수식이 2 차 표면의 수평 위치에 대해 합리적인 값을 반환하는지 확인합니다. 이러한 위치를 좌표계의 원점으로 삼고 높이를 0으로 설정하면 모든 표면의 형태는 다음과 같습니다.
elevation = a*x^2 + 2b*x*y + c*y^2.
상수 a, b 및 c의 경우. 중앙 정사각형이 좌표 (0,0) 인 경우 왼쪽의 좌표는 (-L, 0) 등입니다. 9 개의 표고는
*x13 *x23 *x33 (a-2b+c)L^2, (c)L^2, (a+2b+c)L^2
*x12 *x22 *x32 = (a)L^2, 0, (a)L^2
*x11 *x21 *x31 (a+2b+c)L^2, (c)L^2, (a-2b+c)L^2
수정 된 수식에 따라
dxx = (a*L^2 - 2*0 + a*L^2) / L^2
= 2a;
dxy = ((a+2b+c)L^2 - (a-2b+c)L^2 - (a-2b+c)L^2 + (a+2b+c)L^2)/(4L^2)
= 2b;
dyy = ... [computed as in dxx] ... = 2c.
곡률은 2a * 2c-(2b) ^ 2 = 4 (ac-b ^ 2)로 추정됩니다. (Meek & Walton 공식의 분모는이 경우에 하나입니다.) 이것이 의미가 있습니까? 간단한 a, b 및 c 값을 사용해보십시오.
a = c = 1, b = 0. 이것은 원형 포물면입니다. 가우스 곡률은 양수 여야합니다. 실제로 4 (ac-b ^ 2)의 값은 양수입니다 (4와 같음).
a = c = 0, b = 1 이것은 음의 곡률 표면의 표준 예인 한 장의 안장-새들 입니다. 물론, 4 (ac-b ^ 2) = -4입니다.
a = 1, b = 0, c = -1. 이것은 한 장의 쌍곡선에 대한 또 다른 방정식입니다 (45도 회전). 다시 한번, 4 (ac-b ^ 2) = -4입니다.
a = 1, b = 0, c = 0. 이것은 포물선 모양으로 접힌 평평한 표면입니다. 이제 4 (ac-b ^ 2) = 0 : 제로 가우스 곡률이이 표면의 평탄도를 정확하게 감지합니다.
이 예제에서 질문의 코드를 시도하면 항상 잘못된 값을 얻습니다.