あなたの推測は正しいです。 対称性の確認は優れたアイデアです。(ガウス)曲率は表面の固有の特性です。したがって、グリッドを回転しても変更されません。ただし、回転により、90度の倍数の回転を除き、離散化エラーが発生します。したがって、このような回転は曲率を保持する必要があります。
微分計算の最初のアイデアを活用することで、何が起こっているのかを理解できます。微分は差分商の限界です。本当に知る必要があるのはそれだけです。
dxx
は、x方向の2次偏微分の離散近似であると想定されています。この特定の近似値(多くの可能性のうち)は、セルを通る水平トランセクトに沿って表面をサンプリングすることによって計算されます。(2,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
は、y方向の2次偏微分の離散近似であると想定されています。トランセクトは垂直で、(2,1)、(2,2)、および(2,3)のセルを通過します。数式はdxx
、下付き文字が入れ替わったものと同じになります。これが質問の3番目の式になりますが、それでもL ^ 2で割る必要があります。
混合された2次偏微分はdxy
、2つのセルの差を取ることで推定できます。たとえば、セル(2,3)のxに関する1次導関数(中央のセルではなく、上の中央のセル!)は、右側の値*から左側の値* 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).
「総」曲率が何を意味するのかは本当にわかりませんが、おそらくガウス曲率(主曲率の積)を意図したものです。Meek&Walton 2000の式2.4によると、ガウス曲率は、dxx * dyy-dxy ^ 2(マイナス記号に注意してください。これは行列式です)を表面の勾配のノルムの2乗で除算することによって得られます。したがって、質問で引用された戻り値は曲率ではありませんが、ガウス曲率のめちゃくちゃな部分式のように見えます。
その結果、コード内に6つのエラーが見つかりました。それらのほとんどは重大です。
dxxは1ではなくL ^ 2で割る必要があります。
dyyは1ではなくL ^ 2で割る必要があります。
dxyの符号が正しくありません。(ただし、これは曲率公式には影響しません。)
ご指摘のとおり、dyyとdxyの式は混同されています。
戻り値の項に負符号がありません。
実際に曲率を計算するのではなく、曲率の有理式の分子のみを計算します。
非常に簡単なチェックとして、修正された数式が2次曲面上の水平位置に対して妥当な値を返すことを確認しましょう。そのような位置を座標系の原点とし、その標高をゼロの高さにすると、そのような表面はすべて次の形式の方程式を持ちます。
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式の分母は1つです。)これは理にかなっていますか?a、b、およびcのいくつかの単純な値を試してください。
a = c = 1、b =0。これは円形放物面です。そのガウス曲率は正でなければなりません。4(ac-b ^ 2)の値は実際に正(4に等しい)です。
a = c = 0、b =1。これは、1枚のシートの双曲面、つまりサドルです。これは、負の曲率のサーフェスの標準的な例です。案の定、4(ac-b ^ 2)= -4。
a = 1、b = 0、c = -1 これは、1つのシートの双曲面の別の方程式です(45度回転)。もう一度、4(ac-b ^ 2)= -4。
a = 1、b = 0、c =0。これは放物線形状に折り畳まれた平面です。これで、4(ac-b ^ 2)= 0:ゼロのガウス曲率がこの表面の平面度を正しく検出します。
これらの例の質問のコードを試してみると、常に誤った値を取得していることがわかります。