RubyのVectorクラスって外積無いの……、と何度も思っては、何度も書いて、何度もどこかになくしている。……また無くしたのでメモ。
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 かにあるんだろうけどー。