Découper au laser son tapis de Sierpiński

Piste bleue Le 5 avril 2015  - Ecrit par  Aurélien Alvarez Voir les commentaires (11)

Dans un article précédent, Douze jeunes à l’Institut culturel de Google, je racontais comment imprimer des nœuds, une chouette activité mêlant mathématiques, modélisation, programmation et impression 3D. Dans le même esprit, c’est de découpe laser dont il sera question dans cet article.

En 2018 ouvrira Le grand musée égyptien du Caire comme nous l’a raconté Serge Cantat il y a quelques semaines. Et nous y avons appris que les pharaons du Caire pourraient bientôt contempler le triangle de Sierpiński puisque les architectes du futur « grand musée égyptien » ont en effet conçu une façade imposante qui en reprend le motif principal.

PNG - 429.9 ko
Vue d’artiste du futur musée
Image tirée du site web du cabinet d’architecte « heneghan peng architects ».

Le héros de cet article sera non pas le triangle de Sierpiński mais le tapis de Sierpiński, dans des dimensions beaucoup plus raisonnables, qui plus est. Les constructions du triangle et du tapis s’appuient sur les mêmes idées ; dans le premier cas on part d’un triangle équilatéral, dans le second d’un carré. Si on veut fabriquer le triangle de Sierpiński dans un matériau réel, on rencontre un problème de fragilité : une fois le triangle central retiré, les trois petits triangles restant ne tiennent plus entre eux que par les sommets. Pour ce que nous souhaitons faire, il nous faut donc quelque chose d’un peu plus « robuste » comme le tapis.

Dans les prochaines lignes, il sera notamment question de fractale et d’algorithme. De quoi ?

À propos de fractales, mentionnons le reportage Fractales - À la recherche de la dimension cachée qui montre de nombreux exemples de fractales dans la nature. Quant aux algorithmes, n’hésitez pas à lire ou relire Dis maman (ou papa), c’est quoi un algorithme dans ce monde numérique ?
 écrit avec la complicité de Thierry Viéville.

Zoomez dans l’image ci-dessous pour une première rencontre avec ces deux notions :-) [1]

Le tapis de Sierpiński

Ce tapis doit son nom au mathématicien polonais Wacław Sierpiński. Davantage encore qu’un tapis, il s’agit surtout d’une fractale que l’on obtient à partir d’un carré que l’on subdivise en neuf carrés avant de supprimer le carré central. Et on recommence la même procédure sur chacun des huit petits carrés restants. Voici les premières étapes de cette construction qui date de 1916.

GIF - 183 ko
Cliquer sur l’image

Dans mon université, nous avons la chance de disposer d’un fablab, le Fablab orléanais. On y trouve plein de machines diverses et variées, comme des imprimantes 3D bien sûr mais aussi une découpe laser, répondant au doux nom de TROTEC SPEEDY 400 ; cette dernière permet de faire de la gravure et de découper des pièces de bois ou de plastique (PMMA) de moins de 10 mm d’épaisseur.

JPEG - 8.2 ko
La découpe laser TROTEC SPEEDY 400

C’est exactement ce qu’il nous fallait pour fabriquer notre propre tapis de Sierpiński !

Mon laboratoire [2] accueille régulièrement des collégiens de 3° qui viennent faire un stage d’une semaine. Ils y découvrent un peu le monde de la recherche et certains chercheurs n’hésitent pas à prendre le temps de raconter un peu de science à ces jeunes plutôt motivés. C’est donc avec l’aide d’un collégien venu faire son stage récemment que nous nous sommes attelés à la tâche de fabriquer notre tapis ! Voici le résultat.

JPEG - 100.8 ko

Le « vrai » tapis de Sierpiński, c’est l’objet limite, celui qu’on obtient quand on itère indéfiniment la procédure de découper chaque carré en neufs carrés plus petits avant de supprimer le carré central. Mais dans la réalité, on s’arrête au bout d’un certain nombre d’étapes.

