jeudi 28 février 2019

polexpr et xint : applications (6)

Comment utiliser la macro \listplot de pst-plot avec xint (1)

Le texte ci-après est de Jean-François Burnol, l'auteur des extensions polexpr et xint :

Récemment, Jürgen Gilg et Thomas Söll m'ont sollicité pour voir comment utiliser la macro \listplot de pst-plot avec xint. Il se trouve que cette macro reçoit des options et comme argument obligatoire simplement des coordonnées (horizontale puis verticale) séparées par un caractère espace. De plus, ce matériel peut être obtenu par expansion à partir des macros, du moment que cela marcherait à l'intérieur d'un \edef.
Comme xintexpr procède de manière purement développable, ses macros sont bien adaptées à ce contexte, d'autant plus qu'il a une syntaxe pour générer des valeurs en progression arithmétique (par exemple t = 0..[3]..300) avec une variable t (la lettre est arbitraire) qui peut alors être utilisée comme paramètre dans des fonctions, disons par exemple seq((t, t^2),t=-10..[0.1]..10).
Un problème se pose de transformer les virgules en les caractères espaces attendus par \listplot, j'ai donc fait une macro \xintthelistplotpoints, c'est une cousine de la macro \xintthecoords de la documentation de xint (elle est plus simple car \listplot contrairement à TikZ ne limite pas le nombre maximal d'expansions).
Ensuite, avec Thomas et Jürgen on a commencé à regarder l'utilisation d'un pas variable puisqu'on peut parfaitement faire seq((t, t^2), t=-10..-5, -5..[0.1]..5, 5..10), et on peut aussi dans la même expression pour xint se faire succéder plusieurs tels seq((X(t),Y(t)), t=), simplement en les séparant par des virgules.
C'est alors que j'ai exploré une idée qui a en fait une riche mathématique sous-jacente, que je n'évoquerai qu'à peine ici : supposons qu'on en est à la valeur T du paramètre, comme choisir le suivant T + ΔT, d'une manière gouvernée par la courbure de la courbe ? Clairement plus la courbure est élevée (rayon de courbure petit) plus il faudrait un ΔT petit, et plus la courbure est plate plus on peut se contenter d'un ΔT (assez) grand.
L'idée suivie a été d'imposer que le nouveau point P + ΔP vérifie la contrainte que |ΔP|≤ η R avec un paramètre η, a priori sans dimensions, mais c'est plus subtil comme nous verrons sous peu. Bien sûr on ne va pas s'amuser à faire des tests jusqu'à trouver un ΔT qui marche donc on fait l'approximation |ΔP| = V ΔT et nous avons notre formule :
ΔT = η R/V.
Comme xint n'est pas un outil de calcul formel (on pourrait utiliser polexpr pour des paramétrisations polynomiales, voire rationnelles avec un peu de travail), l'utilisateur fournit sous formes de fonctions explicites (dans la syntaxe de xint qui est la notation "infix" des opérateurs) la paramétrisation de la courbe, le vecteur vitesse et le vecteur accélération ; ensuite xint calculera tout seul R et le module de la vitesse V. Bien sûr si on a fait tous les calculs à la main et simplifie les formules alors on peut les donner directement à xint.
Les images ci-jointes illustrent les résultats. L'idée de départ était simplement de choisir plus de points là où il faut pour que \listplot (avec plotstyle = curve) fasse une jolie interpolation par des quadriques de Bézier, et moins là où la courbe est plutôt plate.




Dans la pratique, les points d'inflexion (ou plus généralement les points où la courbure s'annule) posent un problème car le ΔT risque d'être grand et du coup la paramètre ira d'un seul coup peut-être au-delà d'un intervalle où la courbe tourne à nouveau. Donc un deuxième paramètre α est utilisé. Il a les dimensions d'une distance, et grosso modo si les zones plates de la courbe parcourt une distance D, il faudrait que α soit au plus D/2 ou D/4. Ça reste un peu artisanal. Il est utilisé via la contrainte ΔT≤ α/V, qui s'ajoute à la formule principale  ΔT ≤ η R/V.
On pourrait aussi simplement prendre un ΔT constant mais il serait dommage de le choisir inutilement grand...
La mathématique sous-jacent est très intéressante et on est obligé d'y réfléchir lorsque l'on fait des animations. L'animation aura N images par seconde. Chaque image passe d'un T au suivant T + ΔT. Numérotons les images par k = 0, 1, 2, .... À l'instant k/N nous sommes au paramètre T_k correspondant au point P_k, et à l'instant k/N + 1/N nous serons au point P_{k+1} et le vecteur de source P_k et de but P_{k+1} est à peu près le vecteur vitesse V_k multiplié par ΔT_k = η R/|V_k|. Cela veut dire que dans la nouvelle paramétrisation par les instants k/N, le nouveau vecteur vitesse est NηR fois le vecteur tangent unitaire. Autrement dit, la nouvelle vitesse est dans un rapport constant (égal à Nη) avec le rayon de courbure !
Cela confirme nos problèmes avec les points où la courbure s'annule, car la vitesse devient infinie.
Un petit calcul mathématique montre qu'avec cette nouvelle paramétrisation, le vecteur tangent unitaire tourne à une vitesse angulaire constante, qui est égale à Nη. Par exemple, avec η=0.1 et N = 10fps, la direction du vecteur vitesse tourne à 1 rad/s. Il peut aussi tourner à -1 rad/s bien sûr, si la concavité de la courbe change, ce changement brusque de la direction de rotation confirme les problèmes de notre paramétrisation aux points de courbure nulle.
Et au passage on voit que η, dans cette interprétation a des dimensions : il est en radians par image. Un η de 0,1 signifie qu'à chaque image, le vecteur vitesse aura tourné d'environ 0,1 radian. Je donnerai plus de détails dans un texte séparé, car la façon dont une variable sans dimension η se retrouve soudainement affecté d'une dimension est un phénomène de renormalisation, qui est tacite à toute notre discussion.
Dans la pratique, l'action du second paramètre α est de ralentir le point dans les zone plates, donc au total le temps de l'animation pour des courbes qui bouclent sur elles-mêmes peut être légèrement supérieur à la rotation absolue complète du vecteur vitesse divisé par la vitesse angulaire théorique de 1 rad/s.
Mais si vous contemplez les animations ci-jointes et jouez au chronométreur, vous obtiendrez des durées qui divisées par 2π auront des significations intéressantes...
Dans ces animations les pointillés verts indiquent la direction du vecteur accélération. En ce qui concerne le code utilisé il sera fourni prochainement car il nécessite un peu de nettoyage.
Pour les fonctions sind() et cosd() on a utilisé des macros ad-hoc, que l'on a regroupées dans un  fichier poormantrig.tex. Car actuellement xint n'a pas encore d'implémentation officielle.
Jean-François Burnol, Mercredi 27 février 2019




