2013-10-18 71 views
2

此代碼找到兩個矩形的交集,但我無法完全理解它。當我嘗試映射在紙上,它甚至沒有一個矩形:此代碼如何找到矩形交叉點?

def rec_intersection(rect1, rect2) 
    x_min = [rect1[0][0], rect2[0][1]].max 
    x_max = [rect1[1][0], rect2[1][1]].min 
    y_min = [rect1[0][0], rect2[0][1]].max 
    y_max = [rect1[1][0], rect2[1][1]].min 
    return nil if ((x_max < x_min) || (y_max < y_min)) 
    return [[x_min, y_min], [x_max, y_max]] 
end 

rec_intersection([[1, 1], [2, 2]],[[0, 0], [5, 5]]) 

上面的代碼返回[[1, 1], [2, 2]]。有人可以解釋這個過程嗎?

+0

自己不去了解,這是什麼問題? –

+0

@SperanskyDanil呵呵不錯的一個:) –

+0

代碼假設返回2個矩形的交點。 Rect1和rect2。我不明白它是如何流動的,所以我要求某人澄清。謝謝 – hken27

回答

7

有時它有助於看到的代碼寫得有點不同:

def rec_intersection(rect1, rect2) 

    x_min = [rect1.top_left.x, rect2.top_left.x].max # => 1 
    y_min = [rect1.top_left.y, rect2.top_left.y].max # => 1 

    x_max = [rect1.bottom_right.x, rect2.bottom_right.x].min # => 2 
    y_max = [rect1.bottom_right.y, rect2.bottom_right.y].min # => 2 

    Rectangle.new(
    Point.new(x_min, y_min), 
    Point.new(x_max, y_max) 
) 

end 

Point = Struct.new(:x, :y) 
Rectangle = Struct.new(:top_left, :bottom_right) 

rect1 = Rectangle.new(Point.new(1, 1), Point.new(2, 2)) 
# => #<struct Rectangle 
#  top_left=#<struct Point x=1, y=1>, 
#  bottom_right=#<struct Point x=2, y=2>> 

rect2 = Rectangle.new(Point.new(0, 0), Point.new(5, 5)) 
# => #<struct Rectangle 
#  top_left=#<struct Point x=0, y=0>, 
#  bottom_right=#<struct Point x=5, y=5>> 

rec_intersection(rect1, rect2) 
# => #<struct Rectangle 
#  top_left=#<struct Point x=1, y=1>, 
#  bottom_right=#<struct Point x=2, y=2>> 
+0

謝謝。真棒。十分清晰。 – hken27

+0

'[rect1 [0] [0],rect2 [0] [1]] .max'與[rect1.top_left.x,rect2.top_left.x] .max'不匹配。應該是'rect2 [0] [0]' –