2009-05-27 1 views
2

У меня возникли проблемы с тем, чтобы обдумать, как это кодировать, и будет признателен за любую помощь.Руководство по эффекту привязки к краю

alt text http://agutie.homestead.com/FiLEs/triangle_square/triangle_square_03.gif

На картинке выше что-то я гугле быстро, но изображает достойный пример. Представьте, что квадраты и треугольник могут перемещаться пользователем. Если пользователь перетаскивает и отбрасывает квадрат BGFC «рядом» с треугольником ABC, я хотел бы автоматически привязать/переместить квадрат, чтобы выровняться с краем треугольников. Вершины не должны совпадать (и предпочтительнее не будет так, чтобы привязка не была настолько ограничительной), я просто хочу переместить квадрат так, чтобы его ближайший край пересекался с ближайшим краем треугольников.

Предоставленный доступ ко всем координатам/вершинам/углам, существует ли какой-либо разумно простой способ достижения этого эффекта привязки к краю?

Если это слишком сложный пример, как насчет двух прямоугольников со всеми углами 90 градусов в одной и той же ситуации? Перетаскивая один прямоугольник рядом с другим и автоматически привязывая прямоугольник к краю другого.

Я предполагаю, что есть математический способ снять это, что я буду рад исследованию, учитывая толчок в правильном направлении. Спасибо за вашу помощь!

ответ

3

alt text http://img529.imageshack.us/img529/7607/trianglesquare01.gif

Первое изображение показывает треугольник и квадрат. Сторона треугольника следует за линией l (1), а сторона квадрата следует за другой линией l (2).

Теперь мы хотим определить расстояние между линиями. Позволяет называть его d. Это значение определит, следует ли перемещать квадрат или нет. Как вы упомянули в своем вопросе, мы знаем все координаты и все углы, что означает, что уравнения линий также известны.

Предполагая, что мы знаем d. Теперь мы хотим рассчитать смещение (dx, dy). На следующем изображении показана увеличенная часть первого изображения.

alt text http://img529.imageshack.us/img529/161/trianglesquare02v.gif

Мы знаем, что угол а в треугольнике так что мы имеем:

dx = d * sin a 
dy = d * cos a 

Все, что вам нужно знать сейчас, как рассчитать расстояние D между двумя parallell линиями. Я оставляю это как упражнение для вас. Вот ссылка, чтобы вы начали:

The Perpendicular Distance between two Parallel Lines

Et Voila!

Редактировать

Вы должны извинить мой L337 фотошоп Skillz. Но я надеюсь, что они проиллюстрируют достаточно.