2014-01-27 3 views
0

Я пытаюсь реализовать какую-то функцию привязки в WPF для круга (который представляет мою мышь), и он должен привязываться к другому объекту (обычно это будет строка или прямоугольник).Привязка круга к прямоугольнику/линии

enter image description here

Есть ли способ сделать такую ​​функциональность с WPF, не делая все вычисления самостоятельно и, если не существует простой способ (библиотека?), Чтобы получить такую ​​информацию?

Редактировать: Я хочу привязать границу круга к границе прямоугольника/линии.

+0

Не программирует ли это то, зачем программисты программируют? «Библиотеки» скучны. – Sinatr

ответ

1

В качестве первого шага вы должны найти точку на ближайшем к курсору прямоугольнике, а расстояние между ними: расширение краев прямоугольника, вы разбиваете плоскость на 9 областей. В зависимости от региона, в котором находится курсор, искомое расстояние будет равным расстоянию до угла (формула расстояния по Евклидову) или расстоянию до края (разница абсцисс или ординат).

Вычесть радиус круга с этого расстояния. Это скажет вам, достаточно ли вы достаточно близко.

Если имеется возможность привязки, переместите курсор вдоль линии от текущей позиции курсора до ближайшей точки, пока не нажмете на угол или край. Вам нужно будет использовать параметрическое уравнение отрезка линии.

Полная дискуссия требует некоторой осторожности, но включает только простую математику.

Аналогичный подход можно привязать к сегменту линии. Вот трюк: если вы вращаете сегмент линии, чтобы сделать его горизонтальным, вы можете рассматривать сегмент линии как вырожденный прямоугольник и использовать тот же алгоритм привязки. Поверните сегмент линии и курсор, примените логику привязки и затем поверните обновленный курсор против часовой стрелки.

1

Для такой функции требуется всего несколько строк кода для копирования ... Я сомневаюсь, что вы найдете «библиотеку» кода, чтобы сделать это за вас. Способ заключается в следующем:

Сохраните коллекцию, содержащую 4 Point s, которые образуют ограничивающий прямоугольник каждой формы. Затем вам необходимо обработать событие MouseMove на Canvas или контейнере формы. В этом случае вам просто нужно выяснить, находится ли текущая позиция мыши на некотором расстоянии от любого из краев формы ... у вас будет немного больше работы с непрямоугольными фигурами для вычисления их краев, но Принципал тот же.

Если вы обнаруживаете присутствие близлежащей фигуры, вам просто нужно изменить значение ближайшего измерения на значение близкой формы ... привязка. Вот и все ... гораздо проще, чем вы думаете.

Смежные вопросы