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

任意の面内にある点の座標から面の傾きを求める方法を教えて下さい。

XYZ軸で構成される3次元空間があります。
そこに面Aが存在するとします。
この面Aの傾きを求めるためには
面A上にある座標、a(x1,y1,z1),b(x2,y2,z2),c(x3,y3,z3)の3点が分れば
傾きは求まるかと思います。
(実際は任意のxyの位置にある面Aの高さzを求めてa,b,cを決める)

この面を水平に補正しようとする場合の
x軸周りに?度、y軸周りに?度というのを求めたい場合
どのようにすればよいのでしょうか?

また実際は面Aにもたわみがありますので
もっとたくさんの点で面Aの高さを求め、
そこからx,y軸周りの傾きを近似する必要がありますが
その場合もどのようにすればよいのでしょうか?

ご回答、または参考サイトをお教えいただきたいと思います。

A 回答 (4件)

#1です。

補足します。
#1にて書いた通り私は詳細まで説明出来ません。直線近似については、直線を設定して各点と直線の距離の和が最小になるように傾きと切片を決定します。平面についても同じ原理です。各点と平面の距離が最小になるよう法線ベクトルと通過点を決定します。
    • good
    • 3
この回答へのお礼

ありがとうございます。
おそくなってすいません。
一応できるようになりました。
この度はありがとうございました。

お礼日時:2010/06/06 15:15

z=a2*x+a1*y+a0



min[Σ(i=1~m)[zi-(ai*xi+a1*yi+a0)]^2]

0=@/@a0[Σ(i=1~m)[zi-(a2*xi+a1*yi+a0)]^2]
=2Σ(i=1~m)[zi-a2*xi-a1*yi-a0)*(-)
0=@/@a1[Σ(i=1~m)[zi-(a2*xi+a1*yi+a0)]^2]
=2Σ(i=1~m)[zi-a2*xi-a1*yi-a0)*(-yi)
0=@/@a2[Σ(i=1~m)[zi-(a2*xi+a1*yi+a0)]^2]
=2Σ(i=1~m)[zi-a2*xi-a1*yi-a0)*(-xi)

a0*m+a1*Σ(i=1~m)[yi]+a2*Σ(i=1~m)[xi]=Σ(i=1~m)[zi]
a0*Σ(i=1~m)[yi]+a1*Σ(i=1~m)[yi^2]+a2*Σ(i=1~m)[xi*yi]=Σ(i=1~m)[yi*zi]
a0*Σ(i=1~m)[xi]+a1*Σ(i=1~m)[xi*yi]+a2*Σ(i=1~m)[xi^2]=Σ(i=1~m)[xi*zi]

a0=Σ(i=1~m)[zi]*Σ(i=1~m)[yi^2]*Σ(i=1~m)[xi^2]+Σ(i=1~m)[yi]*Σ(i=1~m)[xi*yi]*Σ(i=1~m)[xi*zi]+Σ(i=1~m)[xi]*Σ(i=1~m)[yi*zi]*Σ(i=1~m)[xi*yi]-Σ(i=1~m)[xi]*Σ(i=1~m)[yi^2]*Σ(i=1~m)[xi*zi]-Σ(i=1~m)[yi]*Σ(i=1~m)[yi*zi]*Σ(i=1~m)[xi^2]-Σ(i=1~m)[zi]*Σ(i=1~m)[xi*yi]*Σ(i=1~m)[xi*yi]/[[m]*Σ(i=1~m)[yi^2]*Σ(i=1~m)[xi^2]+Σ(i=1~m)[yi]*Σ(i=1~m)[xi*yi]*Σ(i=1~m)[xi]+Σ(i=1~m)[xi]*Σ(i=1~m)[yi]*Σ(i=1~m)[xi*yi]-Σ(i=1~m)[xi]*Σ(i=1~m)[yi^2]*Σ(i=1~m)[xi]-Σ(i=1~m)[yi]*Σ(i=1~m)[yi]*Σ(i=1~m)[xi^2]-[m]*Σ(i=1~m)[xi*yi]*Σ(i=1~m)[xi*yi]]
a1=[m]*Σ(i=1~m)[yi*zi]*Σ(i=1~m)[xi^2]+Σ(i=1~m)[zi]*Σ(i=1~m)[xi*yi]*Σ(i=1~m)[xi]+Σ(i=1~m)[xi]*Σ(i=1~m)[yi]*Σ(i=1~m)[xi*zi]-Σ(i=1~m)[xi]*Σ(i=1~m)[yi*zi]*Σ(i=1~m)[xi]-Σ(i=1~m)[zi]*Σ(i=1~m)[yi]*Σ(i=1~m)[xi^2]-[m]*Σ(i=1~m)[xi*yi]*Σ(i=1~m)[xi*zi]/[[m]*Σ(i=1~m)[yi^2]*Σ(i=1~m)[xi^2]+Σ(i=1~m)[yi]*Σ(i=1~m)[xi*yi]*Σ(i=1~m)[xi]+Σ(i=1~m)[xi]*Σ(i=1~m)[yi]*Σ(i=1~m)[xi*yi]-Σ(i=1~m)[xi]*Σ(i=1~m)[yi^2]*Σ(i=1~m)[xi]-Σ(i=1~m)[yi]*Σ(i=1~m)[yi]*Σ(i=1~m)[xi^2]-[m]*Σ(i=1~m)[xi*yi]*Σ(i=1~m)[xi*yi]]
a2=[m]*Σ(i=1~m)[yi^2]*Σ(i=1~m)[xi*zi]+Σ(i=1~m)[yi]*Σ(i=1~m)[yi*zi]*Σ(i=1~m)[xi]+Σ(i=1~m)[zi]*Σ(i=1~m)[yi]*Σ(i=1~m)[xi*yi]-Σ(i=1~m)[zi]*Σ(i=1~m)[yi^2]*Σ(i=1~m)[xi]-Σ(i=1~m)[yi]*Σ(i=1~m)[yi]*Σ(i=1~m)[xi*zi]-[m]*Σ(i=1~m)[yi*zi]*Σ(i=1~m)[xi*yi]/[[m]*Σ(i=1~m)[yi^2]*Σ(i=1~m)[xi^2]+Σ(i=1~m)[yi]*Σ(i=1~m)[xi*yi]*Σ(i=1~m)[xi]+Σ(i=1~m)[xi]*Σ(i=1~m)[yi]*Σ(i=1~m)[xi*yi]-Σ(i=1~m)[xi]*Σ(i=1~m)[yi^2]*Σ(i=1~m)[xi]-Σ(i=1~m)[yi]*Σ(i=1~m)[yi]*Σ(i=1~m)[xi^2]-[m]*Σ(i=1~m)[xi*yi]*Σ(i=1~m)[xi*yi]]