Comme le titre indique (1), il y aura une suite : Jean-François Burnol rédigera prochainement la présentation détaillée des problèmes (et des solutions) évoqués ci-dessus avec d'autres exemples et les fichiers sources. 

01/03/2019 : voici la présentation détaillée promise et écrite par Jean-François Burnol :

Le choix des points que nous envoyons à PSTricks via sa macro \listplot a été décrit plus haut :  on procède par des incréments de la paramétrisation de T en T + ∆T avec un ∆T donné par la formule η R/v où R est le rayon de courbure au point de la courbe de paramètre T et v la vitesse de parcours en ce même point. Il se trouve que ceci est une approximation à un procédé « idéal » qui utiliserait des pas constants unités dans une reparamétrisation de la courbe pour laquelle le (nouveau) vecteur vitesse tourne exactement à la vitesse angulaire de η rad/s ou - η rad/s (on change de signe aux points d'inflexion). Le texte mathématique ci-joint fait la théorie sous-jacente.

Paramétrisation par la (variation absolue de la) direction de déplacement

02/03/2019 : Le document  précédent étudiait la paramétrisation d'une courbe par la (variation absolue de la) direction de déplacement, dans le cas général. Voici une application dédiée aux ellipses, écrite par Jean-François Burnol, dans le document  suivant :


 04/03/2019 : les fichiers sources :
Tous les fichiers concernant les applications des extensions polexpr et xint de Jean-François Burnol présentées dans ce blog et des exemples d'utilisation de celles-ci avec PSTricks sont disponibles aussi sur :

Aucun commentaire:

Enregistrer un commentaire