Le tue ipotesi sono corrette. Controllare la simmetria è un'idea eccellente: la curvatura (gaussiana) è una proprietà intrinseca di una superficie. Pertanto, la rotazione di una griglia non dovrebbe modificarla. Tuttavia, le rotazioni introducono errori di discretizzazione, ad eccezione delle rotazioni per multipli di 90 gradi. Pertanto, tale rotazione dovrebbe preservare la curvatura.
Possiamo capire cosa sta succedendo capitalizzando la primissima idea del calcolo differenziale: i derivati sono limiti dei quozienti di differenza. Questo è tutto ciò che dobbiamo davvero sapere.
dxx
dovrebbe essere un'approssimazione discreta per la seconda derivata parziale nella direzione x. Questa particolare approssimazione (tra le tante possibili) viene calcolata campionando la superficie lungo un transetto orizzontale attraverso la cellula. Individuando la cella centrale nella riga 2 e nella colonna 2, scritta (2,2), il transetto passa attraverso le celle in (1,2), (2,2) e (3,2).
Lungo questo transetto, i primi derivati sono approssimati dai loro quozienti di differenza, (* x32- * x22) / L e (* x22- * x12) / L dove L è la distanza (comune) tra le cellule (evidentemente uguale a cellSizeAvg
). I secondi derivati sono ottenuti dai quozienti di differenza di questi, cedendo
dxx = ((*x32-*x22)/L - (*x22-*x12)/L)/L
= (*x32 - 2 * *x22 + *x12) / L^2.
Notare la divisione per L ^ 2!
Allo stesso modo, dyy
si suppone che rappresenti un'approssimazione discreta per la seconda derivata parziale nella direzione y. Il transetto è verticale, passando attraverso le celle in (2,1), (2,2) e (2,3). La formula sarà identica a quella per dxx
ma con gli script trasposti. Questa sarebbe la terza formula nella domanda - ma devi ancora dividere per L ^ 2.
Il secondo derivato parziale misto dxy
, può essere stimato prendendo le differenze tra due celle. Ad esempio, la prima derivata rispetto a x nella cella (2,3) (la cella centrale superiore, non la cella centrale!) Può essere stimata sottraendo il valore alla sua sinistra, * x13, dal valore alla sua destra, * x33, e dividendo per la distanza tra quelle cellule, 2L. La prima derivata rispetto a x nella cella (2,1) (la cella centrale inferiore) è stimata da (* x31 - * x11) / (2L). La loro differenza, divisa per 2L, stima il parziale misto, dando
dxy = ((*x33 - *x13)/(2L) - (*x31 - *x11)/(2L))/(2L)
= (*x33 - *x13 - *x31 + *x11) / (4 L^2).
Non sono davvero sicuro di cosa si intenda per curvatura "totale", ma probabilmente è intesa come la curvatura gaussiana (che è il prodotto delle curvature principali). Secondo Meek & Walton 2000 , Equazione 2.4, la curvatura gaussiana si ottiene dividendo dxx * dyy - dxy ^ 2 (notare il segno meno! - questo è un fattore determinante ) per il quadrato della norma del gradiente della superficie. Pertanto, il valore di ritorno indicato nella domanda non è del tutto una curvatura, ma sembra un'espressione parziale incasinata per la curvatura gaussiana.
Troviamo, quindi, sei errori nel codice , molti dei quali critici:
dxx deve essere diviso per L ^ 2, non 1.
il dyy deve essere diviso per L ^ 2, non 1.
Il segno di dxy non è corretto. (Questo non ha alcun effetto sulla formula di curvatura, però.)
Le formule per dyy e dxy sono confuse, come si nota.
Manca un segno negativo da un termine nel valore restituito.
In realtà non calcola una curvatura, ma solo il numeratore di un'espressione razionale per la curvatura.
Come controllo molto semplice, verifichiamo che la formula modificata restituisca valori ragionevoli per posizioni orizzontali su superfici quadratiche. Prendendo una tale posizione per essere l'origine del sistema di coordinate e prendendo la sua elevazione per essere ad altezza zero, tutte queste superfici hanno equazioni della forma
elevation = a*x^2 + 2b*x*y + c*y^2.
per costante a, b e c. Con il quadrato centrale alle coordinate (0,0), quello alla sua sinistra ha coordinate (-L, 0), ecc. Le nove quote sono
*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
Da cui, con la formula modificata,
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.
La curvatura è stimata come 2a * 2c - (2b) ^ 2 = 4 (ac - b ^ 2). (Il denominatore nella formula Meek & Walton è uno in questo caso.) Ha senso? Prova alcuni semplici valori di a, b e c:
a = c = 1, b = 0. Questo è un paraboloide circolare; la sua curvatura gaussiana dovrebbe essere positiva. Il valore di 4 (ac-b ^ 2) è effettivamente positivo (uguale a 4).
a = c = 0, b = 1. Questo è un iperboloide di un foglio - una sella - l'esempio standard di una superficie di curvatura negativa . Abbastanza sicuro, 4 (ac-b ^ 2) = -4.
a = 1, b = 0, c = -1. Questa è un'altra equazione dell'iperboloide di un foglio (ruotata di 45 gradi). Ancora una volta, 4 (ac-b ^ 2) = -4.
a = 1, b = 0, c = 0. Questa è una superficie piana piegata in una forma parabolica. Ora, 4 (ac-b ^ 2) = 0: la curvatura gaussiana zero rileva correttamente la planarità di questa superficie.
Se provi il codice nella domanda su questi esempi, scoprirai che ottiene sempre un valore errato.