在上一篇(楊超:由高度場求法線)中推導了由高度場求法線的公式為:

N=normalize(-grad+up)

然後有人問反過來怎麼求,即:已知法線,反推高度場。

第一感覺是豈不涉及到偏微分方程了,超出了我這工科數學水平。。。

但試了一下發現,由於問題的特殊性是可以解出的,結果如下:

y(x,z)=\int{\frac{-N_x}{N_y}dx}+\int{\frac{-N_z}{N_y}}dz-\int{\frac{d(\int{\frac{-N_x}{N_y}dx})}{dz}dz}+C

其中

N_x,N_y,N_z

為法線分量,C為常數

下面是推導過程和例項檢驗。

一,推導過程:

因為

grad=(\frac{dy}{dx},0,\frac{dy}{dz})

up=(0,1,0)

所以

N=normalize((-\frac{dy}{dx},1,-\frac{dy}{dz}))

=\frac{(-\frac{dy}{dx},1,-\frac{dy}{dz})}{\sqrt{(\frac{dy}{dx})^2+1+(\frac{dy}{dz})^2}}

(令

L=\sqrt{(\frac{dy}{dx})^2+1+(\frac{dy}{dz})^2}

,則)

=\frac{(-\frac{dy}{dx},1,-\frac{dy}{dz})}{L}

寫成分量形式即:

