Những phỏng đoán của bạn là chính xác. Kiểm tra tính đối xứng là một ý tưởng tuyệt vời: độ cong (Gaussian) là một tính chất bên trong của một bề mặt. Vì vậy, xoay lưới không nên thay đổi nó. Tuy nhiên, các phép quay giới thiệu lỗi phân tách - ngoại trừ các phép quay theo bội số 90 độ. Do đó, bất kỳ xoay như vậy nên bảo tồn độ cong.
Chúng ta có thể hiểu những gì đang xảy ra bằng cách tận dụng ý tưởng đầu tiên của phép tính vi phân: đạo hàm là giới hạn của chỉ tiêu chênh lệch. Đó là tất cả những gì chúng ta thực sự cần biết.
dxx
được coi là một xấp xỉ rời rạc cho đạo hàm riêng thứ hai theo hướng x. Phép tính gần đúng cụ thể này (trong số nhiều khả năng có thể) được tính bằng cách lấy mẫu bề mặt dọc theo một mặt cắt ngang qua ô. Xác định vị trí ô trung tâm ở hàng 2 và cột 2, được viết (2,2), mặt cắt đi qua các ô tại (1,2), (2,2) và (3,2).
Dọc theo mặt cắt này, các đạo hàm đầu tiên được xấp xỉ bởi các chỉ số chênh lệch của chúng, (* x32- * x22) / L và (* x22- * x12) / L trong đó L là khoảng cách (chung) giữa các ô (hiển nhiên là bằng cellSizeAvg
). Các dẫn xuất thứ hai thu được bằng các chỉ số khác nhau của chúng, mang lại
dxx = ((*x32-*x22)/L - (*x22-*x12)/L)/L
= (*x32 - 2 * *x22 + *x12) / L^2.
Lưu ý cách chia theo L ^ 2!
Tương tự, dyy
được coi là một xấp xỉ rời rạc cho đạo hàm riêng thứ hai theo hướng y. Mặt cắt thẳng đứng, đi qua các ô tại (2.1), (2.2) và (2,3). Công thức sẽ trông giống như đối với dxx
nhưng với các chỉ số được chuyển đổi. Đó sẽ là thứ ba công thức trong câu hỏi - nhưng bạn vẫn cần chia cho L ^ 2.
Đạo hàm riêng thứ hai hỗn hợp dxy
, có thể được ước tính bằng cách tách hai ô khác nhau. Ví dụ, đạo hàm đầu tiên liên quan đến x tại ô (2,3) (ô giữa trên cùng, không phải ô trung tâm!) Có thể được ước tính bằng cách trừ giá trị sang trái của nó, * x13, từ giá trị ở bên phải, * x33 và chia cho khoảng cách giữa các ô đó, 2L. Đạo hàm đầu tiên liên quan đến x tại ô (2.1) (ô giữa dưới) được ước tính bởi (* x31 - * x11) / (2L). Sự khác biệt của chúng , chia cho 2L, ước tính một phần hỗn hợp, cho
dxy = ((*x33 - *x13)/(2L) - (*x31 - *x11)/(2L))/(2L)
= (*x33 - *x13 - *x31 + *x11) / (4 L^2).
Tôi không thực sự chắc chắn ý nghĩa của độ cong "tổng" là gì, nhưng có lẽ nó được dự định là độ cong Gaussian (là sản phẩm của độ cong chính). Theo Meek & Walton 2000 , phương trình 2.4, độ cong Gaussian thu được bằng cách chia dxx * dyy - dxy ^ 2 (chú ý dấu trừ! - đây là một yếu tố quyết định ) theo bình phương của độ dốc của bề mặt. Do đó, giá trị trả về được trích dẫn trong câu hỏi không hoàn toàn là độ cong, nhưng nó trông giống như một biểu thức một phần lộn xộn cho độ cong Gaussian.
Sau đó, chúng tôi tìm thấy sáu lỗi trong mã , hầu hết trong số đó là nghiêm trọng:
dxx cần được chia cho L ^ 2, không phải 1.
dyy cần được chia cho L ^ 2, không phải 1.
Dấu hiệu của dxy là không chính xác. (Tuy nhiên, điều này không ảnh hưởng đến công thức độ cong.)
Các công thức cho dyy và dxy được trộn lẫn, như bạn lưu ý.
Một dấu âm bị thiếu trong một thuật ngữ trong giá trị trả về.
Nó không thực sự tính toán độ cong, mà chỉ tính tử số của biểu thức hợp lý cho độ cong.
Như một kiểm tra rất đơn giản, hãy xác minh rằng công thức đã sửa đổi trả về các giá trị hợp lý cho các vị trí nằm ngang trên các bề mặt bậc hai. Lấy vị trí như vậy làm gốc của hệ tọa độ và lấy độ cao của nó ở độ cao bằng không, tất cả các bề mặt như vậy có phương trình của dạng
elevation = a*x^2 + 2b*x*y + c*y^2.
cho hằng số a, b và c. Với hình vuông trung tâm tại tọa độ (0,0), một bên trái có tọa độ (-L, 0), v.v ... Chín độ cao là
*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
Từ đâu, theo công thức sửa đổi,
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.
Độ cong được ước tính là 2a * 2c - (2b) ^ 2 = 4 (ac - b ^ 2). (Mẫu số trong công thức Meek & Walton là một trong trường hợp này.) Điều này có ý nghĩa không? Hãy thử một số giá trị đơn giản của a, b và c:
a = c = 1, b = 0. Đây là một hình parabol tròn; độ cong Gaussian của nó phải là dương. Giá trị của 4 (ac-b ^ 2) thực sự là dương (bằng 4).
a = c = 0, b = 1. Đây là một hyperboloid của một tấm - yên xe - ví dụ tiêu chuẩn của một bề mặt của độ cong âm . Chắc chắn, 4 (ac-b ^ 2) = -4.
a = 1, b = 0, c = -1. Đây là một phương trình khác của hyperboloid của một tờ (xoay 45 độ). Một lần nữa, 4 (ac-b ^ 2) = -4.
a = 1, b = 0, c = 0. Đây là một mặt phẳng được gấp lại thành hình parabol. Bây giờ, 4 (ac-b ^ 2) = 0: độ cong Gaussian bằng 0 phát hiện chính xác độ phẳng của bề mặt này.
Nếu bạn thử mã trong câu hỏi trên các ví dụ này, bạn sẽ thấy nó luôn nhận được một giá trị sai.