2015-07-31 3 views
3

Я пытаюсь понять эту программу, но у меня есть некоторые трудности. Я не понимаю часть с x_min, y_min, x_max, y_max.Прямоугольное пересечение в Ruby

Я понимаю, что программа проходит через два прямоугольника с нижними левыми и верхними правыми координатами, но где индексы массива [0][0], [1][1] и т. Д.?

Я смущен о том, что происходит, поэтому объяснение поможет.

# Write a function, `rec_intersection(rect1, rect2)` and returns the 
# intersection of the two. 
# 
# Rectangles are represented as a pair of coordinate-pairs: the 
# bottom-left and top-right coordinates (given in `[x, y]` notation). 
# 
# Hint: You can calculate the left-most x coordinate of the 
# intersection by taking the maximum of the left-most x coordinate of 
# each rectangle. Likewise, you can calculate the top-most y 
# coordinate of the intersection by taking the minimum of the top most 
# y coordinate of each rectangle. 
# 
# Difficulty: 4/5 
def rec_intersection(rect1, rect2) 

x_min = [rect1[0][0], rect2[0][0]].max 
x_max = [rect1[1][0], rect2[1][0]].min 

y_min = [rect1[0][1], rect2[0][1]].max 
y_max = [rect1[1][1], 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 

puts rec_intersection(
     [[0, 0], [2, 1]], 
     [[1, 0], [3, 1]] 
    ) == [[1, 0], [2, 1]] 

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


puts rec_intersection(
     [[1, 1], [2, 2]], 
     [[4, 4], [5, 5]] 
    ) == nil 

puts rec_intersection(
     [[1, 1], [5, 4]], 
     [[2, 2], [3, 5]] 
    ) == [[2, 2], [3, 4]] 
+0

ответы [Здесь] (http://stackoverflow.com/questions/29157419/confused-about-rectangles-in-ruby) может представлять интерес. –

ответ

2

То, что я не получаю, в частности, является частью с x_min, y_min, x_max, y_max. Я получаю, что программа проходит через 2 прямоугольника с нижними левыми и верхними правыми точками координат. Но откуда берутся индексы массива? [0] [0], [1] [1] и т. Д.?

В этом разделе комментариев выше этого кода важно, чтобы это понять:

# Rectangles are represented as a pair of coordinate-pairs: the 
# bottom-left and top-right coordinates (given in `[x, y]` notation). 

Итак, если rect представляет собой прямоугольник, то rect[0] представляет нижний левый угол, и rect[1] представляет Топ- правый угол. Кроме того, rect[0][0] представляет собой координату x нижнего левого угла, rect[0][1] - это координата y этого угла и т. Д.

В этом разделе комментариев также имеет важное значение:

# Hint: You can calculate the left-most x coordinate of the 
# intersection by taking the maximum of the left-most x coordinate of 
# each rectangle. [...] 

Если rect представляет собой прямоугольник, самые левые х-координату этого прямоугольника х-координату нижнего левого угла. Как я объяснил выше, rect[0][0] представляет собой координату x нижнего левого угла. Таким образом, в этой строке:

x_min = [rect1[0][0], rect2[0][0]].max 

rect1[0][0] и rect2[0][0] являются две крайние левые координаты х прямоугольников, и эта строка кода говорит о том, что х-координата крайней левой стороны от пересечения двух прямоугольников равна той, какая из них больше.

+0

Большое спасибо! Я начал разбираться, но это обеспечивает большую ясность для меня – ceckenrode

7

Переменные x_min, x_max, y_min, y_max используются для хранения координат пересекающейся области. Они получены с использованием max и min на двухзначном массиве с использованием прошедших прямоугольников. Вызов [1 ,2].max вернет 2, а звонок [1,2].min будет возвращен, например, 1.

Причина, почему эти переменные представляют собой пересекающийся прямоугольник, вероятно, легче понять через образ (очень подробные и профессиональные диаграммы входящие): rectangle intersect for dummies

Как вы можете видеть, минимальное значение желтого (пересекающий) прямоугольник может быть не меньше минимального значения красного прямоугольника. Максимальное значение может быть не меньше максимального значения синего прямоугольника.

+3

nice diagram, +1 :) – Adrian

+0

Добро пожаловать в Stack Overflow. Не запрашивайте продажи в вопросах или ответах. Это хороший способ получить запрет. Если кто-то хочет связаться с вами, они могут сделать это через вашу учетную информацию. –

+2

Это была просто шутка – Gnarlywhale

0

В основном, когда он ищет максимум x_min или min x_max, он сначала спрашивает «какой массив значений x», затем спрашивает «какое значение».

Код x_min = [rect1[0][0], rect2[0][0]].max

специально ищет [rect1 [Первый массив (0)] [первое значение (0)]

Смежные вопросы