Pouvez-vous deviner à quelle étape on s’est arrêté sur l’image précédente ? [3]

Quand j’ai montré notre tapis à un collègue au retour du fablab et qu’il l’a pris dans ses mains, celui-ci m’a de suite dit : « je vois bien que vous n’êtes pas allés jusqu’à l’infini, sinon ton tapis serait de masse nulle ! ». Fin de la blague :-). On voit effectivement sur l’image cinq tailles de trou. Quant à la boutade de notre ami mathématicien, elle sera démystifiée dans les prochaines lignes...

Comment fabriquer un tel tapis en pratique ?

La première étape, c’est de générer l’image du tapis, du moins une approximation à l’ordre $n$. Nous allons donc écrire une fonction qui, étant donné un carré de côté $L$, retourne les neuf petits carrés de côté $L/3$. Pour cela repérons un carré par la donnée des coordonnées de son coin supérieur gauche et de la longueur de ses côtés. L’axe des abscisses ira comme d’habitude de gauche à droite mais l’axe des ordonnées de haut en bas, de sorte que nous ne travaillerons qu’avec des coordonnées positives ; le coin supérieur gauche du carré initial aura pour coordonnées le couple $(0,0)$ [4]. Puisque nous le supposerons de taille 1 par convention, on le notera donc [0,0,1]. Après la première itération, nous obtiendrons les huit petits carrés positionnés ainsi :

3 sur la première ligne : a = [0,0,1/3], b = [1/3,0,1/3], c = [2/3,0,1/3],
2 sur la deuxième ligne : d = [0,1/3,1/3], e = [2/3,1/3,1/3],
3 sur la dernière ligne : f = [0,2/3,1/3], g = [1/3,2/3,1/3], h = [2/3,2/3,1/3]

et le trou central sur la deuxième ligne

t = [1/3,1/3,1/3].

Il suffit donc à chaque étape de stocker la liste des petits carrés et celle des trous, comme ci-dessus. On itère alors notre fonction sur chaque petit carré nouvellement créé de la liste des petits carrés, etc.

Voici un programme écrit en Python qui génère la liste des trous jusqu’à l’ordre $n$.

#Fonction qui prend un carré en entrée et renvoie les huit petits carrés et le trou central
def iteration(carre):
   L = carre[2]/3
   a = [carre[0],carre[1],L]
   b = [carre[0]+L,carre[1],L]
   c = [carre[0]+2*L,carre[1],L]
   d = [carre[0],carre[1]+L,L]
   e = [carre[0]+2*L,carre[1]+L,L]
   f = [carre[0],carre[1]+2*L,L]
   g = [carre[0]+L,carre[1]+2*L,L]
   h = [carre[0]+2*L,carre[1]+2*L,L]
   t = [carre[0]+L,carre[1]+L,L]
   return [a,b,c,d,e,f,g,h],t

#Paramètres et conditions initiales du programme
n = 4
carreInitial = [0,0,1]
tapis = [[carreInitial]]
trousTapis = []

#Partie principale du programme
for _ in range(n):
   fool = []
   for x in tapis[-1]:
       bar = iteration(x)
       fool += bar[0]
       trousTapis.append(bar[1])
   tapis.append(fool)

#Affichage à l'écran de la liste des trous jusqu'à l'ordre n
print(trousTapis)

Dernière étape : disposant de la liste des trous jusqu’à l’ordre $n$, il ne reste plus qu’à créer une image en partant d’un carré noir et en dessinant un carré blanc pour chacun des trous de notre liste.

Rien de plus simple en modifiant légèrement notre programme.

#Chargement de la librairie {matplotlib} pour créer une image et dessiner des rectangles
import matplotlib.pyplot as plt
import matplotlib.patches as patches