\left\{\begin{matrix} N_x=\frac{(-\frac{dy}{dx})}{L}& \\  N_y=\frac{1}{L} & \\  N_x=\frac{(-\frac{dy}{dz})}{L} &  \end{matrix}\right.

得:

\left\{\begin{matrix} \frac{dy}{dx}=\frac{-N_x}{N_y} & \\  \frac{dy}{dz}=\frac{-N_z}{N_y} &  \end{matrix}\right.

因為

(\frac{dy}{dx},0,\frac{dy}{dz})

即梯度,於是問題就轉化成了已知梯度求原函式。

方法如下:

\frac{-N_x}{N_y}=A(x,z)

\frac{-N_z}{N_y}=B(x,z)

,則

\left\{\begin{matrix} \frac{dy}{dx}=A(x,z)...(1) & \\  \frac{dy}{dz}=B(x,z)...(2) &  \end{matrix}\right.

(1)兩邊對x積分,得:

y=\int_{}^{}A(x,z)dx+W(z)

。。。(3)

其中W(z)為僅含自變數z的待定函式。

(3)兩邊對z求導得:

\frac{dy}{dz}=\frac{d\int_{}^{}A(x,z)dx}{dz}+\frac{dW(z)}{dz}

。。。(4)

比較(2)(4)兩式得:

\frac{d\int_{}^{}A(x,z)dx}{dz}+\frac{dW(z)}{dz}=B(x,z)

得:

W(z)=\int{B(x,z)}dz-\int{\frac{d(\int{A(x,z)dx})}{dz}dz}+C

。。。(5)

由(3)(5)得:

y(x,z)=\int{A(x,z)dx}+\int{B(x,z)}dz-\int{\frac{d(\int{A(x,z)dx})}{dz}dz}+C

再將(1)(2)代入得:

y(x,z)=\int{\frac{-N_x}{N_y}dx}+\int{\frac{-N_z}{N_y}}dz-\int{\frac{d(\int{\frac{-N_x}{N_y}dx})}{dz}dz}+C

這就是由法向量反求高度的表示式。

注:

(1)因為

grad=(\frac{dy}{dx},0,\frac{dy}{dz})

,所以前面推導過程中得到的

\left\{\begin{matrix} \frac{dy}{dx}=\frac{-N_x}{N_y} & \\  \frac{dy}{dz}=\frac{-N_z}{N_y} &  \end{matrix}\right.

實際上就是

grad=(\frac{-N_x}{N_y}  ,0,\frac{-N_z}{N_y})

。也就是說高度場的法線N和梯度grad之間可互求:

grad->N:

N=normalize(-grad+up)

N->grad:

grad=(\frac{-N_x}{N_y}  ,0,\frac{-N_z}{N_y})

(2)

\int{\frac{d(\int{\frac{-N_x}{N_y}dx})}{dz}dz}

不可以化簡為

\int{\frac{-N_x}{N_y}dx}

,因為雖然“先不定積分再求導得本身”,但“先求導再不定積分”可能差常數項。

(3)在上面解法中我們是“對(1)式積分再求導,然後與(2)式比較”。由於對稱性,還有一種方法是“對(2)式積分再求導,然後與(1)式比較”,這樣的話得到的結果將是:

y(x,z)=\int{\frac{-N_x}{N_y}dx}+\int{\frac{-N_z}{N_y}}dz-\int{\frac{d(\int{\frac{-N_z}{N_y}dz})}{dx}dx}+C

兩個結果都是對的。

因為可以證明

\int{\frac{d(\int{\frac{-N_x}{N_y}dx})}{dz}dz}

\int{\frac{d(\int{\frac{-N_z}{N_y}dz})}{dx}dx}

只相差一個常數項:

\int \frac{dy(x,z)}{dx}dx=y(x,z)+C_1(z)

\int \frac{dy(x,z)}{dz}dz=y(x,z)+C_2(x)

則:

 \int{\frac{d(\int{\frac{-N_x}{N_y}dx})}{dz}dz}= \int{\frac{d(\int{\frac{dy}{dx}dx})}{dz}dz}=\int{\frac{d(y(x,z)+C_1(z))}{dz}dz}

=\int{\frac{dy(x,z)}{dz}dz}+\int{\frac{dC_1(z)}{dz}dz}=y(x,z)+C_2(x)+C_1(z)+C_3

 \int{\frac{d(\int{\frac{-N_z}{N_y}dz})}{dx}dx}= \int{\frac{d(\int{\frac{dy}{dz}dz})}{dx}dx}=\int{\frac{d(y(x,z)+C_2(x))}{dx}dx}

=\int{\frac{dy(x,z)}{dx}dx}+\int{\frac{dC_2(x)}{dx}dx}=y(x,z)+C_1(z)+C_2(x)+C_4

所以僅相差常數項。

二,例項檢驗

例1:

設高度場為

y=x^2+sinz

\frac{dy}{dx}=2x

\frac{dy}{dz}=cosz

N=normalize((-\frac{dy}{dx},1,-\frac{dy}{dz}))

=normalize(-2x,1,-cosz)

=\frac{(-2x,1,-cosz)}{\sqrt{...}}

接下來由N反推y,看能否得到

y=x^2+sinz+C

N=\frac{(-2x,1,-cosz)}{\sqrt{...}}

\frac{-N_x}{N_y}=2x

\frac{-N_z}{N_y}=cos{z}

,則

y(x,z)=\int{\frac{-N_x}{N_y}dx}+\int{\frac{-N_z}{N_y}}dz-\int{\frac{d(\int{\frac{-N_x}{N_y}dx})}{dz}dz}+C

=\int{2xdx}+\int{cosz}dz-\int{\frac{d(\int{2xdx})}{dz}dz}+C

=x^2+sinz-0+C

=x^2+sinz+C

(符合預期)

例2:

設高度場為

y=xz

\frac{dy}{dx}=z

\frac{dy}{dz}=x

N=normalize((-\frac{dy}{dx},1,-\frac{dy}{dz}))

=normalize(-z,1,-x)

=\frac{(-z,1,-x)}{\sqrt{...}}

接下來由N反推y,看能否得到

y=xz+C

N=\frac{(-z,1,-x)}{\sqrt{...}}

\frac{-N_x}{N_y}=z

\frac{-N_z}{N_y}=x

,則

y(x,z)=\int{\frac{-N_x}{N_y}dx}+\int{\frac{-N_z}{N_y}}dz-\int{\frac{d(\int{\frac{-N_x}{N_y}dx})}{dz}dz}+C

=\int{zdx}+\int{x}dz-\int{\frac{d(\int{zdx})}{dz}dz}+C

=xz+xz-xz+C

=xz+C

(符合預期)

參考:Reconstructing a function from its gradient

————補充:

下一篇解釋幾何含義及程式碼實現:楊超:由法線反求高度場(2):幾何直觀