Nœuds

Première version

J’ai vu une courte vidéo d’un dessin à la main sur un réseau social quelconque, et j’ai eu envie de le reproduire en \(\LaTeX\). Je n’ai pas pu m’empêcher de généraliser.

La commande \noeud{sommets}{rayon}{épaisseur} dessine un nœud avec :

  • sommets : le nombre de sommets du polygone régulier sur lequel est construit le nœud ;

  • rayon : le rayon du cercle circonscrit au polygone régulier susnommé ;

  • épaisseur : l’épaisseur de la « corde ».

Exemples

../../_images/noeuds1-01.svg

\noeud{3}{1}{1}

../../_images/noeuds1-02.svg

\noeud{4}{1}{.5}

../../_images/noeuds1-03.svg

\noeud{5}{1}{.3}

../../_images/noeuds1-04.svg

\noeud{6}{1}{.15}

../../_images/noeuds1-05.svg

\noeud{7}{1}{.1}

../../_images/noeuds1-06.svg

\noeud{9}{1}{.05}

Mes calculs supposaient que la corde serait assez fine pour ne pas déborder de la boucle voisine. Je m’attendais à une catastrophe, mais vu la manière dont sont construites ces figures, à ma grande surprise, cela produit des tresses.

../../_images/noeuds1-07.svg

\noeud{5}{1}{.7}

../../_images/noeuds1-08.svg

\noeud{6}{1}{.5}

../../_images/noeuds1-09.svg

\noeud{7}{1}{.4}

../../_images/noeuds1-10.svg

\noeud{8}{1}{.3}

% Copyright 2023 Louis Paternault
%
% This work may be distributed and/or modified under the following licences.
%
% LaTeX Project Public Licence
% ----------------------------
%
% This work may be distributed and/or modified under the
% conditions of the LaTeX Project Public License, either version 1.3
% of this license or (at your option) any later version.
% The latest version of this license is in
%   http://www.latex-project.org/lppl.txt
% and version 1.3 or later is part of all distributions of LaTeX
% version 2005/12/01 or later.
%
% Creative Commons by-sa 4.0
% --------------------------
%
% This work may be distributed and/or modified under the
% conditions of the Creative Commons Attribution-ShareAlike 4.0 International
% (CC BY-SA 4.0). The full text of this license is in
% https://creativecommons.org/licenses/by-sa/4.0/

% Compile using LuaLaTeX
%$ lualatex $basename

\documentclass[tikz]{standalone}

\usetikzlibrary{calc}