#Fonction qui prend un carré en entrée et renvoie les huit petits carrés et le trou central
def iteration(carre):
   L = carre[2]/3
   a = [carre[0],carre[1],L]
   b = [carre[0]+L,carre[1],L]
   c = [carre[0]+2*L,carre[1],L]
   d = [carre[0],carre[1]+L,L]
   e = [carre[0]+2*L,carre[1]+L,L]
   f = [carre[0],carre[1]+2*L,L]
   g = [carre[0]+L,carre[1]+2*L,L]
   h = [carre[0]+2*L,carre[1]+2*L,L]
   t = [carre[0]+L,carre[1]+L,L]
   return [a,b,c,d,e,f,g,h],t

#Paramètres et conditions initiales du programme
n = 4
carreInitial = [0,0,1]
tapis = [[carreInitial]]

#Initialisation de la figure et du carré initial noir
fig = plt.figure()
ax = fig.add_subplot(111, aspect='equal')
ax.axis('off')
ax.set_xticklabels([])
ax.set_yticklabels([])
ax.add_patch(patches.Rectangle((carreInitial[0],carreInitial[1]),carreInitial[2],carreInitial[2],facecolor="black"))

#Fonction principale du programme modifiée pour dessiner les carrés blancs à chaque itération
for _ in range(n):
   fool = []
   for x in tapis[-1]:
       bar = iteration(x)
       fool += bar[0]
       ax.add_patch(patches.Rectangle((bar[1][0],bar[1][1]),bar[1][2],bar[1][2],linewidth=0.1,facecolor="white"))
   tapis.append(fool)

#Sauvegarde de la figure
fig.savefig('tapis.png', dpi=90, bbox_inches='tight')

L’ultime étape, c’est de transmettre ce fichier à la découpe laser. Pour cela, il y a un dernier travail à faire pour expliquer au logiciel de la machine où découper : dans notre cas, c’est facile puisque c’est précisément sur les bords des carrés blancs. On ajuste également quelques paramètres du laser (vitesse, puissance du faisceau selon la matière, etc.) et c’est parti ! [5] Regarder la machine travailler est assez spectaculaire (au moins la première fois qu’on la voit !) de par la rapidité d’exécution et la précision du déplacement du laser. Un très bel outil, relativement simple à utiliser au final.

Quelques mots de plus sur ce tapis

Quelle est l’aire du tapis ? Le carré initial était d’aire $1 \times 1 = 1$. Après la première itération, son aire a été multipliée par $\frac{8}{9}$ puisque nous avons gardé 8 des 9 petits carrés. Plus généralement, à chaque étape, on multiplie l’aire par $\frac{8}{9}$ pour chaque petit carré, donc pour l’objet global. L’aire à l’étape $n$ est donc de $(\frac{8}{9})^n$. Quand $n$ tend vers l’infini, cette aire tend vers 0. Et si le tapis de Sierpiński est d’aire nulle, sa masse aussi ! [6]

Devinette : combien de trous possède le tapis d’ordre $n$ ?

La construction crée à chaque itération un trou et huit petits carrés d’une certaine façon. Le nombre total de trous, c’est donc $1+8+8^2+\cdots+8^{n-1}$ pour $n \geq 1$. Dans notre cas, nous avions $n=5$, soit 4681 trous. Pour donner un ordre d’idée, cette découpe a pris une trentaine de minutes avec un carré de bois de 10 cm de côté, soit presque trois trous chaque seconde.

Les mathématiciens attribuent à cet objet d’aire nulle une dimension. Mais pas une dimension comme expliquée dans Dimensions. Une dimension fractale qu’on appelle aussi dimension de Hausdorff. Sans rentrer dans les détails car c’est une notion assez subtile à définir, la dimension du tapis de Sierpiński est de $\frac{\log 8}{\log 3}$, ce qui reflète le fait qu’à chaque étape, on construit huit répliques de la figure précédente, chacune étant trois fois plus petite que la précédente. Soit une dimension d’environ 1,89... Une dimension non entière donc ! Mais proche de 2 tout de même. Et 2, c’est la dimension du plan ou de la surface de la Terre comme expliqué justement dans le chapitre 1 de Dimensions. Comme quoi, bien que d’aire nulle, le tapis n’est pas si loin que ça d’être une surface...

