- 締切済み
高さフィールドにおける勾配ベクトル
2次元正規格子点で定義している高さフィールドの 勾配ベクトルを求めたいのですが、どうやってもとめればいいのでしょうか? 四つの格子点に高さのデータが入っていてそこから、勾配となるベクトルを簡単に求める方法があれば、どなたか教えてください。
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- ere_Elba
- ベストアンサー率52% (9/17)
i_、j_をそれぞれ、x、y方向の単位ベクトルとすれば grad{z(i_・x+j_・y)}は、最も急な勾配を表わします。 ここで、grad{z(i_・x+j_・y)}=i_・(Δz/Δx)+j_・(Δz/Δy)です。 従って、求めたい勾配のx、y 方向成分は、 Δz/Δx(x方向だけを取り上げた場合の勾配)、 Δz/Δy(y方向だけを取り上げた場合の勾配) なので、それぞれの点毎に x方向、y方向に、それぞれ、Δz/Δx、Δz/Δyを取った ベクトルを合成すれば、それがその点の勾配になります。 Δx、Δyは差分ですが、これが小さければ小さいほど 正確な勾配が出せます。
- spring135
- ベストアンサー率44% (1487/3332)
高さ場の分布をφ(x,y)とすると 勾配ベクトルv"=grad(φ)("はベクトルを表すとします。) 格子点はいろんな取り方がありますが(つまり領域を格子ネットで覆う場合、評価点周辺の格子点の選び方は十字型(中心を評価店にとる)にとるとか評価点を四辺形の一頂点にとるとかですが、目的に応じて決めればよいと思います。ここでは評価点(x,y)を中心に上下、左右に格子点を十字型にとると十字の各点はx1<x<x2,y1<y<y3で P1(x1,y),P2(x2,y),P3(x,y1),P4(x,y2) 各格子点におけるφの値をφ1,φ2,φ3,φ4を用いて grad(φ)=((φ2-φ1)/(x2-x1),(φ4-φ3)/(y4-y3)) 要するに勾配は1階差分であって、中心差分とするか、前進差分とするか、後退差分とするかは、適宜決めればよい。
お礼
非常にわかりやすい返答ありがとうございます。 申し訳ないのですが、さらに質問があります。 今上記の高さフィールドを使って3DCGで山の地形を作っていて、そこに粒子の様な物を流したいと考えており高さフィールドからxとz方向の移動量はわかったのですが、3DCGの山に沿って斜面を流す場合y方向の移動量はどのように決定すればいいのでしょうか? 今は(φ2-φ1)/(x2-x1)と(φ4-φ3)/(y4-y3)の変位量が多い方の分だけ落としているのですがある程度正しく動いているように見えるものの、まだ少し不安があります。問題点があったらご指摘もらえるとうれしいです。