2010-06-09 4 views
2

Je fais une application graphique dans laquelle je peux éditer une polyligne en faisant glisser le point de contrôle de celle-ci. Cependant, je voudrais le rendre un peu plus facile à utiliser en le rendant élastique; Lorsque vous faites glisser un point de contrôle, au lieu de déplacer un seul point, je souhaite que les points situés à une certaine distance de ce point soient également déplacés, en fonction de la force du point de contrôle.algorithme de ligne élastique/serpentin

Est-ce que quelqu'un connaît un algorithme simple pour cela? Il peut être assez rudimentaire, car la principale exigence est la vitesse.

En fait, sachant comment appeler un tel comportement serait également agréable, donc je peux le rechercher sur google. J'ai essayé la ligne 'serpent', mais cela semble se référer à des contours actifs, ce qui n'est pas ce que je cherche.

Merci

Répondre

2

Fondamentalement, vous recherchez une méthode pour déplacer (déformer/transformer) plusieurs points. Supposons que vous ayez donné la direction et la force du mouvement qui aurait pour résultat dx, dy pour le point x, y.

Votre transformation aura au moins deux paramètres

  1. Le rayon r dans lequel les points seront affectés
  2. Comme les points au milieu seraient plus touchés et au bord, vous devez définir comment interpoler l'atténuation (linéaire, distribution normale, etc ...))

Pour des interpolations linéaires des points qui sont affectés se déplacer en fonction de la formule suivante:

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

donc si r [i] < r

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

ceci est pour l'interpolation linéaire dx [i] = dx - r [i]/r

+0

Merci, après avoir lu au sujet de cette physique de la corde, un est venu à la conclusion comme vous l'avez fait; ce n'était clairement pas ce que je cherchais :) Cependant, la méthode que vous avez suggérée est sur place. Je l'ai mis en œuvre avec un rayon variable (deux fois la force du mouvement), ce qui semble assez bien fonctionner. – vhdirk

4

Au niveau simple, vous pourriez y parvenir avec la loi d'une petite forme d'aide Hooke. Vous pouvez voir essentiellement polyligne comme une chaîne, composée d'une charge de sommets reliés par des ressorts:

oooOOOooo

Chaque sommet est relié à un autre sommet par un ressort, qui se contracte si tendu et repousser si écrasé . Ainsi, lorsqu'un point de contrôle est déplacé, les ressorts connectés se dilatent (se rétrécissent) ou se contractent (rétrécissent). Ceci, à son tour, applique une force à tout partage de vertex au printemps. Donc, si je tirais le premier sommet vers le haut et vers la gauche, le ressort appliquerait une force au sommet vers la droite, en le rapprochant. Cela continue à l'autre (avec une certaine dissipation d'énergie) jusqu'à ce que tous les ressorts soient "confortables". C'est le principe de base, chaque fois qu'un point de contrôle se déplace, vous devez résoudre l'équation à tous les sommets/ressorts et les points vont «serpent» pour vous.

Si vous voulez d'autres exemples google pour «physique de la corde» ou «physique du tissu» (comme une corde est un tissu 1D). Ignorez la gravité pour vos besoins bien évidemment.

+0

Merci beaucoup, c'est exactement ce dont j'avais besoin. – vhdirk

+0

@ vhdirk/davbryn, je doute que c'est ce dont vous avez besoin; La loi de hooke ne modélise pas comment les points de contrôle de la polyligne bougeraient, et vous ne pourriez même pas établir un ensemble d'équations à résoudre sans autres conditions (qui détermineraient alors le comportement réel). La physique des cordes et la physique du tissu sont aussi beaucoup plus sur les matériaux non étirables dans un champ de gravité et/ou avec des forces externes appliquées (plus sur la forme qu'il forme) et (imo) est beaucoup trop compliqué. – Unreason