Si l’on regarde la diagonale du tapis, on retrouve l’ensemble triadique de Cantor [7]. Quant à la généralisation en dimension 3 du tapis, c’est la courbe de Menger comme nous le racontent Étienne Ghys et Jos Leys dans leur article. Courbe (on parle encore d’éponge) de Menger que l’on peut aussi fabriquer pour de vrai, comme relaté sur ce blog !

JPEG - 56.6 ko
L’éponge de Menger, Centre for Mathematical Sciences, Cambridge

Ces différents objets que nous venons de voir, le triangle ou le tapis de Sierpiński, la courbe de Menger et tant d’autres encore, ont cette propriété commune qu’on retrouve des détails de leurs structures à toutes les échelles. On parle d’autosimilarité. Avec une recette toute simple comme celle de couper le carré en neuf et supprimer le carré central, recette que l’on itère indéfiniment ensuite, on obtient des objets très jolis et des formes parfois bien surprenantes. [8]

Du tapis de Sierpiński à la croix de Jérusalem

Avec les mêmes idées que précédemment, on peut aussi partir d’un carré et dessiner une croix en son milieu ; ce faisant, on crée quatre petits carrés dans chaque coin du carré initial, ainsi que quatre tout petits carrés aux milieux des arêtes du carré initial. Et on recommence le processus. Ce qui est intéressant ici, c’est que lorsque l’on itère la construction à l’ordre $n$, on crée des carrés aux ordres $n+1$ et $n+2$. Voici ce que ça donne concrètement :

JPEG - 134.9 ko

Comme le tapis de Sierpiński, cette construction a un analogue en dimension 3 connu sous le nom de cube de Jérusalem.

Deux petits exercices :

  • Combien y a-t-il de croix à l’étape $n$ ?
  • Quel est le rapport d’homothétie entre les carrés du niveau $n$ et ceux du niveau $n+1$ ? Pour mémoire, c’était $\frac{1}{3}$ dans le cas du tapis. Mais là, il se pourrait bien que le rapport soit irrationnel... [9]

Pour ceux qui souhaitent aller plus loin, voici un programme Python pour générer ce genre d’images.

#Chargement de la librairie {matplotlib} pour créer une image et dessiner des chemins
import matplotlib.pyplot as plt
import matplotlib.patches as patches
from matplotlib.path import Path
from numpy import sqrt

#Fonction qui prend un carré en entrée et renvoie les quatre petits carrés dans les coins et les quatre (encore plus petits) carrés au milieu des arêtes
def iteration(carre):
  L = k*carre[2]
  a = [carre[0],carre[1],L]
  b = [carre[0]+carre[2]-L,carre[1],L]
  c = [carre[0],carre[1]+carre[2]-L,L]
  d = [carre[0]+carre[2]-L,carre[1]+carre[2]-L,L]
  e = [carre[0]+L,carre[1],k*L]
  f = [carre[0],carre[1]+L,k*L]
  g = [carre[0]+carre[2]-k*L,carre[1]+L,k*L]
  h = [carre[0]+L,carre[1]+carre[2]-k*L,k*L]
  return [a,b,c,d],[e,f,g,h]

