10 votes

Comment puis-je convertir curveTo() en une liste de Points ?

Prenez le AS3 suivant qui dessinera une ligne courbe en utilisant curveTo():

var line:Shape = new Shape();

line.x = line.y = 20;
line.graphics.lineStyle(2, 0xFF0000);
line.graphics.curveTo(200, 200, 200, 0);

addChild(line);

Le résultat visuel est le suivant :

enter image description here

Maintenant je veux que quelque chose soit capable de suivre ce chemin; comment puis-je convertir ce visuel en une liste de coordonnées ? J'ai du mal avec les mathématiques avancées, mais je suppose qu'il y a une formule évidente (pour certains) que curveTo() utilise pour créer ce qui précède que je peux reproduire et modifier pour créer ma liste souhaitée.

Le résultat peut ressembler à ceci (en supposant un décalage d'environ 5px entre les points).

Vector. = [
    new Point(20, 20),
    new Point(23, 23),
    new Point(27, 28),
    new Point(33, 32),
    new Point(40, 37)
    /* ...etc... */
];

Le résultat sera utilisé pour des choses telles que la création d'une pluie de projectiles suivant les chemins suivants, par exemple :

enter image description here

14voto

kappamaki Points 588

En lisant la documentation ActionScript, je comprends que la méthode curveTo en action script génère une courbe de Bézier quadratique.

La courbe est composée de trois "points de contrôle" que vous avez spécifiés dans votre code :

point de contrôle 1 (p1) = (20,20)
point de contrôle 2 (p2) = (200,200)
point de contrôle 3 (p3) = (200,0)

Pour interpoler une valeur le long de la courbe à une valeur u allant de 0 à 1 (0 étant le point de départ et 1 étant le point final), vous pouvez utiliser ce qu'on appelle les polynômes de Bernstein. Pour une courbe quadratique (votre cas), les polynômes sont les suivants :

B1 = (1 - u) * (1 - u)
B2 = 2 * u * (1 - u)
B3 = u * u

Calculez simplement ces nombres pour la valeur du paramètre u et ajoutez ensemble les points de contrôle multipliés par leurs polynômes de Bernstein correspondants.

point sur la courbe au paramètre *u* = p1 * B1 + p2 * b2 + p3 * B3

Ainsi, par exemple, si vous voulez obtenir 5 points le long de la courbe, vous calculerez les points le long de la courbe aux valeurs de paramètre 0, 0.25, 0.5, 0.75, et 1.0

3voto

weltraumpirat Points 18030

curveTo() est utilisé pour dessiner une courbe de Bézier quadratique, où une courbe de Bézier est calculée entre deux points d'extrémité et en relation avec deux points d'ancrage, et une courbe de Bézier quadratique est une courbe où les deux points d'ancrage ont les mêmes coordonnées.

Les courbes de Bézier sont calculées par plusieurs équations qui vous permettent de trouver les coordonnées x et y pour un point qui est atteint à un moment donné le long du chemin, donc ceci répond déjà assez bien à vos besoins. Vous pouvez trouver des informations générales sur les courbes de Bézier sur cette page.

Tout ce que vous avez à faire pour obtenir les points de coordonnée est de traduire ces équations en ActionScript. Et heureusement, Paul Tondeur a un joli article de blog montrant comment faire cela. Sa solution est utilisée pour dessiner des courbes de Bézier cubiques, mais vous pouvez facilement modifier le code pour retourner les coordonnées pour ce que vous essayez de faire.

1voto

Daniel Points 5403

```html

Une courbe de Bézier est une fonction paramétrique. Une courbe de Bézier quadratique (c'est-à-dire trois points de contrôle) peut être exprimée comme suit : F(t) = A(1 - t)^2 + B(1 - t)t + Ct^2 où A, B et C sont des points et t va de zéro à un.

Cela vous donnera deux équations:

x = a(1 - t)^2 + b(1 - t)t + ct^2

y = d(1 - t)^2 + e(1 - t)t + ft^2

Si vous ajoutez par exemple l'équation de la droite (y = kx + m) à cela, vous vous retrouverez avec trois équations et trois inconnues (x, y et t).

à partir de : Comment trouver la fonction mathématique définissant une courbe de Bézier

en utilisant cette équation, vous pouvez créer un tableau de coordonnées x et y

```

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X