Des intersection avec LaTeX

Dans le cadre de la correction d’un devoir, je cherchais à faire en sorte que tikz puisse me calculer automatiquement les intersections de deux courbes mathématiques. C’est chose faite et je vais commenter un peu avant de présenter le code.

Tout d’abord, nous avons besoin des packages suivants :

\usepackage{tikz}
\usetikzlibrary{hobby,calc,intersections}

Ensuite, à l’intérieur d’un dessin, définissons nos courbes :

\begin{tikzpicture}
  \draw [name path=h] plot [hobby] coordinates {(-4,-2)(-3,2)(-2,6)(0,2)(2,-2)(3,4)} ;
  \draw [name path=f] plot [smooth] (\x,{\x^2 - \x -6}) ;
\end{tikzpicture}

Pour calculer les coordonnées, on trouve dans le manuel de tikz des informations, mais il m’a fallu lire les commentaires sur Extract x, y coordinate of an arbitrary point in TikZ pour comprendre comment faire les choses de la façon la plus efficace. J’ai donc d’abord écrit cette première \definition :

\def\pttocm#1{\pgfmathparse{#1 / 19.93333 }\pgfmathprintnumber{\pgfmathresult}}

qui permet de convertir l’unité de longueur de $\TeX{}$ dans l’unité de longueur de TikZ (cm).

La seconde macro que j’ai utilisé permet ensuite d’afficher les couples de points :

\newcommand{\printcoords}[1]{
  \newdimen\posx
  \newdimen\posy
  \pgfextractx{\posx}{\pgfpointanchor{#1}{center}}
  \pgfextracty{\posy}{\pgfpointanchor{#1}{center}}
  \scriptsize (\pttocm\posx ; \pttocm\posy ) \normalsize
}

Notons l’utilisation de l’ancre center : en effet,pgfgetlastxy{} renvoie le dernier point utilisé par pgf, qui est parfois n’importe où.

Pour finir, afin d’avoir un affichage compatible avec les notations françaises, on n’oublie pas de positionner certaines variables :

\pgfkeys{/pgf/number format/.cd,fixed,precision=1,dec sep={,}}

On a désormais fini nos définitions et nous voulons désormais tracer et obtenir les coordonnées des points d’intersections :

\path [name intersections ={of = h and f }] ;\coordinate (A) at (intersection-1) ;
\draw (A) node[draw,cross] {} ;
\draw (A) node[below left] {\printcoords{A}}  ;

On définit donc un chemin nommé intersections (de f et h). intersection- est la n-ième intersection et donc \coordinate (A) at (intersection-1) ; définit un point A qu’on peut dessiner sous forme d’une croix et dont on peut donner les coordonnées.

Deux pistes d’améliorations :

  • fournir une interface plus haut niveau ;
  • fournir une fonction (macros) qui ne renvoie que X ou que Y.

Et pour conclure, un ECM ! Vous noterez dans celui-ci :

  • l’utilisation de domain=a:b pour restreindre un plot à un intervalle ;
  • que l’algorithme de hobby donne parfois des interpolations étranges : pour le voir, recompilez le document avec smooth.

Vous pouvez insérez les axes et la grille pour obtenir le rendu que je publierais la semaine prochaine.

Tagcloud
IPv6 PlanetUbuntu Informatique dovecot Python Hadopi identification OSM Randonnée Paris Opinions Parinux Réflexions SNCF Société roundcube sieve wifi Mandriva DNS eCryptfs vélo jeu Essai Mutt Coups de gueule compilation Admin Sys sympa Vie numérique PSL sudo auto hébergement Coup de gueule bash configuration Mozilla Web Spam Libre PlanetUbuntuFr postfix April Science-Fiction nfs GPS Internet orgmode JDLL GNU-Linux X.org Debian debug OpenStack AdminSys Dédibox CPL fail Lectures automatisation ArchLinux imap OpenVPN LaTeX ssh KDE dotclear vacance NetworkManager kernel identi.ca Amis Drupal redmine RATP Educ Emacs shell UbuntuFr loop automontage beamer Ubuntu Épinay mail code Iptables Voile LDAP cli vserver Fedora fun Technique Perso Morvan SPF authentification Gentoo installation