matrix ライブラリーの使い方

question:1191841779

matrix ライブラリーの使い方が少しわかったので、それを使って書き直してみた。

require 'matrix'

class Vector2 < Vector
  DIMENSION = 2

  def self.[](*array)
    self.Raise ErrDimensionMismatch if array.size != DIMENSION
    super
  end

  def self.elements(array, copy = true)
    self.Raise ErrDimensionMismatch if array.size != DIMENSION
    super
  end

  def rotate(angle)
    cos = Math.cos(angle)
    sin = Math.sin(angle)
    mat = Matrix[[cos, -sin],
                 [sin,  cos]]
    mat * self # .class == Vector...orz
  end
end

x = 13.0
y = 6.0
angle_degree = 47.0

angle = angle_degree * Math::PI / 180.0 # convert degrees into radians
p Vector2[x, y].rotate(angle)           # => Vector[4.47785647109746, 13.5995882814242]
p Vector2.elements([x, y]).rotate(angle)# => Vector[4.47785647109746, 13.5995882814242]

復帰値が Vector クラスのインスタンスになってしまうのが痛い(ノ∀`)……*1

*1:クラス名を決め打ちにするのは止めて欲しい。