読者です 読者をやめる 読者になる 読者になる

好き勝手に・げーあにん?

ファミコンと同い年の社会人ヌルオタの日記

3次元ベクトルメモ

Ruby

RubyVectorクラスって外積無いの……、と何度も思っては、何度も書いて、何度もどこかになくしている。……また無くしたのでメモ。

require 'matrix'
# http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-math/575
require 'quaternion'

class Vector
  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

  def normalize
    l = len
    a = Array.new(self.size)
    self.size.times do |i|
      a[i] = self[i] / l
    end
    return Vector[*a]
  end

  def len_sq
    self.inner_product(self)
  end

  def len
    Math::sqrt(len_sq)
  end

  def -@
    a = Array.new(self.size)
    self.size.times do |i|
      a[i] = -self[i]
    end
    return Vector[*a]
  end
end

class Quaternion
  def self.from_axis(axis, rot)
    s = Math::sin(rot*0.5)
    Quaternion.new(
      axis[0] * s,
      axis[1] * s,
      axis[2] * s,
      Math::cos(rot*0.5)
    )
  end
end


自分用なので細かいことは気にしない。

  • 例外ぐらいちゃんと書けよとか
  • normalized!欲しいとか
  • len は length と被るから仕方なかったんですとか
  • さりげなく四元数混ざってるとか
  • つか、四元数ぐらい標準添付に入っててもいいと思うんだ……毎回MLから拾ってきては、毎回エラーが出て直すハメになってるとか

Boost の matrix とか quaternion を見てて思ったんだけど、数学的な matrix と私の欲しい matrix クラスは違うものなんだとよく感じる。4*4より大きい行列とかどうでもいいねん。vector とか quaternion とかでいろいろやって欲しいんよ。

きっと gem か github かにあるんだろうけどー。