長方形の交差判定

cf. どう書く?.org - 長方形の交差判定
問題文中の top < bottom は間違いじゃないかと書いたら,グラフィックイメージの座標だと考えればOKだとコメントをもらった。なるほど。


判定方法は,要するに一方の長方形の4つある頂点のどれかか,もう一方の長方形の内部にあれば重なってると判定していいわけだ。
今日はRubyで書いた。

 class Rect
   def initialize(left, top, right, bottom)
     @left = left
     @top = top
     @right = right
     @bottom = bottom
   end
 
   def vertexes
     [ [@left, @top],
       [@left, @bottom],
       [@right, @bottom],
       [@right, @top] ]
   end
 
   def inner?(x,y)
     (@left < x && x < @right) && (@top < y && y < @bottom)
   end
 
   def overlap?(rect)
     rect.vertexes.any?{|x,y| inner?(x,y) }
   end
 end
 
 
 r1 = Rect.new(  0,   0, 100, 100)
 r2 = Rect.new(100,   0, 200, 100)
 r3 = Rect.new( 50,  50, 150, 100)
 
 p r1.overlap?(r2)                   # => false
 p r1.overlap?(r3)                   # => true
 p r2.overlap?(r3)                   # => true

追記:

このコードだと長方形がX方向とY方向の両方にずれていないと正しく判定できないことに気づいた。極端な話,ぴったりと重なっている長方形が「重なっていない」判定になる。

 irb(main):001:0> r1 = Rect.new(0,0,100,100)
 => #<Rect:0x499f9f4 @top=0, @left=0, @bottom=100, @right=100>
 irb(main):002:0> r1.overlap?(r1)
 => false

なんてこったい。