2016-05-14 2 views
0

У меня есть функция, которая печатает список прямоугольников как этотКак найти Rect, ближайший к данному Rect из их списка?

[<rect(394, 28, 80, 100)>, <rect(394, 126, 80, 100)>, <rect(394, 224, 80, 100)>, <rect(472, 28, 80, 100)>, <rect(472, 126, 80, 100)>] 

и я ищу способ, чтобы соответствовать ближайший Rect из списка выше любого данного Rect.

Например, данный Rect, такой как <rect(377, 231, 50, 70)>, будет соответствовать <rect(394, 224, 80, 100)> и распечатать его.

Я пытался сделать это с кортежем и список кортежей с помощью мин функции как этот

temp_list = [(1, 3), (4, 9), (5, 7), (3, 5), (9, 4), (8, 4), (6, 1)] 
temp_tuple = (5, 11) 

nearest = min(temp_list, key=lambda c: (c[0] - temp_tuple[0]) ** 2 + (c[1] - temp_tuple[1]) ** 2) 

print(nearest) 

, но я не знаю, как бы я заставить его работать на тип данных Rect.

+2

Вы имеете правильное представление о том, что делать в Python, ваша проблема в том, что это не очень хорошо определенно, что расстояние между двумя прямоугольниками является. Должно быть расстояние между центрами? Среднее расстояние между углами? Среднее расстояние между сторонами? –

ответ

0

Что-то вроде этого, используя расстояние между центрами как решающему:

import math 

distance = 1000 

current_cx = current_rect.centerx 
current_cy = current_rect.centery 

for rect in rect_list: 
    cx = rect.centerx 
    cy = rect.centery 

    if math.sqrt(abs(current_cx-cx)**2 + abs(current_cy-cy)**2)) < distance: 
     nearest_rect = rect