Примерно вот так:
Парковка элементов относительно друг друга через точки
Point: 1|2|3|4
topLeft topRight
1___2
| |
|___|
4 3
bottomLeft bottomRight
Edges 1
_____
| |
4 | | 2
|_____|
3
Point format:
[targetPoint, itemPoint]
Docking variants:
[1,3] [2,4]
__ __
item -> |_3|______|4_|
target -> |1 2|
__|4____3|__
|_2| |1_|
[4,2] [3,1]
__
|4_|___ __
__|1 2|1_|
|_3|4____3|
|_2|
__
__ ___|_3|
|_2|1 2|__
|4____3|4_|
|1_|
1_________2
|1_| |_2|
|__ __|
|4_|___|_3|
4 3
Я уже реализовывал кучу лет назад данный алгоритм для парковки элементов относительно друг друга с учетом всех важных факторов. И реализация на шарпе получилась объемом в 800 сотен строчек кода с комментариями, при этом сам алгоритм выбора точки - монстр в более чем 300 строчек кода и сплошной набор из пачки ифов глубиной до 6 и до 12 штук подряд, а так же набором свитчей тоже в количестве шести штук и глубиной до двух (местами внутри ифов). И это еще с учетом сокращений за счет некоторых дополнительных математических и логических вычислений. (Откопал еще и JS версию).
Если кому интересно - пишите, могу поделиться кодом.