Raphaël - TikZ en JS et des icons !



LMDBT - Le blog



Rédigé le : 19/04/2024

Utilisation de TikZ et du paquet OutilsGeomTikz pour des constructions géométriques

Sommaire

  1. Introduction et illustration
  2. Exemple de code \(\LaTeX\)
  3. Explications du code \(\LaTeX\)

Introduction et illustration

Dans cet article, nous allons explorer comment utiliser TikZ et le paquet OutilsGeomTikz pour créer des constructions géométriques comme dans l’exemple ci-dessous :

Exemple de code \(\LaTeX\)

Voici le code \(\LaTeX\) correspondant à l’image ci-dessus :

\documentclass{standalone}
\usepackage{tikz}
\usepackage{OutilsGeomTikz}
\usepackage{amsmath}
\usepackage{geometry}

\geometry{a4paper, margin=1in}

\newcommand{\drawCross}[2]{
	\draw[line width=1pt] (#1,#2) -- ++(-0.1,-0.1);
	\draw[line width=1pt] (#1,#2) -- ++(0.1,0.1);
	\draw[line width=1pt] (#1,#2) -- ++(-0.1,0.1);
	\draw[line width=1pt] (#1,#2) -- ++(0.1,-0.1);
}

\newcommand{\drawCrossP}[1]{
	\path (#1) coordinate (coord);
	\draw[line width=1pt] (coord) -- ++(-0.1,-0.1);
	\draw[line width=1pt] (coord) -- ++(0.1,0.1);
	\draw[line width=1pt] (coord) -- ++(-0.1,0.1);
	\draw[line width=1pt] (coord) -- ++(0.1,-0.1);
}

\begin{document}
	\begin{minipage}{1\textwidth}
		\begin{minipage}{0.3\textwidth}
			\begin{tikzpicture}[scale=0.6]
				% Définir les points A et O
				\coordinate (O) at (0,0);
				\coordinate (A) at (-1,+2);
				\coordinate (B) at (-3,+3);
				\coordinate (C) at (-3,0);
				\coordinate (D) at (-3,-1.5);
				\coordinate (Ap) at (+1,-2);
				\coordinate (Bp) at (+3,-3);
				
				% Extraire les coordonnées de A
				\path (Ap); \pgfgetlastxy{\Apx}{\Apy};
				% Extraire les coordonnées de B
				\path (Bp); \pgfgetlastxy{\Bpx}{\Bpy};
				
				% Calcul des coordonnées de P après rotation de 20° autour de O en maintenant la même distance
				\coordinate (P) at ({cos(10)*(3) - sin(10)*(-3)},{sin(10)*(+3) + cos(10)*(-3)});
				
				% Tracer les arcs autour de A' et B'
				\draw[red,line width=1pt] (Ap) arc[start angle={atan2(\Apy,\Apx)}, end angle={atan2(sin(25)*\Apx + cos(25)*\Apy,cos(25)*\Apx - sin(25)*\Apy)}, radius={sqrt(\Apx*\Apx + \Apy*\Apy)}];
				\draw[red,line width=1pt] (Ap) arc[start angle={atan2(\Apy,\Apx)}, end angle={atan2(sin(-20)*\Apx + cos(-20)*\Apy,cos(-20)*\Apx - sin(-20)*\Apy)}, radius={sqrt(\Apx*\Apx + \Apy*\Apy)}];
				\draw[red,line width=1pt] (Bp) arc[start angle={atan2(\Bpy,\Bpx)}, end angle={atan2(sin(25)*\Bpx + cos(25)*\Bpy,cos(25)*\Bpx - sin(25)*\Bpy)}, radius={sqrt(\Bpx*\Bpx + \Bpy*\Bpy)}];
				\draw[red,line width=1pt] (Bp) arc[start angle={atan2(\Bpy,\Bpx)}, end angle={atan2(sin(-20)*\Bpx + cos(-20)*\Bpy,cos(-20)*\Bpx - sin(-20)*\Bpy)}, radius={sqrt(\Bpx*\Bpx + \Bpy*\Bpy)}];
				
				\drawCross{0}{0}
				\drawCross{-1}{+2}
				\drawCross{-3}{+3}
				\drawCross{-3}{0}
				\drawCross{-3}{-1.5}
				\drawCross{+1}{-2}
				\drawCross{+3}{-3}
				
				\draw (O) node[below left] {$O$};
				\draw (A) node[above] {$A$};
				\draw (B) node[left] {$B$};
				\draw (C) node[left] {$C$};
				\draw (D) node[left] {$D$};
				\draw (Ap) node[left] {$A'$};
				\draw (Bp) node[right] {$B'$};
				
				\draw[line width=1pt] (A) -- (B);
				\draw[line width=1pt] (D) -- (B);
				\draw[line width=1pt] (C) -- (A);
				\draw[dashed,line width=1pt] (A) -- ($(A)!2.25!(O)$);
				\draw[dashed,line width=1pt] (B) -- ($(B)!2.25!(O)$);
				\draw[line width=1pt,blue!80] (Ap) -- (Bp);
				
				% Codage égalité de longueur
				\draw[line width=0.75pt] ($($(A)!0.48!(O)$)!0.15cm!90:(O)$) -- ($($(A)!0.48!(O)$)!0.15cm!-90:(O)$);
				\draw[line width=0.75pt] ($($(O)!0.48!(Ap)$)!0.15cm!90:(Ap)$) -- ($($(O)!0.48!(Ap)$)!0.15cm!-90:(Ap)$);
				\draw[line width=0.75pt] ($($(A)!0.52!(O)$)!0.15cm!90:(O)$) -- ($($(A)!0.52!(O)$)!0.15cm!-90:(O)$);
				\draw[line width=0.75pt] ($($(O)!0.52!(Ap)$)!0.15cm!90:(Ap)$) -- ($($(O)!0.52!(Ap)$)!0.15cm!-90:(Ap)$);
				
				\draw[line width=0.75pt] ($($(B)!0.6!(O)$)!0.15cm!90:(O)$) -- ($($(B)!0.6!(O)$)!0.15cm!-90:(O)$);
				\draw[line width=0.75pt] ($($(Bp)!0.5!(O)$)!0.15cm!90:(O)$) -- ($($(Bp)!0.5!(O)$)!0.15cm!-90:(O)$);
				
				\tkzCompas[LongueurBranches=4,LongueurCrayon=2,CouleurCrayon=red]{O}{P}
			\end{tikzpicture}
			
			On construit les points $A'$ et $B'$, symétriques des points $A$ et $B$ par rapport a $O$. On trace le segment $[A'B']$.\medskip
			
		\end{minipage}
		\hfill\vline\hfill
		\begin{minipage}{0.3\textwidth}
			\begin{tikzpicture}[scale=0.6]
				% Définir les points A et O
				\coordinate (O) at (0,0);
				\coordinate (A) at (-1,+2);
				\coordinate (B) at (-3,+3);
				\coordinate (C) at (-3,0);
				\coordinate (D) at (-3,-1.5);
				\coordinate (Ap) at (+1,-2);
				\coordinate (Bp) at (+3,-3);
				\coordinate (Dp) at (+3,+1.5);
				
				% Extraire les coordonnées de A et B
				\path (Ap); \pgfgetlastxy{\Apx}{\Apy};
				\path (Bp); \pgfgetlastxy{\Bpx}{\Bpy};
				
				% Extraire les coordonnées de D
				\path (Dp); \pgfgetlastxy{\Dpx}{\Dpy};
				
				% Calcul des coordonnées de P après rotation de 20° autour de O en maintenant la même distance
				\coordinate (P) at ({cos(10)*(3) - sin(10)*(1.5)},{sin(10)*(+3) + cos(10)*(1.5)});
				
				% Tracer les arcs autour de A' et B'
				\draw[red,line width=1pt] (Ap) arc[start angle={atan2(\Apy,\Apx)}, end angle={atan2(sin(25)*\Apx + cos(25)*\Apy,cos(25)*\Apx - sin(25)*\Apy)}, radius={sqrt(\Apx*\Apx + \Apy*\Apy)}];
				\draw[red,line width=1pt] (Ap) arc[start angle={atan2(\Apy,\Apx)}, end angle={atan2(sin(-20)*\Apx + cos(-20)*\Apy,cos(-20)*\Apx - sin(-20)*\Apy)}, radius={sqrt(\Apx*\Apx + \Apy*\Apy)}];
				\draw[red,line width=1pt] (Bp) arc[start angle={atan2(\Bpy,\Bpx)}, end angle={atan2(sin(25)*\Bpx + cos(25)*\Bpy,cos(25)*\Bpx - sin(25)*\Bpy)}, radius={sqrt(\Bpx*\Bpx + \Bpy*\Bpy)}];
				\draw[red,line width=1pt] (Bp) arc[start angle={atan2(\Bpy,\Bpx)}, end angle={atan2(sin(-20)*\Bpx + cos(-20)*\Bpy,cos(-20)*\Bpx - sin(-20)*\Bpy)}, radius={sqrt(\Bpx*\Bpx + \Bpy*\Bpy)}];
				
				% Tracer les arcs autour de D'
				\draw[red,line width=1pt] (Dp) arc[start angle={atan2(\Dpy,\Dpx)}, end angle={atan2(sin(25)*\Dpx + cos(25)*\Dpy,cos(25)*\Dpx - sin(25)*\Dpy)}, radius={sqrt(\Dpx*\Dpx + \Dpy*\Dpy)}];
				\draw[red,line width=1pt] (Dp) arc[start angle={atan2(\Dpy,\Dpx)}, end angle={atan2(sin(-20)*\Dpx + cos(-20)*\Dpy,cos(-20)*\Dpx - sin(-20)*\Dpy)}, radius={sqrt(\Dpx*\Dpx + \Dpy*\Dpy)}];
				
				\drawCross{0}{0}
				\drawCross{-1}{+2}
				\drawCross{-3}{+3}
				\drawCross{-3}{0}
				\drawCross{-3}{-1.5}
				\drawCross{+1}{-2}
				\drawCross{+3}{-3}
				\drawCross{+3}{+1.5}
				
				\draw (O) node[below left] {$O$};
				\draw (A) node[above] {$A$};
				\draw (B) node[left] {$B$};
				\draw (C) node[left] {$C$};
				\draw (D) node[left] {$D$};
				\draw (Ap) node[left] {$A'$};
				\draw (Bp) node[right] {$B'$};
				\draw (Dp) node[right] {$D'$};
				
				\draw[line width=1pt] (A) -- (B);
				\draw[line width=1pt] (D) -- (B);
				\draw[line width=1pt] (C) -- (A);
				\draw[line width=1pt,blue!80] (Ap) -- (Bp);
				\draw[line width=1pt,blue!80] (Dp) -- (Bp);
				\draw[dashed,line width=1pt] (D) -- ($(D)!2.25!(O)$);
				
				% Codage égalité de longueur
				\draw[line width=0.75pt] ($($(D)!0.48!(O)$)!0.15cm!90:(O)$) -- ($($(D)!0.52!(O)$)!0.15cm!-90:(O)$);
				\draw[line width=0.75pt] ($($(Dp)!0.48!(O)$)!0.15cm!90:(O)$) -- ($($(Dp)!0.52!(O)$)!0.15cm!-90:(O)$);
				\draw[line width=0.75pt] ($($(D)!0.52!(O)$)!0.15cm!90:(O)$) -- ($($(D)!0.48!(O)$)!0.15cm!-90:(O)$);
				\draw[line width=0.75pt] ($($(Dp)!0.52!(O)$)!0.15cm!90:(O)$) -- ($($(Dp)!0.48!(O)$)!0.15cm!-90:(O)$);
				
				\tkzCompas[LongueurBranches=4,LongueurCrayon=2,CouleurCrayon=red]{O}{P}
			\end{tikzpicture}
			
			On construit le point $D'$,
			symétrique du point $D$ par
			rapport à $O$. On trace le
			segment $[B'D']$.\medskip
			
		\end{minipage}
		\hfill\vline\hfill
		\begin{minipage}{0.3\textwidth}
			\begin{tikzpicture}[scale=0.6]
				% Définir les points A et O
				\coordinate (O) at (0,0);
				\coordinate (A) at (-1,+2);
				\coordinate (B) at (-3,+3);
				\coordinate (C) at (-3,0);
				\coordinate (D) at (-3,-1.5);
				\coordinate (Ap) at (+1,-2);
				\coordinate (Bp) at (+3,-3);
				\coordinate (Dp) at (+3,+1.5);
				\coordinate (Cp) at (+3,0);
				
				% Extraire les coordonnées de A et B
				\path (Ap); \pgfgetlastxy{\Apx}{\Apy};
				\path (Bp); \pgfgetlastxy{\Bpx}{\Bpy};
				
				% Extraire les coordonnées de D
				\path (Dp); \pgfgetlastxy{\Dpx}{\Dpy};
				
				% Tracer les arcs autour de A' et B'
				\draw[red,line width=1pt] (Ap) arc[start angle={atan2(\Apy,\Apx)}, end angle={atan2(sin(25)*\Apx + cos(25)*\Apy,cos(25)*\Apx - sin(25)*\Apy)}, radius={sqrt(\Apx*\Apx + \Apy*\Apy)}];
				\draw[red,line width=1pt] (Ap) arc[start angle={atan2(\Apy,\Apx)}, end angle={atan2(sin(-20)*\Apx + cos(-20)*\Apy,cos(-20)*\Apx - sin(-20)*\Apy)}, radius={sqrt(\Apx*\Apx + \Apy*\Apy)}];
				\draw[red,line width=1pt] (Bp) arc[start angle={atan2(\Bpy,\Bpx)}, end angle={atan2(sin(25)*\Bpx + cos(25)*\Bpy,cos(25)*\Bpx - sin(25)*\Bpy)}, radius={sqrt(\Bpx*\Bpx + \Bpy*\Bpy)}];
				\draw[red,line width=1pt] (Bp) arc[start angle={atan2(\Bpy,\Bpx)}, end angle={atan2(sin(-20)*\Bpx + cos(-20)*\Bpy,cos(-20)*\Bpx - sin(-20)*\Bpy)}, radius={sqrt(\Bpx*\Bpx + \Bpy*\Bpy)}];
				
				% Tracer les arcs autour de D'
				\draw[red,line width=1pt] (Dp) arc[start angle={atan2(\Dpy,\Dpx)}, end angle={atan2(sin(25)*\Dpx + cos(25)*\Dpy,cos(25)*\Dpx - sin(25)*\Dpy)}, radius={sqrt(\Dpx*\Dpx + \Dpy*\Dpy)}];
				\draw[red,line width=1pt] (Dp) arc[start angle={atan2(\Dpy,\Dpx)}, end angle={atan2(sin(-20)*\Dpx + cos(-20)*\Dpy,cos(-20)*\Dpx - sin(-20)*\Dpy)}, radius={sqrt(\Dpx*\Dpx + \Dpy*\Dpy)}];
				
				\drawCross{0}{0}
				\drawCross{-1}{+2}
				\drawCross{-3}{+3}
				\drawCross{-3}{0}
				\drawCross{-3}{-1.5}
				\drawCross{+1}{-2}
				\drawCross{+3}{-3}
				\drawCross{+3}{+1.5}
				\drawCross{+3}{0}
				
				\draw (O) node[below left] {$O$};
				\draw (A) node[above] {$A$};
				\draw (B) node[left] {$B$};
				\draw (C) node[left] {$C$};
				\draw (D) node[left] {$D$};
				\draw (Ap) node[left] {$A'$};
				\draw (Bp) node[right] {$B'$};
				\draw (Dp) node[above right] {$D'$};
				\draw (Cp) node[right] {$C'$};
				
				\draw[line width=1pt] (A) -- (B);
				\draw[line width=1pt] (D) -- (B);
				\draw[line width=1pt] (C) -- (A);
				\draw[line width=1pt,blue!80] (Ap) -- (Bp);
				\draw[line width=1pt,blue!80] (Dp) -- (Bp);
				\draw[line width=1pt,blue!80] (Cp) -- (Ap);
				\draw[dashed,line width=1pt] (C) -- ($(C)!2!(O)$);
				
				% Codage égalité de longueur
				\draw[line width=0.75pt] ($($(C)!0.47!(O)$)!0.15cm!90:(O)$) -- ($($(C)!0.47!(O)$)!0.15cm!-90:(O)$);
				\draw[line width=0.75pt] ($($(C)!0.5!(O)$)!0.15cm!90:(O)$) -- ($($(C)!0.5!(O)$)!0.15cm!-90:(O)$);
				\draw[line width=0.75pt] ($($(C)!0.53!(O)$)!0.15cm!90:(O)$) -- ($($(C)!0.53!(O)$)!0.15cm!-90:(O)$);
				\draw[line width=0.75pt] ($($(Cp)!0.47!(O)$)!0.15cm!90:(O)$) -- ($($(Cp)!0.47!(O)$)!0.15cm!-90:(O)$);
				\draw[line width=0.75pt] ($($(Cp)!0.5!(O)$)!0.15cm!90:(O)$) -- ($($(Cp)!0.5!(O)$)!0.15cm!-90:(O)$);
				\draw[line width=0.75pt] ($($(Cp)!0.53!(O)$)!0.15cm!90:(O)$) -- ($($(Cp)!0.53!(O)$)!0.15cm!-90:(O)$);
				
				\tkzRegle[Largeur=1.25,Longueur=6.5,Couleur=gray,Rotation=0,Origine={(-3,-0.025)},AfficheValeurs=false]
				\tkzCrayon[Origine={Cp},Echelle=0.75,Longueur=2,Rotation=-30,Couleur=black]
			\end{tikzpicture}
			
			On construit le point $C'$,
			symétrique du point $C$ par
			rapport à $O$. On trace le
			segment $[A'C']$. \medskip
			
		\end{minipage}
	\end{minipage}
\end{document}

Explications du code \(\LaTeX\)

Calcul des coordonnées des points

Dans le code, les points sont définis par des coordonnées cartésiennes. Voici comment nous calculons les coordonnées d’un point après une rotation autour d’un autre point. Par exemple, pour le point P, qui est le résultat de la rotation du point B autour de O :

\coordinate (P) at ({cos(10)*(3) - sin(10)*(-3)},{sin(10)*(+3) + cos(10)*(-3)});

Ce calcul utilise les formules de rotation en coordonnées cartésiennes :

où \(\theta\) est l’angle de rotation, et \((x{,} y)\) sont les coordonnées initiales du point.

Tracé des arcs de cercles

Les arcs de cercles rouges sont tracés en utilisant des commandes TikZ pour les arcs. Voici un exemple :

\draw[red,line width=1pt] (Ap) arc[start angle={atan2(\Apy,\Apx)}, end angle={atan2(sin(25)*\Apx + cos(25)*\Apy,cos(25)*\Apx - sin(25)*\Apy)}, radius={sqrt(\Apx*\Apx + \Apy*\Apy)}];

Cette commande utilise plusieurs fonctions TikZ :

Les angles de début et de fin de l’arc sont définis dynamiquement en fonction des coordonnées des points pour garantir que l’arc est tracé correctement entre les points spécifiés.

Utilisation du compas et de la règle

Le paquet OutilsGeomTikz permet également de dessiner des outils géométriques comme le compas et la règle. Par exemple, pour dessiner un compas :

\tkzCompas[LongueurBranches=4,LongueurCrayon=2,CouleurCrayon=red]{O}{P}

Cette commande dessine un compas avec :

Pour la règle :

\tkzRegle[Largeur=1.25,Longueur=7,Couleur=gray,Rotation=0,Origine={(-3,-0.025)},AfficheValeurs=false]

Cette commande dessine une règle avec :

Crédits et ressources

Merci à Cédric Pierquet pour le paquet OutilsGeomTikz et les nombreux autres paquets qu’il développe et maintient ! 👍

J’utilise ces codes dans mes supports de cours que vous pouvez retrouver dans le projet La TeXiothèque de #LaForgeEdu.