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 :

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:

 
													 
													