アプリ版:「スタンプのみでお礼する」機能のリリースについて

法線を使って、ある地表の一点の高さを調べるには

(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)成分がわかるらしいのですが、

どなたかご存知の方がおりましたら
よろしくお願い致します。

A 回答 (4件)

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のご回答の式と一致するのではないかと思います。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
> Y = Y_A - [ k (X - X_A) + m (Z - Z_A)]/l
> の形をだそうと考えていましたが(できませんでしたが)

と書いたのはここで質問する以前、
自分で考えてもわからなかったという意味で書きました。

ANo.3様の回答は大変良ありがたく思っております。

ただ、ANo.2様の式には、平面の方程式が含まれていたので
お二人の式はそれぞれ違うものと思ってしまいまして、
一重に私の知識不足からくる誤解ですので
どうかご容赦ください。

お礼日時:2007/08/16 13:36

こんにちは。



> 三、四角形(傾きは任意)でその図形のすべての頂点位置
> はわかっている状態で、面の中のある一点(面に含まれる)の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

で求まった。

・・・というのではいけないのですか?
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

私も、aquarius_hiro様の
おっしゃる様なごく簡単な式で求まる
という話を聞き、

短い式ですむ方が魅力的でしたので、
Y = Y_A - [ k (X - X_A) + m (Z - Z_A)]/l
の形をだそうと考えていましたが(できませんでしたが)

たしかに、inara様の教えて下さった式
を使ってプログラムしている方もいらっしゃいます。

平面の方程式を用いる理由がよくわからないので
どちらが正しいのか到底私には判断できません。

inara様の式の方が答の精度が高そうな気はしますが(想像)

お礼日時:2007/08/16 09:09

>三、四角形(傾きは任意)のすべての頂点位置はわかっている状態で、面の中のある一点(面に含まれる)の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 を使って表わすことができます。このような計算は手計算ではとてもできないので、数式処理ソフトを使いました。
    • good
    • 0
この回答へのお礼

明快な回答、本当にありがとうございます。
教えてもらった計算式は
ありがたく
使わせていただきます。

これからはもっと数学も勉強していきます。
ありがとうございました。

お礼日時:2007/08/15 23:29

ご質問に「地上」とあるので、地球上を想定されているのなら、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 のソルバーで解けないことはないですが、初期値を誤ると収束しないので、確実に解の出る方法が良いかと思います。
    • good
    • 0
この回答へのお礼

詳しい回答ありがとうございます。

こちらの説明が不足していて
大変申し訳ありません。

計算が必要だったのはパソコン上の
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成分を求める事とどう関係するのか、考えてもわかりませんでした。

レベルの低い質問ですいません。

お礼日時:2007/08/15 20:08

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!