arctan(@z/@x)=arctan(a2)
arctan(@z/@y)=arctan(a1)
    • good
    • 0
この回答へのお礼

遅くなってすいません。
ありがとうございます。
ぱっと見難しそうですが、考えてみます。

お礼日時:2010/06/06 15:13

#1です。

補足します。
質問と回答が微妙にズレていたようですね。

3点を通る平面の式はちょっと複雑です。
a(x1-x2)+b(y1-y2)+c(z1-z2)=0
a(x2-x3)+b(y2-y3)+c(z2-z3)=0
上式を解けばベクトル(a,b,c)を求めることが出来ます。未知数3個に対して式が2個しかないので、答えは
a=αc
b=βc
のような形になりますが、それで十分です。求める平面は点(x1,y1,z1)を通り法線ベクトル(αc,βc,c)を持つ平面なので
αc(x-x1)+βc(y-y1)+c(z-z1)=0
両辺をcで割って
α(x-x1)+β(y-y1)+z-z1=0
法線ベクトルは(α,β,1)でも(αc,βc,c)でも同じです。座標軸とのなす角を求めればいいのです。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
3点での平面の求め方はよくわかりました。
実際に平面を求めてx、y軸周りの傾きを求めるためには
8点ぐらいでの高さ(z)を計測して平面の方程式を出す必要があります。
最小2乗近似を使うとのことですが
どのタイミングで使ってよいのかよく分りません。

例えば
a(x1,y1,z1)
b(x2,y2,z2)
c(x3,y3,z3)
d(x4,y4,z4)
c(x5,y5,z5)
f(x6,y6,z6)
g(x7,y7,z7)
h(x8,y8,z8)
このような8点を計測したとします。
この8点は多少のバラツキがあり理論的な平面上にはありません。
このような平面の近似式はどのように求めるのでしょうか?
(直線の1次近似が3次元になったようなもの?)
いまいち分らないのでご享受宜しく願い致します。

お礼日時:2010/05/29 19:57

平面Aの式は通常以下のように表されます。



点(x1,y1,z1)を通り法線ベクトル(a,b,c)を持つ平面
a(x-x1)+b(y-y1)+c(z-z1)=0

法線ベクトルというのは、面から垂直方向に伸びるベクトルのことです。
法線ベクトルの傾きが質問文でいうところの面の傾きを表します。

例えばxy平面の式は、点(0,0,0)を通り法線ベクトル(0,0,1)を持つ平面なので
xy平面の式:z=0

法線ベクトルが座標軸から何度傾いているかは、以下の式により計算されます。
x軸からの傾き:cosθ1=a/√(a^2+b^2+c^2) θ1:x軸と法線ベクトルのなす角
y軸からの傾き:cosθ2=b/√(a^2+b^2+c^2) θ2:y軸と法線ベクトルのなす角
z軸からの傾き:cosθ3=c/√(a^2+b^2+c^2) θ3:z軸と法線ベクトルのなす角

多数の点から平面Aを求める方法
多数の点から平面Aの式を求めれば法線ベクトルが求まります。最小二乗近似という方法があります。詳細は私も説明出来ませんが。エクセルで直線のグラフを書いた時に近似直線の式が求まりますが、あれは最小二乗近似を用いて計算してます。
    • good
    • 0

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