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
PSL Mutt bash iSCSI Ubuntu Educ IPv6 authentification LED vélo Informatique vserver kernel identification Mathématiques orgcamp Bordage LaTeX OpenStack Iptables mail Réflexions beamer Libre PlanetUbuntuFr Voile Python postfix configuration Essai Vie numérique April CPL ArchLinux Internet Lectures auto hébergement installation PlanetUbuntu Dédibox shell automatisation Admin Sys dovecot JDLL LDAP Humour noir Web Mandriva Randonnée Fedora Coup de gueule GNU-Linux ssh Coups de gueule RaspberryPi Bretagne AdminSys Hadopi UbuntuFr Science-Fiction CAPES DNS loop ISN Drupal imap sudo sympa Spam Amis jeu nfs sieve fluxbox compilation fun Perso debug RATP dotclear cli OSM KDE Paris roundcube orgmode X.org Emacs Debian Épinay OpenSSL code fail eCryptfs Opinions Gentoo Technique Parinux Mozilla