\newcommand{\noeud}[3]{\begin{tikzpicture}[thick]
    % \noeud{sommets}{rayon}{épaisseur}
    \foreach \k in {1, ..., #1}{
      \fill[white] ({(\k+.5)*360/#1}:{#2*cos(180/#1)})
      -- ({(\k+1)*360/#1}:#2)
      arc[start angle={(\k+.5)*360/#1}, delta angle={360/#1}, radius={#2/(2*cos(180/#1))}]
      -- ++({(\k+1.5)*360/#1}:#3)
      arc[start angle={(\k+1.5)*360/#1}, delta angle={-360/#1}, radius={#2/(2*cos(180/#1))+#3}]
      -- ({(\k+.5)*360/#1}:{#2*cos(180/#1)+#3})
      ;
      \draw[black] ({(\k+.5)*360/#1}:{#2*cos(180/#1)})
      -- ({(\k+1)*360/#1}:#2)
      arc[start angle={(\k+.5)*360/#1}, delta angle={360/#1}, radius={#2/(2*cos(180/#1))}]
      ++({(\k+1.5)*360/#1}:#3)
      arc[start angle={(\k+1.5)*360/#1}, delta angle={-360/#1}, radius={#2/(2*cos(180/#1))+#3}]
      -- ({(\k+.5)*360/#1}:{#2*cos(180/#1)+#3})
      ;
    }

    \foreach \k in {1, ..., #1}{
      \fill[white] ($({\k*360/#1}:#2) + ({\k*360/#1+180/#1}:#3)$) arc[start angle={(\k+.5)*360/#1}, delta angle={-360/#1}, radius={#2/(2*cos(180/#1))+#3}]
      -- ++({(\k-.5)*360/#1}:-#3)
      arc[end angle={(\k+.5)*360/#1}, delta angle={360/#1}, radius={#2/(2*cos(180/#1))}]
    -- ({\k+.5)*360/#1}:{#2*cos(180/#1)})
  -- ({\k+.5)*360/#1}:{#2*cos(180/#1)+#3})
  -- cycle
  ;
  \draw[black]
({\k+.5)*360/#1}:{#2*cos(180/#1)+#3})
-- ($({\k*360/#1}:#2) + ({\k*360/#1+180/#1}:#3)$) arc[start angle={(\k+.5)*360/#1}, delta angle={-360/#1}, radius={#2/(2*cos(180/#1))+#3}]
++({(\k-.5)*360/#1}:-#3)
arc[end angle={(\k+.5)*360/#1}, delta angle={360/#1}, radius={#2/(2*cos(180/#1))}]
  -- ({\k+.5)*360/#1}:{#2*cos(180/#1)})
  ;
}
\end{tikzpicture}}

\begin{document}

\noeud{3}{1}{1}
\noeud{4}{1}{.5}
\noeud{5}{1}{.3}
\noeud{6}{1}{.15}
\noeud{7}{1}{.1}
\noeud{9}{1}{.05}

\noeud{5}{1}{.7}
\noeud{6}{1}{.5}
\noeud{7}{1}{.4}
\noeud{8}{1}{.3}

\end{document}

Explications

Voici comment est construit le nœud suivant.

../../_images/noeuds1-03.svg

Le prodécé est illustré sur l’illustration suivantes.

../../_images/noeuds1-explications-01.png
  1. Comme pour l’étoile, un polyèdre régulier est construit sur le cercle trigonométrique en utilisant les coordonnées polaires (petit pentagone en noir sur la figure).

  2. Puis un second polygone est construit, plus grand que le premier, en respectant l’épaisseur donnée en argument. Ce second polygone est tronqué pour que le raccord des cercles (étape suivante) se fasse correctement.

  3. Des arcs de cercle sont tracés pour relier ces différents segments.

  4. Enfin, pour que le nœud apparaisse certaines parties de la figure viennent en recouvrir d’autres. Pour cela, le remplissage est fait en deux étapes :

    • d’abord les parties rouges ;

    • puis les parties bleues, qui viennent recouvrir les parties rouge.

Bon courage pour décortiquer les mathématiques derrière tout ça (les math ne sont pas si complexes, mais comprendre mon code non documenté l’est beaucoup plus) !

Deuxième version

Après avoir réalisé les nœuds précédents, je suis tombé sur le paquet fiziko (de Sergey Slyusarev), qui réalise mieux en moins de lignes de code. J’ai donc cherché à améliorer ces nœuds, en remplaçant les cercles par des courbes de Bézier. Le résultat est ici.

La commande \noeud{sommets}{saut}{rayon1}{rayon2}{épaisseur}{dureté} dessine un nœud avec :

  • sommets : le nombre de sommets du polygone régulier sur lequel est construit le nœud ;

  • saut : indique le nombre d’arêtes que « saute » une courbe issue d’un sommet du polygone avant de rejoindre le sommet suivant ;

  • rayon1 : le rayon du cercle inscrit dans le polygone régulier central ;

  • rayon2 : le rayon des extrémités des courbes (sans compter l’épaisseur) ;

  • épaisseur : l’épaisseur de la « corde » ;

  • dureté : indique à quel point les courbes doivent êtres « pointues » ou « arrondies ».

Exemples

Tresses

../../_images/noeuds2-01.svg

\noeud{20}{15}{2}{2.2}{.08}{1}

../../_images/noeuds2-02.svg

\noeud{40}{5}{2}{2.4}{.07}{.4}

Rosaces

../../_images/noeuds2-03.svg

\noeud{20}{20}{2}{2.2}{.08}{1}

../../_images/noeuds2-04.svg

\noeud{20}{25}{2}{2.2}{.08}{1}

Inclassables

../../_images/noeuds2-05.svg

\noeud{20}{30}{2}{2.2}{.08}{1}

../../_images/noeuds2-06.svg

\noeud{5}{1}{1}{.8}{.2}{.4}

../../_images/noeuds2-07.svg

\noeud{7}{3}{1}{2}{.2}{3}

Nœuds serrés

../../_images/noeuds2-08.svg

\noeud{3}{1}{1}{2}{1}{1}

../../_images/noeuds2-09.svg

\noeud{4}{1}{1}{1.5}{.5}{.6}

../../_images/noeuds2-10.svg

\noeud{5}{1}{1}{1.5}{.5}{.4}

../../_images/noeuds2-11.svg

\noeud{6}{1}{1}{1.5}{.5}{.4}

../../_images/noeuds2-12.svg

\noeud{8}{1}{1}{1.25}{.25}{.2}

Nœuds avec du jeu

../../_images/noeuds2-13.svg

\noeud{5}{1}{1}{1.5}{.2}{.4}

../../_images/noeuds2-14.svg

\noeud{6}{1}{1}{1.5}{.2}{.4}

Nœuds avec beaucoup de jeu ; Cercles

../../_images/noeuds2-15.svg

\noeud{4}{3}{1}{3}{.2}{3}

../../_images/noeuds2-16.svg

\noeud{5}{2}{1}{2}{.5}{1}

../../_images/noeuds2-17.svg

\noeud{5}{3}{1}{3}{.2}{3}

../../_images/noeuds2-18.svg

\noeud{5}{3}{1}{2}{.2}{1}

../../_images/noeuds2-19.svg

\noeud{5}{2}{1}{2}{.2}{1}

../../_images/noeuds2-20.svg

\noeud{7}{2}{1}{2}{.2}{1}

Fleurs

../../_images/noeuds2-21.svg

\noeud{5}{4}{1}{2}{.5}{1}

../../_images/noeuds2-22.svg

\noeud{5}{5}{1}{2}{.5}{1}

../../_images/noeuds2-23.svg

\noeud{5}{6}{1}{2}{.5}{1}

../../_images/noeuds2-24.svg

\noeud{5}{7}{1}{2}{.5}{1}

../../_images/noeuds2-25.svg

\noeud{7}{5}{1}{2}{.2}{.5}

% Copyright 2023 Louis Paternault
%
% This work may be distributed and/or modified under the following licences.
%
% LaTeX Project Public Licence
% ----------------------------
%
% This work may be distributed and/or modified under the
% conditions of the LaTeX Project Public License, either version 1.3
% of this license or (at your option) any later version.
% The latest version of this license is in
%   http://www.latex-project.org/lppl.txt
% and version 1.3 or later is part of all distributions of LaTeX
% version 2005/12/01 or later.
%
% Creative Commons by-sa 4.0
% --------------------------
%
% This work may be distributed and/or modified under the
% conditions of the Creative Commons Attribution-ShareAlike 4.0 International
% (CC BY-SA 4.0). The full text of this license is in
% https://creativecommons.org/licenses/by-sa/4.0/

% Compile using LuaLaTeX
%$ lualatex $basename

\documentclass[tikz]{standalone}

\usetikzlibrary{calc}

\newcommand{\noeud}[6]{%
  % \noeud{sommets}{saut}{rayon1}{rayon2}{épaisseur}{dureté}
  \begin{tikzpicture}%
    \foreach \i in {1, ..., #1} {
      \fill[white]
      ({(\i-.5)*360/#1}:#3)
      --
      ({\i*360/#1}:{#3/cos(180/#1)})
      ..
      controls
      +({90+360*(\i-.5)/#1}:#6)
      and
      +({90+360*(\i+#2/2)/#1}:{-#6})
      ..
      ({(\i+#2/2)*360/#1}:#4)
      --
      ({(\i+#2/2)*360/#1}:{#4+#5})
      ..
      controls
      +({90+360*(\i+#2/2)/#1}:{-#6*(#4+#5)/#4})
      and
      +({90+360*(\i-.5)/#1}:{#6*(#3+#5)/#3})
      ..
      ($({\i*360/#1}:{#3/cos(180/#1)}) + ({(\i-.5)*360/#1}:#5)$)
      --
      ({(\i-.5)*360/#1}:{#3+#5})
      ;
      \draw[black]
      ({(\i-.5)*360/#1}:#3)
      --
      ({\i*360/#1}:{#3/cos(180/#1)})
      ..
      controls
      +({90+360*(\i-.5)/#1}:#6)
      and
      +({90+360*(\i+#2/2)/#1}:{-#6})
      ..
      ({(\i+#2/2)*360/#1}:#4)
      ;
      \draw[black]
      ({(\i+#2/2)*360/#1}:{#4+#5})
      ..
      controls
      +({90+360*(\i+#2/2)/#1}:{-#6*(#4+#5)/#4})
      and
      +({90+360*(\i-.5)/#1}:{#6*(#3+#5)/#3})
      ..
      ($({\i*360/#1}:{#3/cos(180/#1)}) + ({(\i-.5)*360/#1}:#5)$)
      --
      ({(\i-.5)*360/#1}:{#3+#5})
      ;
    }
    \foreach \i in {1, ..., #1} {
      \fill[white]
      ({(\i-.5)*360/#1}:#3)
      --
      ({(\i-1)*360/#1}:{#3/cos(180/#1)})
      ..
      controls
      +({-90+360*(\i-.5)/#1}:#6)
      and
      +({-90+360*(\i-1-#2/2)/#1}:{-#6})
      ..
      ({(\i-1-#2/2)*360/#1}:#4)
      --
      ({(\i-1-#2/2)*360/#1}:{#4+#5})
      ..
      controls
      +({-90+360*(\i-1-#2/2)/#1}:{-#6*(#4+#5)/#4})
      and
      +({-90+360*(\i-.5)/#1}:{#6*(#3+#5)/#3})
      ..
      ($({(\i-1)*360/#1}:{#3/cos(180/#1)}) + ({(\i-.5)*360/#1}:#5)$)
      --
      ({(\i-.5)*360/#1}:{#3+#5})
      ;
      \draw[black]
      ({(\i-.5)*360/#1}:{#3})
      --
      ({(\i-1)*360/#1}:{#3/cos(180/#1)})
      ..
      controls
      +({-90+360*(\i-.5)/#1}:{#6})
      and
      +({-90+360*(\i-1-#2/2)/#1}:{-#6})
      ..
      ({(\i-1-#2/2)*360/#1}:#4)
      ;
      \draw[black]
      ({(\i-.5)*360/#1}:{#3+#5})
      --
      ($({(\i-1)*360/#1}:{#3/cos(180/#1)}) + ({(\i-.5)*360/#1}:#5)$)
      ..
      controls
      +({-90+360*(\i-.5)/#1}:{#6*(#3+#5)/#3})
      and
      +({-90+360*(\i-1-#2/2)/#1}:{-#6*(#4+#5)/#4})
      ..
      ({(\i-1-#2/2)*360/#1}:{#4+#5})
      ;
    }
  \end{tikzpicture}%
}

\begin{document}

% Tresses
\noeud{20}{15}{2}{2.2}{.08}{1}
\noeud{30}{5}{2}{2.4}{.06}{.4}

% Rosaces
\noeud{20}{20}{2}{2.2}{.08}{1}
\noeud{20}{25}{2}{2.2}{.08}{1}

% Misc
\noeud{20}{30}{2}{2.2}{.08}{1}
\noeud{5}{1}{1}{.8}{.2}{.4}
\noeud{7}{3}{1}{2}{.2}{3}

% Nœuds serrés
\noeud{3}{1}{1}{2}{1}{1}
\noeud{4}{1}{1}{1.5}{.5}{.6}
\noeud{5}{1}{1}{1.5}{.5}{.4}
\noeud{6}{1}{1}{1.5}{.5}{.4}
\noeud{8}{1}{1}{1.25}{.25}{.2}

% Nœuds avec du jeu
\noeud{5}{1}{1}{1.5}{.2}{.4}
\noeud{6}{1}{1}{1.5}{.2}{.4}

% Nœuds larges ; Cercles
\noeud{4}{3}{1}{3}{.2}{3}
\noeud{5}{2}{1}{2}{.5}{1}
\noeud{5}{3}{1}{3}{.2}{3}
\noeud{5}{3}{1}{2}{.2}{1}
\noeud{5}{2}{1}{2}{.2}{1}
\noeud{7}{2}{1}{2}{.2}{1}

% Fleurs
\noeud{5}{4}{1}{2}{.5}{1}
\noeud{5}{5}{1}{2}{.5}{1}
\noeud{5}{6}{1}{2}{.5}{1}
\noeud{5}{7}{1}{2}{.5}{1}
\noeud{7}{5}{1}{2}{.2}{.5}

\end{document}

Quelques explications

Voici comment est construit le nœud suivant (sur la base d’un pentagone).

../../_images/noeuds2-explications-05.png

Ces explications ne présentent que les grandes lignes. Le reste est laissé au lecteur patient : il faut un peu de trigonométrie et de coordonnées polaires.

  1. D’abord, le pentagone intérieur est tracé, ainsi qu’une partie du pentagone extérieur. Notons que chaque segment du (presque) pentagone extérieur est tracé à une distance \(e\) (l’épaisseur) du pentagone intérieur, perpendiculairement. Cela est fait en ajoutant des coordonnées polaires en TikZ.

    ../../_images/noeuds2-explications-01.png
  2. Puis les coordonnées de l’extérieur de la forme sont calculées, en prenant la moyenne des angles des deux sommets correspondant (c’est-à-dire le sommet de départ, auquel on ajoute la moitié du saut). À ce stade, on obtient la forme demandée, mais la courbe a des « angles ».

    ../../_images/noeuds2-explications-02.png
  3. Pour arrondir ces angles, des courbes de Bézier sont utilisées (notation .. controls de TikZ), avec les tangentes suivantes (les « points de contrôle » sont les extrémités de chaque tangente). La figure est terminée, sauf que certains brins devraient passer en dessous des autres.

    ../../_images/noeuds2-explications-03.png
  4. Pour cela, la courbe est dessinée en deux fois : d’abord la partie bleue, qui va être ensuite recouverte par la partie rouge.

    ../../_images/noeuds2-explications-04.png
  5. Et voilà ! Le travail est fait.

    ../../_images/noeuds2-explications-05.png