#Fonction qui dessine la croix centrale d'un carré donné en entrée
def dessineCroix(carre):
  L = k*carre[2]
  sommets = [(carre[0]+k*L,carre[1]+L),
          (carre[0]+L,carre[1]+L),
          (carre[0]+L,carre[1]+k*L),
          (carre[0]+L+k*L,carre[1]+k*L),
          (carre[0]+L+k*L,carre[1]+L),
          (carre[0]+carre[2]-k*L,carre[1]+L),
          (carre[0]+carre[2]-k*L,carre[1]+L+k*L),
          (carre[0]+L+k*L,carre[1]+L+k*L),
          (carre[0]+L+k*L,carre[1]+carre[2]-k*L),
          (carre[0]+L,carre[1]+carre[2]-k*L),
          (carre[0]+L,carre[1]+L+k*L),
          (carre[0]+k*L,carre[1]+L+k*L),
          (carre[0]+k*L,carre[1]+L)]
  codes = [Path.MOVETO,Path.LINETO,Path.LINETO,Path.LINETO,Path.LINETO,Path.LINETO,Path.LINETO,Path.LINETO,Path.LINETO,Path.LINETO,Path.LINETO,Path.LINETO,
           Path.CLOSEPOLY]
  path = Path(sommets,codes)
  ax.add_patch(patches.PathPatch(path,facecolor='white',linewidth=0.1,edgecolor="red"))

#Paramètres et conditions initiales du programme
k = sqrt(2)-1
n = 5
carreInitial = [0,0,1]
tapis = [[carreInitial]]
tapis.append([])

#Initialisation de la figure et du carré initial noir
fig = plt.figure(figsize=(10,10))
ax = fig.add_subplot(111,aspect='equal')
ax.axis('off')
ax.set_xticklabels([])
ax.set_yticklabels([])
ax.add_patch(patches.Rectangle((carreInitial[0],carreInitial[1]),carreInitial[2],carreInitial[2],facecolor="black",edgecolor="blue"))

#Fonction principale du programme
for _ in range(n):
  tapis.append([])
  for x in tapis[-3]:
      bar = iteration(x)
      tapis[-2] += bar[0]
      tapis[-1] += bar[1]
      dessineCroix(x)

#Sauvegarde de la figure
fig.savefig('croix.png', dpi=90, bbox_inches='tight')
GIF - 637.2 ko
Cliquer sur l’image

Des mathématiques à l’art fractal

JPEG - 160.9 ko

Pour les amateurs de formes fractales et de couleurs, je profite de l’occasion pour mentionner la sortie récente de L’art fractal : aux frontières de l’imaginaire, de Jérémie Brunet, dans la collection « Beaux livres » des Éditions POLE. Les amateurs d’art fractal 3D se souviennent peut-être de cette exposition présentée également dans ce reportage diffusée sur LCI à l’époque.

De nombreuses vidéos sont également disponibles sur la chaîne YouTube de Jérémie Brunet. Et une compilation de ces images est donc le cœur même de cet ouvrage présenté ainsi par son éditeur [10] :

Comment représenter un objet aussi abstrait et impénétrable pour le profane qu’une formule mathématique ? C’est à cette question que répond Jérémie Brunet, à travers un voyage riche et psychédélique dans un monde artistique et visuellement déjanté bâti uniquement sur des formules mathématiques. La patte de l’artiste reste cependant primordiale pour sélectionner, retravailler, recadrer, coloriser les surfaces et volumes obtenus par les algorithmes mathématiques de la géométrie fractale.

L’objet fractal le plus célèbre est sans contexte l’ensemble de Mandelbrot, ancêtre commun à toutes les oeuvres d’art fractal. Il est caractérisé par une autosimilarité à toutes les échelles : aussi loin où l’on va en zoomant sur cet objet, il ne change pas, reste identique à lui-même, apparaît en miniature dans chacune des parties qui le constituent. Le processus de création de cet objet peut être repris et étendu grâce à de nouvelles techniques numériques de modélisation.

Ce livre est une compilation des meilleures oeuvres visuelles de Jérémie Brunet, alias « bib », un artiste fractaliste dont la réputation grandit de jour en jour. Il comporte une présentation de l’art de Jérémie Brunet, par l’artiste lui-même, puis une sélection d’une centaine d’oeuvres accompagnées d’un commentaire mathématique en regard (en français et en anglais).

À noter une préface intitulée Dessiner une surface fractale de Jos Leys qui nous explique le principe de la méthode pour générer ces images, puisque lui aussi est un spécialiste de cet art.

