Courbe de Bézier, accélération, fonction accel(path,real)

Tout ce qui concerne le langage Asymptote. Ce langage est supporté sur le forum via les balises asy.

Modérateur : gdm_asy

Règles du forum
Merci de soigner la rédaction de vos messages et de consulter ce sujet avant de poster. Pensez également à utiliser la fonction recherche du forum.
GMaths
Utilisateur chevronné
Utilisateur chevronné
Messages : 2035
Inscription : lundi 01 octobre 2007, 10:20

Courbe de Bézier, accélération, fonction accel(path,real)

Message par GMaths »

Une rectification en forme d'explication : dans des exemples récents (que je vais devoir modifier), j'ai utilisé la fonction accel... qui semblait fonctionner pour ce que je proposais mais j'ai réalisé après coup que je tombais dans des cas particuliers où l'accélération tangentielle était nulle.

Pour un path (courbe de Bézier), accel ne donne pas l'accélération normale, comme je l'ai cru, mais il correspond à la somme des accélérations normale et tangentielle.
{}
Edition du 31/10/11 : Attention !! il y a une erreur dans le code de cette figure (que je signale dans un message qui suit) mais je la laisse pour la cohérence du sujet.

Comme c'est indiqué sur la figure, accel au point $z_2$ correspond à $6\left(\vec{m_1m_0}+\vec{m_1m_2}\right)$.

Je n'ai pas trouvé de fonction donnant le vecteur vitesse $\vec{v}$, censé être égale à $3\vec{m_3m_4}$. La fonction dir ne donne que le vecteur unitaire qui colinéaire et de même sens que $\vec{v}$.
Dernière modification par GMaths le lundi 31 octobre 2011, 16:04, modifié 1 fois.

GMaths
Utilisateur chevronné
Utilisateur chevronné
Messages : 2035
Inscription : lundi 01 octobre 2007, 10:20

Re: Courbe de Bézier - Accélération - Fonction accel(path,re

Message par GMaths »

L'explication sera encore à parfaire car si là, cela fonctionne :
{}
par contre là, cela explose :
{}
Je reverrai cela plus tard.

De la lecture sur le sujet qu'il faudra que je lise... pour comprendre pourquoi cela ne fonctionne pas dans certains cas.

GMaths
Utilisateur chevronné
Utilisateur chevronné
Messages : 2035
Inscription : lundi 01 octobre 2007, 10:20

Re: Courbe de Bézier - Accélération - Fonction accel(path,re

Message par GMaths »

J'ai refait les calculs :
courbe_bezier.pdf
J'ai refait un cas moins particulier : on peut choisir t.
{}
Attention, j'ai trouvé l'erreur signalée précédemment : l'emploi de dirtime ne fonctionnait pas dans des cas particuliers où il y a des tangentes qui sont parallèles. Le "time" renvoyé n'était pas celui du point étudié.
En plus, la solution était tout simplement de remplacer :

Code : Tout sélectionner

z2--(z2+accel(CourbeBezier,dirtime(CourbeBezier,m4-m3))/6)
par

Code : Tout sélectionner

z2--(z2+accel(CourbeBezier,t)/6)
(avec t=1/2 dans mon premier exemple (moins général que le second) ; je ne sais plus pourquoi j'avais eu l'impression que le "time" du point n'était pas simplement 1/2 dans mon premier cas... ce qui m'avait amené à ce délire avec "dirtime". Passons.).
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.

GMaths
Utilisateur chevronné
Utilisateur chevronné
Messages : 2035
Inscription : lundi 01 octobre 2007, 10:20

Re: Courbe de Bézier - Accélération - Fonction accel(path,re

Message par GMaths »

Pour être complet sur le sujet de la fonction accel, un exemple du champ de vecteurs "accélération" pour un path donné (courbe de Bézier par morceaux)
avec les constructions de ces vecteurs en trois points particuliers (conformément à l'égalité vectorielle donnée sur la figure précédente).

Image

Code : Tout sélectionner

import geometry;
size(15cm,0);
path p=(-5,0)..(20,0)..(20,10)..(0,20)..(-15,10)..(-5,15)..cycle;
draw("p",p); dot(p,2bp+black);
pair po, pa;
for(real k=0; k<length(p); k+=.01)
{
  po=point(p,k);
  pa = po+(accel(p,k))/6;
  draw(po--pa,red);
}
void acceleration(path p, int k, real t){
     pair z0=point(p,k),
          c0=postcontrol(p,k),
          z1=point(p,k+1),
          c1=precontrol(p,k+1),
          m0=(1-t)*z0+t*c0,
          m1=(1-t)*c0+t*c1,
          m2=(1-t)*c1+t*z1,
          m3=(1-t)*m0+t*m1,
          m4=(1-t)*m1+t*m2,
          z2=(1-t)*m3+t*m4;
     path CourbeBezier = z0 .. controls c0 and c1 .. z1;
     draw(CourbeBezier,1bp+blue);
     path lignebrisee = z0 -- c0 -- c1 -- z1;
     draw(lignebrisee^^m0--m1--m2^^m3--m4,linetype("4 4"));
     dot(z0^^z1^^z2,blue); dot(c0^^c1,gray);
     dot(m0--m1--m2^^m3--m4,green);
     draw(z2--(z2+accel(CourbeBezier,t)/6),.8bp+.5green,Arrow());
}
acceleration(p,1,.75);
acceleration(p,3,.75);
acceleration(p,5,.75);
addMargins(2mm,2mm);