あるベクトルaが与えられた時に、そのベクトルとZ軸(またはX軸、Y軸)が対応しているような直交座標系(を表す単位ベクトル3つ)を求めるには?というお話です。
例によってRubyのプログラムで計算していきます。
require "matrix" class Vector # 準備 # Vectorクラスに、外積を求めるメソッドを追加します。 # http://d.hatena.ne.jp/tanku/20100318/1268930228 # よりコピペさせてもらいました。 def outer_product(o) raise 'size#{self.size}' unless size == 3 Vector[ self[1] * o[2] - self[2] * o[1], self[2] * o[0] - self[0] * o[2], self[0] * o[1] - self[1] * o[0], ] end # 基本ベクトルを生成するメソッド。 # ここでは、selfがZ軸に一致するようにしています。 def generate_unit raise 'vector size must be 3.' unless size == 3 # まず、selfと方向が一致する単位ベクトル w を作ります。 w = self/self.r # 次に、wと直交するベクトル u を求めます。 # 内積=0を満たしていればいいので、無数にあります。 # ゼロ除算が起こらないような方法を選びました。 # w[0]*w[1] - w[0]*w[1] + w[1]*w[2] - w[1]*w[2] + w[2]*w[0] - w[2]*w[0] = 0 # を変形して、 # w[0]*(w[1]-w[2]) + w[1]*(w[2]-w[0]) + w[2]*(w[0]-w[1]) = 0 # としています。 u0 = Vector[w[1]-w[2], w[2]-w[0], w[0]-w[1]] u = u0/u0.r # wを軸として、uを90度回転したものが、残り1つのベクトル v です。 # v = (w・u)*w + (u-(w・u)*w)*cos(90度) - (u✕w)*sin(90度) # 計算の理屈については、 # http://hooktail.sub.jp/mathInPhys/vectorRot/ # を見てください。 v = w.inner_product(u)*w + u.outer_product(w) # 作った3つのベクトルを返します。 return [u, v, w] end
参考にしたページのリンクを貼っておきます。
3次元ベクトルメモ - 好き勝手に・げーあにん?
ベクトルの回転 [物理のかぎしっぽ]
class Vector
0 件のコメント:
コメントを投稿