Начните с определения потенциальных опорных точек обоих боксов (слева, справа, сверху или снизу). Вы можете сделать простую проверку для этого, например:
Левый край - это потенциальная точка привязки, если другая координатная координата координатного блока меньше, чем текущая ячейка меньшего x-координаты.
Нижний край является потенциальной точкой привязки тогда и только тогда другой коробки «центра Y-координата больше, чем текущее поле» больше у-координат.
И так далее ...
После этого, у вас есть список кандидатов в обоих полях. Фактические опорные точки можно рассчитать как центр края (((edgeLeft + edgeRight)/2, (edgeTop + edgeBottom)/2)
). Теперь вам нужно проверить, какая комбинация приводит к кратчайшей строке. Итерация каждого кандидата:
for each candidate1 in candidates of box 1
for each candidate2 in candidates of box2
...
Теперь проверьте, соответствует ли комбинация пересечению. Например. если candidate1
- левый край, а candidate2
имеет большую координату x, есть пересечение. Пропустите комбинации, которые приводят к пересечению.
Из других комбинаций вычислить длину линии (на самом деле квадрат длины: (candidate1.x-candidate2.x)^2 + (candidate1.y-candidate2.y)^2
). Помните самый короткий, и у вас есть оптимальная линия подключения.
Поскольку у вас есть только 4 опорных точки на коробку, что приводит к 16 возможным комбинациям, вы также можете пропустить поиск кандидатов и проверить все ребра для пересечения.
Вы также можете слить ключ поиска кандидата и пересечения (в результате поиска кандидата в комбинации). Это позволяет вам выбирать жизнеспособные комбинации, где легче проверить пересечения.
Пожалуйста, добавьте небольшой рисунок для иллюстрации, коробки повернуты или под прямым углом ...? –
Нужно также размер ящиков, чтобы рассчитать расстояние, а точки x1, x2, y1, y2 - это центральные координаты ящиков или верхние левые точки. – Roy
Вы можете использовать алгоритм кратчайшего пути, а затем на основе этого координаты вы можете нарисовать линию. см. https://en.wikipedia.org/wiki/Shortest_path_problem – Avinash