JPEG - 864.4 ko
JPEG - 786.7 ko
JPEG - 397.7 ko
JPEG - 840.2 ko
JPEG - 705.7 ko
JPEG - 464.1 ko
Post-scriptum :

Merci à Julia Portzenem, Sébastien Martinez, Christine Huyghe, Julien Melleray et Renaud Chabrier pour leurs relectures et leurs conseils dans la préparation de cet article.

Article édité par Serge Cantat

Notes

[1Merci à Vincent Pantaloni de m’avoir twitté cette image interactive.

[2comme beaucoup d’autres d’ailleurs, voir par exemple ce billet

[3Attention la lumière n’arrive pas perpendiculairement au tapis, ce qui fait que tous les trous ne se voient pas très bien sur l’image précédente (et tous les trous sont bien carrés en vrai !).

[4On aurait aussi pu partir du coin inférieur gauche et garder l’axe des ordonnées orienté vers le haut comme d’habitude. C’est un choix.

[5La machine est livrée avec un logiciel qui pilote l’impression. Il suffit donc de préparer son image (dans un format standard, bitmap ou vectoriel, en mettant des couleurs sur les différents traits de découpe. On règle ensuite les paramètres du laser selon les couleurs : traditionnellement noir et rouge sont utilisés pour la gravure, les autres couleurs pour la découpe. Merci à Filipe Franco et Benjamin du Fablab pour l’aide à la prise en main de cet outil.

[6Une excellente idée à tester lors d’une prochaine découpe serait de mesurer à chaque étape du processus la masse de l’objet : on devrait constater à chaque itération que la masse est bien multipliée par $\frac{8}{9}$. Merci aux relecteurs de l’article pour cette belle suggestion.

[7l’adjectif « triadique » est ici là pour nous rappeler qu’on coupe en trois à chaque étape

[8Sur le plan mathématique, on rencontre souvent l’ensemble de Cantor et le tapis de Sierpiński en topologie, en théorie de la mesure ou dans l’étude de certains systèmes dynamiques. Cela vient du fait qu’on peut facilement les caractériser : par exemple, « tout espace métrique compact sans point isolé et totalement discontinu est homéomorphe à l’ensemble de Cantor », caractérisation relativement simple qui rend de fait ce dernier omniprésent.

[9En effet, en notant $x$ ce rapport, on voit apparaître le long d’un côté du carré initial, deux carrés de côté $x$ et un carré au centre de côté $x^2$. On est donc amené à résoudre l’équation $x^2+2x=1$, dont la seule solution positive est $\sqrt{2}-1$, soit environ 0,41...

[10À noter également De l’art avec les fractales, un article de Jean-Paul Delahaye dans sa rubrique mensuelle de Pour la science.

Partager cet article

Pour citer cet article :

Aurélien Alvarez — «Découper au laser son tapis de Sierpiński» — Images des Mathématiques, CNRS, 2015

Crédits image :

Image à la une - Yoda, grand maître Jedi.
Toutes les images du tapis de Sierpiński sont de l’auteur et sont libres de droit.

Commentaire sur l'article

Voir tous les messages - Retourner à l'article

  • Découper au laser son tapis de Sierpiński

    le 5 avril 2015 à 16:06, par Christian Robert

    Quand je suis passé à l’Université d’Edinburgh en Janvier, pour donner un séminaire, j’ai aussi vu une éponge de Menger : il semble qu’il y ait eu une compétition au Royaume-Uni, puisque ce blog relate que Edinburgh s’est faite coiffer sur le poteau par Bath. Qui, étymologiquement, méritait de remporter un concours d’éponges !

    Répondre à ce message

Laisser un commentaire

Forum sur abonnement

Pour participer à ce forum, vous devez vous enregistrer au préalable. Merci d’indiquer ci-dessous l’identifiant personnel qui vous a été fourni. Si vous n’êtes pas enregistré, vous devez vous inscrire.

Connexions’inscriremot de passe oublié ?