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: