алгоритм упругой / извилистой линии - PullRequest
2 голосов
/ 09 июня 2010

Я делаю графическое приложение, в котором я могу редактировать полилинию, перетаскивая ее контрольную точку. Тем не менее, я хотел бы сделать его немного проще в использовании, делая его эластичным; Перетаскивая контрольную точку, вместо того, чтобы перемещать одну точку, я бы хотел, чтобы точки на определенном расстоянии от этой точки также перемещались в зависимости от того, насколько сильно контрольная точка «вытягивается».

Кто-нибудь знает простой алгоритм для этого? Это может быть довольно элементарно, поскольку основным требованием является скорость.

На самом деле, знать, как вызывать такое поведение, было бы неплохо, поэтому я могу найти его в Google. Я попробовал «извилистую» линию, но, похоже, это относится к активным контурам, а это не то, что я ищу.

Спасибо

Ответы [ 2 ]

4 голосов
/ 09 июня 2010

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

ooooooooo

Каждая вершина связана с другой вершиной пружиной, которая сжимается при растяжениии отталкивать при сдавливании.

Таким образом, когда контрольная точка перемещается, соединенные пружины будут либо расширяться (растягиваться), либо сжиматься (уменьшаться).Это, в свою очередь, применяет силу к любой вершине, разделяющей эту пружину.Поэтому, если я потяну первую вершину вверх и влево, пружина приложит силу к вершине справа, притягивая ее ближе.Это продолжается до следующего (с некоторым рассеиванием энергии), пока все пружины не станут «удобными».

В этом суть, каждый раз, когда перемещается контрольная точка, вам нужно решить уравнение для всех вершин / пружин иОчки будут «змеиными» для вас.

Если вам нужны дополнительные примеры, воспользуйтесь Google «Физика каната» или «Физика ткани» (так как веревка - это 1D ткань).Игнорируйте гравитацию для ваших целей, хотя, очевидно.

2 голосов
/ 09 июня 2010

По сути, вы ищете метод для перемещения (деформации / преобразования) нескольких точек.

Давайте предположим, что вы задали направление и силу перемещения, которые привели бы к dx, dy для точки x,y.

Ваше преобразование будет иметь по крайней мере еще два параметра

  1. Радиус r, в котором будут затронуты точки
  2. Поскольку будут затронуты точки в серединееще и на краю вы должны определить, как интерполировать спад (линейное, нормальное распределение и т. д.)

Для линейных интерполяций затронутые точки будут перемещаться по следующей формуле:

r [i] = sqrt (sqr (xx [i]) + sqr (yy [i]))

, поэтому если r [i]

x [i] '= x [i] + dx * (1-r [i] / r) y [i]' = y [i] + dy * (1-r [i] / r)

это для линейной интерполяции dx [i] = dx - r [i] / r

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...