Как в масиве координат квадратов найти ближайшую к центру квадрат
У меня есть координаты квадратов в масиве
Пример [xmin, xmax, ymin, ymax]
corlist = [[119.474365234375, 134.8798828125, 171.68353271484375, 228.24676513671875], [325.6327819824219, 130.8327178955078, 381.7064514160156, 231.0685577392578], [0.0, 148.31027221679688, 48.696800231933594, 363.5034484863281]]
Я нахожу их центр
def getCenter(val: list) -> list:
return [(val[0] + val[2]) / 2, (val[1] + val[3]) / 2]
centerlist = list(map(getCenter, corlist))
вывод [x, y]
[[145.57894897460938, 181.56332397460938], [353.66961669921875, 180.9506378173828], [24.348400115966797, 255.9068603515625]]
Теперь перейду к проблемному месту как узнать какая из этих координат находится ближе всего к центру? центр: x = 192, y = 192
Я нашел некий код в интернете но он находит ближайший квадрат к центру только когда он находится выше заданного центра, но когда квадраты находятся ниже центра он определяет что ближайший квадрат крайний левый
Вот код
center_value = min(thirdArray, key = lambda x: abs(x-192))
print(center_value)
print(centerlist[thirdArray.index(center_value)])
Весь код целиком
import math
def getCenter(val: list) -> list:
return [(val[0] + val[2]) / 2, (val[1] + val[3]) / 2]
corlist = [[119.474365234375, 134.8798828125, 171.68353271484375, 228.24676513671875, 0.9665088057518005, 15.0], [325.6327819824219, 130.8327178955078, 381.7064514160156, 231.0685577392578, 0.9608761072158813, 15.0], [0.0, 148.31027221679688, 48.696800231933594, 363.5034484863281, 0.9262445569038391, 15.0]]
centerlist = list(map(getCenter, corlist))
print(centerlist)
thirdArray = list(map(lambda array: math.sqrt(array[0]**2 + array[1]**2), centerlist))
print(thirdArray)
center_value = min(thirdArray, key=lambda x: abs(x - 192))
print(center_value)
print(centerlist[thirdArray.index(center_value)])
Ответы (2 шт):
Ваша ошибка в том, что в thirdArray вы находите расстояние от точки (0, 0) до центра квадрата, а затем вычитаете из этих величин 192 (что не имеет смысла).
Вам нужна формула по нахождению расстояния от центра квадрата (x1, y1) до главного центра (x2, y2). Она выглядит так:
s = sqrt((x1 - x2) ** 2 + (y1 - y2) ** 2)
Таким образом, вычисления проводятся следующим образом:
import math
from pprint import pprint
def getCenter(val: list) -> list:
return [(val[0] + val[2]) / 2, (val[1] + val[3]) / 2]
def find_distance(coords1, coords2):
x1, y1 = coords1
x2, y2 = coords2
# Формула
return math.sqrt((x1 - x2) ** 2 + (y1 - y2) ** 2)
corlist = [[119.474365234375, 134.8798828125, 171.68353271484375, 228.24676513671875, 0.9665088057518005, 15.0],
[325.6327819824219, 130.8327178955078, 381.7064514160156, 231.0685577392578, 0.9608761072158813, 15.0],
[0.0, 148.31027221679688, 48.696800231933594, 363.5034484863281, 0.9262445569038391, 15.0]]
center_list = list(map(getCenter, corlist))
pprint(center_list)
CENTER_COORDS = (192, 192)
# Создаём список с кортежами вида:
# (<координаты точки>, <расстояние от точки до главного центра>)
list_with_len = list(map(lambda array: (array,
find_distance(array, CENTER_COORDS)),
center_list))
pprint(list_with_len)
# Находим наименьшее по расстоянию (индекс 1)
center_coords = min(list_with_len, key=lambda x: x[1])[0]
pprint(center_coords)
Результат:
[[145.57894897460938, 181.56332397460938],
[353.66961669921875, 180.9506378173828],
[24.348400115966797, 255.9068603515625]]
[([145.57894897460938, 181.56332397460938], 47.579808582642315),
([353.66961669921875, 180.9506378173828], 162.0467629060049),
([24.348400115966797, 255.9068603515625], 179.41891133230652)]
[145.57894897460938, 181.56332397460938]
Смог решить свою проблему но не уверен что этот метод правильный (Зато работает)
import math
corlist = [[119.474365234375, 134.8798828125, 171.68353271484375, 228.24676513671875, 0.9665088057518005, 15.0], [325.6327819824219, 130.8327178955078, 381.7064514160156, 231.0685577392578, 0.9608761072158813, 15.0], [0.0, 148.31027221679688, 48.696800231933594, 363.5034484863281, 0.9262445569038391, 15.0]]
center = (192, 192)
def getCenter(val: list) -> list:
return [(val[0] + val[2]) / 2, (val[1] + val[3]) / 2]
centerlist = list(map(getCenter, corlist))
print(centerlist)
print(min(centerlist, key=lambda point: math.hypot(center[1] - point[1], center[0] - point[0])))