About this Blog

This Blog has English posts and Japanese posts. About Mac, iOS, Objective-C, and so on.

2013年4月23日火曜日

1つのベクトルから基本ベクトルを作る計算方法

なんかもうタイトルがわけわからないですが、
あるベクトル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 件のコメント:

コメントを投稿