- ベストアンサー
法線を使って、ある地表の一点の高さを調べるには
法線を使って、ある地表の一点の高さを調べるには (X,Y,Z)座標の中のある一点(X,Z)の地表の高さ(Y) を知るのに、その一点のまわりの三点(A、B、C)の座標値(X,Y,Z) がわかっていれば、法線を使って知りたい点の高さがわかると聞いたのですが (A,B,C)でできる平面の法線を求めて 点(A)と調べたい点(T)を結んだ線(AT)を作ると、 線(AT)と法線は直行してるので 線(AT)と法線の内積=0 という所までは、わかったのですが、 その内積を表す式と 法線の各成分、点(A)の各成分、調べたい点T(X,Z)成分 はすでにわかっているので、調べたい点T(Y)成分を 内積の式から抽出でき、 式を展開できるということの、 その式がどうしてもわかりません。 その式がわかれば、ある地点(X,Z)の(Y)成分がわかるらしいのですが、 どなたかご存知の方がおりましたら よろしくお願い致します。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
>三、四角形(傾きは任意)のすべての頂点位置はわかっている状態で、面の中のある一点(面に含まれる)の3次元座標のY位置を調べる それでしたら、そのある1点の座標を ( Xp, Yp, Zp ) として、Xp と Zp を与えたときに、Yp はいくつになるかということを知りたいわけですね。 平面の方程式は nx*x + ny*y + nz*z = d --- (1) ですので、これが3点 A( Xa, Ya, Za )、B( Xb, Yb, Zb )、C( Xc, Yc, Zc ) を通るなら nx = d*( Za*Yc - Yc*Zb - Ya*Zc + Zc*Yb + Ya*Zb - Za*Yb )/( - Xa*Yc*Zb - Ya*Xb*Zc + Xc*Ya*Zb + Xa*Zc*Yb + Za*Xb*Yc - Za*Xc*Yb ) --- (2) ny = d*( Xb*Za - Xb*Zc + Xa*Zc - Xa*Zb - Xc*Za + Zb*Xc )/( - Xa*Yc*Zb - Ya*Xb*Zc + Xc*Ya*Zb + Xa*Zc*Yb + Za*Xb*Yc - Za*Xc*Yb ) --- (3) nz = d*( - Xa*Yc - Ya*Xb + Xc*Ya + Xa*Yb + Xb*Yc - Yb*Xc )/( - Xa*Yc*Zb - Ya*Xb*Zc + Xc*Ya*Zb + Xa*Zc*Yb + Za*Xb*Yc - Za*Xc*Yb) --- (4) となります( d の値は分からなくても nx:ny:nz が分かれば平面は決まります )。 点 ( Xp, Yp, Zp ) が平面 (1) 上にあるのなら nx*Xp + ny*Yp + nz*Zp = d --- (5) が成り立つので、式 (2) ~ (5) から Yp = - ( - Yc*Za + Yc*Zb + Zc*Ya - Zc*Yb - Zb*Ya + Yb*Za )/( - Xb*Za + Xb*Zc - Xa*Zc + Xa*Zb + Xc*Za - Zb*Xc )*Xp - ( Xa*Yc + Ya*Xb - Xc*Ya - Xa*Yb - Xb*Yc + Yb*Xc )/( -Xb*Za + Xb*Zc - Xa*Zc + Xa*Zb + Xc*Za - Zb*Xc )*Zp - ( -Yc*Zb*Xa + Zc*Yb*Xa - Xb*Zc*Ya + Xc*Zb*Ya + Xb*Yc*Za - Xc*Yb*Za )/( - Xb*Za + Xb*Zc - Xa*Zc + Xa*Zb + Xc*Za - Zb*Xc ) となって、Yp を Xp と Zp を使って表わすことができます。このような計算は手計算ではとてもできないので、数式処理ソフトを使いました。
その他の回答 (3)
- aquarius_hiro
- ベストアンサー率53% (194/360)
ANo.3です。 何がお分かりにならないのかが、よくわからないのですが。 > Y = Y_A - [ k (X - X_A) + m (Z - Z_A)]/l > の形をだそうと考えていましたが(できませんでしたが) この式の導出の仕方がわからないという意味ですか? まず、内積の式が k (X - X_A) + l (Y - Y_A) + m (Z - Z_A) = 0 となることは良いですよね? ベクトル (k,l,m) と ベクトルTA = ( X - X_A, Y - Y_A, Z - Z_A ) の内積は、各成分どうしかけたものを足せば良いわけです。 ベクトル(A_x,A_y,A_z) とベクトル(B_x,B_y,B_z) の内積は A_x B_x + A_y B_y + A_z B_z = 0 になります。 これを今の場合に適用すると、 k (X - X_A) + l (Y - Y_A) + m (Z - Z_A) = 0 ですね。 この先の変形がわからないという意味ですか? 第1項と第3項を右辺に移項します。 l (Y - Y_A) = - [ k (X - X_A) + m (Z - Z_A) ] lで両辺を割ります(lはエルです) (Y - Y_A) = - [ k (X - X_A) + m (Z - Z_A) ]/l 両辺にY_Aを加える Y = Y_A - [ k (X - X_A) + m (Z - Z_A) ]/l 右辺はすべてわかっているという仮定なので、これで Y の式が求まったことになります。 > どちらが正しいのか到底私には判断できません。 ANo.2のご回答の式はフォローしていませんが、 たぶん、同じものを違うインプットで表現したものだと思いますよ。 ANo.2のご回答の式は、おそらくABCの座標を使い表現したものだと思います。 ご質問の文面では、法線ベクトルがわかっているという前提なので、私はその情報を使った式を、提示しました。 ご質問には、 > 線(AT)と法線の内積=0 > という所までは、わかったのですが、 > > その内積を表す式と > 法線の各成分、点(A)の各成分、調べたい点T(X,Z)成分 > はすでにわかっているので、調べたい点T(Y)成分を > 内積の式から抽出でき、 > 式を展開できるということの、 と書かれていて、それはまさしくこの式を求めるという意味ではないのですか? > inara様の式の方が答の精度が高そうな気はしますが(想像) 別に何も近似はしてないので、私の提示した式も、ちゃんと正確な式ですよ。 ちなみに、法線ベクトルは「外積」というのを使えば簡単に求まりますよ。 A: (Xa,Ya,Za) B: (Xb,Yb,Zb) C: (Xc,Yc,Zc) とおくと、 k = (Yb-Ya)(Zc-Za) - (Zb-Za)(Yc-Ya) l = (Zb-Za)(Xc-Xa) - (Xb-Xa)(Zc-Za) m = (Xb-Xa)(Yc-Ya) - (Yb-Ya)(Xc-Xa) で座標から計算できます。 これを上の Y = … の式に代入すれば、たぶん、ANo.2のご回答の式と一致するのではないかと思います。
お礼
回答ありがとうございます。 > Y = Y_A - [ k (X - X_A) + m (Z - Z_A)]/l > の形をだそうと考えていましたが(できませんでしたが) と書いたのはここで質問する以前、 自分で考えてもわからなかったという意味で書きました。 ANo.3様の回答は大変良ありがたく思っております。 ただ、ANo.2様の式には、平面の方程式が含まれていたので お二人の式はそれぞれ違うものと思ってしまいまして、 一重に私の知識不足からくる誤解ですので どうかご容赦ください。
- aquarius_hiro
- ベストアンサー率53% (194/360)
こんにちは。 > 三、四角形(傾きは任意)でその図形のすべての頂点位置 > はわかっている状態で、面の中のある一点(面に含まれる)の3次元座標のY位置を調べるという小さい話です。 > その内積を表す式と > 法線の各成分、点(A)の各成分、調べたい点T(X,Z)成分 > はすでにわかっているので、調べたい点T(Y)成分を > 内積の式から抽出でき、 > 式を展開できるということの、 法線ベクトルを (k,l,m) とします。 頂点Aの座標を (X_A, Y_A, Z_A) とします。 調べたい点T の座標を (X,Y,Z) とします。 この中でわかっていないのは、Y だけなのですよね? ベクトルTA = ( X - X_A, Y - Y_A, Z - Z_A ) と、 法線ベクトルが直交する条件から、 k (X - X_A) + l (Y - Y_A) + m (Z - Z_A) = 0 が成立ちますが、これを単純に解いて、 Y = Y_A - [ k (X - X_A) + m (Z - Z_A)]/l で求まった。 ・・・というのではいけないのですか?
お礼
回答ありがとうございます。 私も、aquarius_hiro様の おっしゃる様なごく簡単な式で求まる という話を聞き、 短い式ですむ方が魅力的でしたので、 Y = Y_A - [ k (X - X_A) + m (Z - Z_A)]/l の形をだそうと考えていましたが(できませんでしたが) たしかに、inara様の教えて下さった式 を使ってプログラムしている方もいらっしゃいます。 平面の方程式を用いる理由がよくわからないので どちらが正しいのか到底私には判断できません。 inara様の式の方が答の精度が高そうな気はしますが(想像)
- inara
- ベストアンサー率72% (293/404)
ご質問に「地上」とあるので、地球上を想定されているのなら、xyz座標系でなく曲面座標系を使わないといけないと思います。もし地上を平面としていいのなら、3点 ABC を通る平面と、点 T との距離(物体の高さ)を知りたいということですね。 まず、法線というのは平面と直交する直線のことなので、「線(AT)と法線は直行してる」というのはおかしいです(点 T が地上にあれば別ですが)。点T (物体)から平面 ABC (地面)に直角に垂した線が、その平面と交わる点(つまり物体の真下の地上の点)を P とすれば、線分(ベクトル)PT が法線になるので、これと直交するのは平面上の任意の2点を結ぶ線分( 例えばベクトルAB、AC、BC )です。つまり、内積を・で表わせば AB・PT = BC・PT = CA・PT = 0 が成り立ちます。3つめの式 CA・PT = 0 は、前の2式が成り立てば自動的に成り立ちます( CA = BC - BA なので、AB・PT = BC・PT = 0 ならば、CA・PT = ( BC - BA )・PT = BC・PT + AB・PT = 0 )。 ベクトルでなく座標で考えると以下のようになります。 まず、点 A, B, C, T, P の座標をそれぞれ ( Xa, Ya, Za )、( Xb, Yb, Zb )、( Xc, Yc, Zc )、( Xt, Yt, Zt )、( Xp, Yp, Zp ) とします。 このうち未知なのは ( Xp, Yp, Zp ) だけで、これが分かれば点 T と点 P の間の距離(物体の高さ)は √{ ( Xt - Xp )^2 + ( Yt - Yp )^2 + ( Zt - Zp )^2 } です。 xyz 座標系での平面の方程式は一般に nx*x + ny*y + nz*z = d --- (1) で表わされます( nx, ny, nz, d は定数)。nx はn*x でなく、x方向の成分という意味で、( nx, ny, nz ) がこの平面の法線ベクトルの成分になります。この法線ベクトルが 線分PT ならば nx = Xt - Xp、ny = Yt - Yp、nz = Zt - Zp --- (2) です。また、4つの点 A, B, C, P はこの平面上になければならないので、それらの座標は式(1) を満足しなければなりません。つまり nx*Xa + ny*Ya + nz*Za = d --- (3) nx*Xb + ny*Yb + nz*Zb = d --- (4) nx*Xc + ny*Yc + nz*Zc = d --- (5) nx*Xp + ny*Yp + nz*Zp = d --- (6) となります。式(2)~(6)を解けば、未知数 ( Xp, Yp, Zp ) と d が出ますが大変複雑な式になります(ちゃんと解けます)。 これはレポートや試験問題の類ではないと思いますが、もし、ご趣味でこのような計算をしたいのであれば、計算プログラム(Excel VBA)を紹介します(字数制限が問題ですが)。Excel のソルバーで解けないことはないですが、初期値を誤ると収束しないので、確実に解の出る方法が良いかと思います。
お礼
詳しい回答ありがとうございます。 こちらの説明が不足していて 大変申し訳ありません。 計算が必要だったのはパソコン上の 3D仮想空間、XYZ座標 限定の問題だったのですが 話をややこしくしてすいません。 趣味の3Dプログラミングに必要だったのですが 数学の問題なので数学カテゴリーで質問させていただきました。 地上と言いましたのは、板切れの様なもの(面積はあるが厚さがない) を隙間なく敷き詰めて、XYZ座標空間に配置し、 それを、地面に見立てるという意味でした。 最初から把握できるのは、板切れのかど(頂点)の XYZ座標上の位置がどこかということだけですので、 それ以外の部分で、板切れの面のある一部の高さを 調べる方法を考えていたのですが、 地表などという言葉を使ったために 話が地球全体にまで及んでしまい、申し訳ありませんでした。 実際には、3次元座標空間に配置された一枚の 三、四角形(傾きは任意)でその図形のすべての頂点位置 はわかっている状態で、面の中のある一点(面に含まれる)の3次元座標の Y位置を調べるという小さい話です。 外積を使って面の法線をだして、 その法線と、調べたい点(T)と図形の頂点(A)を結んだ線(TA)(面に含まれる) が直行していて、内積は0というのは、わかりますし 内積=0であり、法線の各成分、点Aの各成分、調べたい点(T)のX,Z成分がわかっているという ことから、その内積の式から調べたい点(T)のY成分が抽出できるとききまして考えました。 内積の式というと、|a→|×|b→|cosθ、 ax*bx+ay*by+az*bz だと 思うのですが Y成分を求める事とどう関係するのか、考えてもわかりませんでした。 レベルの低い質問ですいません。
お礼
明快な回答、本当にありがとうございます。 教えてもらった計算式は ありがたく 使わせていただきます。 これからはもっと数学も勉強していきます。 ありがとうございました。