たのしいRuby 第19章後半 演算子の定義

そういえば、後半戦が残っていた。

2次元ベクトルVectorを定義して演算子の定義を学習する。サンプルに、内積Oと外積Xを追加してみた。

#!/usr/bin/ruby

class Vector
  attr_reader :x, :y
  def initialize(x=0.0, y=0.0)
    @x, @y = x, y
  end
  def inspect
    "(#{@x}, #{@y})"
  end
  def +(v)
    Vector.new(@x + v.x, @y + v.y)
  end
  def -(v)
    Vector.new(@x - v.x, @y - v.y)
  end
  def +@
    self.dup
  end
  def -@
    Vector.new(-@x, -@y)
  end
  # 90度回転
  def ~@
    Vector.new(-@y, @x)
  end
  # 内積
  def O(v)
    @x * v.x + @y * v.y
  end
  # 外積(x方向のスカラー)
  def X(v)
    @x * v.y - v.x * @y
  end
end

p v1 = Vector.new( 2.0, 2.0)

puts "==90度づつ回転"
p v2 = ~v1
p v3 = ~v2
p v4 = ~v3

puts "==内積"
p v1.O(v2) #=> 0.0 直交
p v1.O(v3) #=> -8.0 逆方向
p v1.O(v4) #=> 0.0  直交

puts "==外積"
p v1.X(v2) #=> 8.0 直交
p v1.X(v3) #=> 0.0 逆方向
p v1.X(v4) #=> -8.0 直交だけど、正負が逆。
  • 内積は正負によって、ベクトルのなす方向を出せる。プラスなら同じ方向、マイナスなら逆方向。
  • 2次元の外積は[x1,y1,0]X[x1,y1,0]として、z方向を取ると正負でベクトルの内外判定に使える。右手の法則で、1が人差し指。2が中指。
参考

2次元でむじぃ。