spirale carrés tikz python

Spirale et carrés, TiKZ et Python

  • Dernière modification de la publication :28 février 2021
  • Temps de lecture :6 min de lecture
  • Commentaires de la publication :0 commentaire

Loading

Spirale et carrés, TiKZ et Python : il y a peu de temps, j’ai eu à construire une spirale inscrite dans une suite de carrés, avec TiKZ et à l’aide de Python :

Spirale et carrés, TiKZ et Python

Ceci était pour illustrer la somme des termes d’une suite géométrique.

Bien entendu, on peut la construire « à la main » car finalement, il n’y a que 8 carrés qui sont bien visibles. Mais le challenge informatique était bien trop alléchant pour que je n’utilise pas Pythontex, et donc le langage Python couplé à \(\LaTeX\).

Spirale et carrés, TiKZ et Python: les bases du programme

L’idée ici est de calculer les coordonnées du coin inférieur gauche de chaque carrés, puis la longueur du côté de ce carré, sachant qu’elle est égale à la moitié de celle du côté du carré précédent.

Ensuite, il faut dessiner le quart de cercles dans le carré.

Spirale et carrés, TiKZ et Python: le programme \(\LaTeX\)

\documentclass{standalone}
\usepackage{tikz}
\usepackage{pythontex}
\begin{document}
\begin{tikzpicture}
\begin{pycode}
x, y, cx, cy, a = 0, 0, 100, 100, 180
for i in range(10):
    print( '\\draw({},{}) rectangle +({},{});\n\\draw[red] ({},{}) arc({}:{}:{});\n'.format(x,y,cx,cy,x,y,a,a-90,abs(cx)) );
    x += cx
    y += cy
    a -= 90
    if i % 2 == 0:
        cx = cx / 2
        cy = -cy / 2
    else:
        cx = -cx / 2
        cy = cy / 2
\end{pycode}
\end{tikzpicture}
\end{document}

Pour celles et ceux qui ne seraient pas à l’aise avec PythonTex, il existe aussi une solution en Python pur :

from os import system
from os.path import isfile

# construction du code LaTeX

latex = '\\documentclass{standalone}\n\\usepackage{tikz}\n\\begin{document}\n\\begin{tikzpicture}'

x, y, cx, cy, a = 0, 0, 100, 100, 180
for i in range(10):
    latex +=  '\\draw({},{}) rectangle +({},{});\n\\draw[red] ({},{}) arc({}:{}:{});\n'.format(x,y,cx,cy,x,y,a,a-90,abs(cx))
    x += cx
    y += cy
    a -= 90
    if i % 2 == 0:
        cx = cx / 2
        cy = -cy / 2
    else:
        cx = -cx / 2
        cy = cy / 2

latex += '\\end{tikzpicture}\n\\end{document}'

# génération du fichier

if isfile('spirale_python.tex'):
    system('del spirale_python.tex')

fichier = open('spirale_python.tex',"x")
fichier.write(latex)
fichier.close()
system('pdflatex  --shell-escape -synctex=1 -interaction=nonstopmode spirale_python.tex')
system('start  spirale_python.pdf')

Spirale de Fibonacci

Tant que nous sommes lancés sur les spirales inscrites dans des carrés, autant élargir à la spirale de Fibonacci.

Mais là, c’est tout de même un peu plus corsé…

from os import system
from os.path import isfile

# spirale_fibonnacci

def spirale_fibonacci(n):
    F = [1,1]
    for k in range(2,n+1):
        F.append(F[k-1]+F[k-2])
    
    latex = '\\documentclass{standalone}\n'
    latex += '\\usepackage{tikz}\n'
    latex += '\\begin{document}\n'
    latex += '\\begin{tikzpicture}\n'
    latex += '\\draw (0,0) rectangle +(1,1);\n'
    latex += '\\draw[red] (1,0) arc(0:90:1);\n'
    latex += '\\draw (-1,0) rectangle +(1,1);\n'
    latex += '\\draw[red] (0,1) arc(90:180:1);\n'
    
    x = -1
    y = 0
    start_angle = 90
    
    for k in range(2,n+1):
        start_angle += 90
        if k % 4 == 2:
            y -= F[k]
            start_angle_x = x
            start_angle_y = y + F[k]
        elif k % 4 == 3:
            x += F[k-1]
            start_angle_x = x
            start_angle_y = y
        elif k % 4 == 0:
            x -= F[k-2]
            y += F[k-1]
            start_angle_x = x + F[k]
            start_angle_y = y
        else:
            x -= F[k]
            y -= F[k-2]
            start_angle_x = x + F[k]
            start_angle_y = y + F[k]
            
        latex += '\\draw ({},{}) rectangle +({},{});' . format(x,y,F[k],F[k])
        latex += '\\draw[red] ({},{}) arc({}:{}:{});\n' . format(start_angle_x,start_angle_y,start_angle,start_angle+90,F[k])

    latex += '\\end{tikzpicture}\n\\end{document}'

    # génération du fichier

    if isfile('spirale_fibo.tex'):
        system('del spirale_fibo.tex')

    fichier = open('spirale_fibo.tex',"x")
    fichier.write(latex)
    fichier.close()
    system('pdflatex  --shell-escape -synctex=1 -interaction=nonstopmode spirale_fibo.tex')
    system('start  spirale_fibo.pdf')

J’ai défini une fonction spirale_fibonacci(n) qui construit en \(\LaTeX\) la spirale d’or avec n+1 carrés de Fibonacci. Par exemple,

>>> spirale_fibonacci(9)

donnera:

spirale d'or (spirale de Fibonacci)
0 0 votes
Évaluation de l'article
S’abonner
Notification pour
guest
0 Commentaires
Commentaires en ligne
Afficher tous les commentaires