2013-12-10 4 views
1

Я работаю над клоном прорыва, и я пытался выяснить, как получить прямой пересечение двух сталкивающихся прямоугольников, чтобы я мог измерить, насколько глубоко мяч попал в блок как по оси х, так и по оси y и решить, какой компонент от скорости, которую я отменил.Как сделать прямой от пересечения двух?

Я полагал, что я мог бы рассчитать глубину для каждого случая, как это:

ball collision with blocks

Но если бы я имел прямоугольник пересечения, чем я woudn't придется беспокоиться, если мяч попадает в блок из влево/вправо или верх/низ (так как я бы только обратил внимание на оси x и y соответственно), тем самым экономя меня много набрав.

Я смотрел на Pygame's docs, но кажется, что у него нет функции для этого. Как мне решить эту проблему?

+0

Есть ** много ** дубликатов этого вопроса (например, [Прямоугольное пересечение] (http://stackoverflow.com/questions/7675201/rectangle-intersection)). Пожалуйста, используйте средство поиска, прежде чем размещать новый вопрос ... –

+0

Я ничего не знаю о Pygame, но я полагаю, что он предоставляет некоторый способ получить координаты/размер прямоугольников? В этом случае должно быть относительно просто перевести любое из решений, представленных в любом из [существующих вопросов] (http://stackoverflow.com/search?q=rectangle+intersection)), чтобы использовать Pygame ... –

ответ

5

Если у вас есть прямоугольники r1 и r2, с .left, .right, .top, and .bottom краями, затем

left = max(r1.left, r2.left); 
right = min(r1.right, r2.right); 
top = max(r1.top, r2.top); 
bottom = min(r1.bottom, r2.bottom); 

(с обычным соглашением, координирующего увеличение сверху вниз и слева направо). Наконец, убедитесь, что left<right и top<bottom, и вычислить площадь:

Area = (right - left) * (top - bottom); 

В качестве альтернативы вы можете использовать функцию clip(). Из документов вы связаны в вашем вопросе:

клип (Rect) -> Rect Возвращает новый прямоугольник, который будет вырезан быть полностью внутри аргумента Rect. Если два прямоугольника не начинаются с , то возвращается Rect с 0 размером.

+1

Вы, re право. Он делает именно то, что я хотел. Благодарю. – Jovito

+0

Добро пожаловать. Немного иронично, что я нашел ответ 'clip()' в документах, которые вы связали ... иногда вам нужен еще один набор глаз. Немного странного имени, но когда я увидел, что у них есть 'union(), я понял, что он там, поэтому я читаю более внимательно. – Floris

+0

Да! Знаете, я никогда не задавал вопросов, прежде чем делать поиск в Google и сначала смотреть в документы. Меня это беспокоит, когда я не могу решить такие проблемы самостоятельно. Я, наверное, думал, что '' clip'' был как '' set_clip'', который имеет совершенно другое поведение. Может быть, я должен удалить вопрос, вы думаете? – Jovito