Ваша думка правильна. Перевірка симетрії - відмінна ідея: (гауссова) кривизна - це властива поверхня. Таким чином, обертання сітки не повинно змінювати її. Однак обертання вводять помилку дискретизації - за винятком обертів, кратних на 90 градусів. Тому будь-яке таке обертання повинно зберігати кривизну.
Ми можемо зрозуміти, що відбувається , використовуючи велику користь на першій ідеї диференціального числення: похідні - це межі різницьких коефіцієнтів. Це все, що ми насправді повинні знати.
dxx
має бути дискретним наближенням другої часткової похідної у напрямку x. Це особливе наближення (з безлічі можливих) обчислюється шляхом відбору проб поверхні по горизонтальному трансекту через клітинку. Розташовуючи центральну клітинку в другому рядку та колонці 2, записаному (2,2), трансект проходить через клітинки в (1,2), (2,2) та (3,2).
Уздовж цього трансекта перші похідні апроксимуються за різницевими коефіцієнтами, (* 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
як передбачається , буде дискретним наближенням для другої похідної в у-напрямку. Трансект вертикальний, проходить через клітини в (2,1), (2,2) та (2,3). Формула буде виглядати так само, як для, dxx
але з перенесеними підписниками. Це була б третя формула у питанні - але все одно потрібно розділити на L ^ 2.
Змішане друге часткове похідне, dxy
можна оцінити, відмінивши відмінності двох клітин. Наприклад, перша похідна щодо x у комірці (2,3) (верхній середній осередок, а не центральна комірка!) Може бути оцінена, віднімаючи значення ліворуч, * x13, від значення праворуч, * x33 і ділення на відстань між цими клітинками, 2L. Перша похідна щодо x у комірці (2,1) (нижня середня комірка) оцінюється (* x31 - * x11) / (2L). Їх різниця, поділена на 2 л, оцінює змішане часткове, що дає
dxy = ((*x33 - *x13)/(2L) - (*x31 - *x11)/(2L))/(2L)
= (*x33 - *x13 - *x31 + *x11) / (4 L^2).
Я не дуже впевнений, що розуміється під "загальною" кривизною, але, мабуть, це має бути Гауссова кривизна (яка є добутком основних кривих). Відповідно до рівняння 2.4 Meek & Walton 2000 , рівняння Гаусса виходить діленням dxx * dyy - dxy ^ 2 (зверніть увагу на знак мінус! - це визначальник ) на квадрат норми градієнта поверхні. Таким чином, наведене у питанні повернене значення є не зовсім кривою, але це схоже на заплутане часткове вираження для кривизни Гаусса.
Тоді ми знаходимо шість помилок у коді , більшість з яких є критичними:
dxx потрібно розділити на L ^ 2, а не на 1.
dyy потрібно ділити на L ^ 2, а не на 1.
Знак dxy неправильний. (Це, однак, не впливає на формулу кривизни.)
Формули для dyy та dxy змішуються, як ви зазначаєте.
Відмінний знак відсутній у терміні у зворотному значенні.
Він насправді не обчислює кривизну, а лише чисельник раціонального виразу кривизни.
Як дуже просту перевірку, давайте перевіримо, чи змінена формула повертає розумні значення для горизонтальних розташувань на квадратичних поверхнях. Беручи до уваги таке розташування як джерело системи координат і приймаючи його висоту на нульову висоту, всі такі поверхні мають рівняння форми
elevation = a*x^2 + 2b*x*y + c*y^2.
для постійних a, b і c. З центральним квадратом за координатами (0,0), лівий зліва має координати (-L, 0) тощо. Дев'ять висот
*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: нульова гауссова кривизна правильно визначає площинність цієї поверхні.
Якщо ви спробуєте код у запитанні на цих прикладах, ви виявите, що він завжди отримує помилкове значення.