Je regarde autour de moi depuis un moment et je ne trouve pas de solution à ce problème. Disons que j'ai une courbe de Bézier cubique (définie par 4 points) et que je veux obtenir un ensemble de points qui sont espacés uniformément le long de la courbe. Pensez à placer un texte le long d'une courbe pour un exemple.
Maintenant, le problème est que si j'entre t
(valeur d'interpolation de 0-1) avec un incrément constant, les points ne sont pas espacés uniformément. La distance le long de la courbe est plus petite lorsque la courbe fait un virage et plus longue lorsque la courbe est droite.
Alors, comment puis-je placer des points uniformément le long d'une courbe de Bézier?
interpolation
curves
beziers
Foaly
la source
la source
t
, disons, 100 pas, et mesurez les distances entre les points résultants. Ensuite, interpolez le long de cette polyligne comme vous le souhaitez.Réponses:
C'est plus une question mathématique. Ainsi, une courbe de Bézier a la formule suivante , à la fois dans le composant
x
ety
.La longueur parcourue le
t
long d'une courbegamma
est donnée par:Il n'y a pas de solution inscriptible par l'homme à l'intégrale, vous devez donc approximer.
Remplacez l'
gamma(t)
expression parB(t)
pour obtenir la longueurlength_B
parcourue let
long du segment de Bézier. Disons que ça voyage de0
àL
.Choisissez maintenant des
n
valeurs comprises entre0
etL
qui correspondent aux points régulièrement espacés. Par exemple, les longueurs du formulairek*L/n
pourk
de0
àn
.Vous devez maintenant inverser la fonction
length_B
, afin de pouvoir calculer let
dos à partir de la longueurl
. C'est beaucoup de mathématiques et je suis paresseux comme l'enfer, essayez de le faire vous-même. Si vous ne le pouvez pas, vous pouvez accéder à l' échange de pile mathématique . Pour une réponse plus complète, vous pouvez quand même vous y rendre.Une fois que vous avez cette
length_B
fonction inverse (ou une approximation raisonnable), votre processus est assez simple.l[k]
de distance de chemin données à partir de l'origine(P0_x,P1_x)
.t[k]
utilisation correspondantelength_B_inverse
.(B_x(t[k]),B_y(t[k]))
.la source
Eh bien, cela fait un certain temps ...
Mais j'ai finalement pu résoudre ce problème!
Tout ce dont vous avez besoin est dans cet article: Déplacer des navires entre deux planètes le long d'un bezier, sans équations d'accélération
la source
Pour développer ce que Marco a dit, une technique courante consiste à descendre la courbe par incréments beaucoup plus petits que les pas de longueur fixe que vous souhaitez prendre et à stocker le point de sortie résultant (et peut-être la distance?) Dans un tableau.
Ensuite, vous parcourez le tableau et supprimez toutes les entrées, à l'exception des points les plus proches des multiples entiers des distances que vous souhaitez parcourir.
Il vous reste alors une table que vous pouvez indexer directement au moment de l'exécution très rapidement. Si vous voulez aller à l'endroit qui est 5 fois la taille de votre distance, vous regardez dans votre tableau à l'index [5].
Notez que vous pouvez effectuer les deux étapes en une et ne pas réellement stocker les éléments supplémentaires dans le tableau pour commencer, mais il est plus facile de visualiser et de comprendre en deux étapes.
J'ai vu une fois une technique pour calculer cela à la volée sans précalculer une table (il n'a pas non plus utilisé d'itération / recherche de racine!), Mais malheureusement je ne me souviens pas du tout des détails):
Si je m'en souviens ou le trouve, je posterai les informations!
la source
Étape 1 - Générez N + 1 points en interpolant la courbe par incréments de 1 / N. N doit être suffisamment grand pour de bons résultats visuels mais suffisamment petit pour être facilement calculé. Une valeur de 50 devrait être OK pour la plupart des situations, mais elle doit être réglée pour votre cas spécifique. J'appellerai cela les "points interpolés".
Alternativement, vous pouvez générer une courte liste de segments et rompre récursivement chaque segment qui est plus long que la longueur de segment maximale souhaitée (initialement, vous devez générer au moins quatre segments pour tenir compte des courbes S où le début est très proche de la fin).
Étape 2 - "Parcourez la ligne" en utilisant les points interpolés et l'espacement souhaité entre chaque point.
Je laisse ici mon code Unity:
la source
Voici un algorithme qui donne des résultats assez corrects:
la source