En cette veille de Toussaint on vous propose un petit challenge éducatif : écrire l'algorithme de la toile d'araignée.
Un bon exercice d'entretien d'embauche ou de khôlle de maths.

Bonjour monsieur,
Dessinez-moi une toile d'araignée.
Vous avez 15 minutes, un ordinateur, une tortue, un crayon et le résultat doit ressembler à ça, GO !


Alors, vous avez la réponse ?
Pas la peine de chercher "algorithme toile d'araignée" sur Wikipedia, on vient de l'inventer.
Déjà on vous a donné un indice : vous avez une tortue.
On fait bien sûr référence à la super librairie de dessin en Python : turtle.
Turtle, en gros, c'est une tortue avec un crayon attaché à sa carapace. Vous n'avez accès qu'à une dizaine de commandes dont turtle.forward(10) (avance de 10 pixels en faisant traîner ton crayon) ou encore turtle.left(90) (tourne de 90 degrés vers la gauche) et vous devez vous débrouillez avec ça.
C'est rudimentaire mais c'est justement ça qui est très amusant.

Chez Fabdev on a opté pour l'approche trigonométrique, parce que notre araignée (ou notre tortue, je ne sais plus) aime bien les maths. Pour nous une toile d'araignée c'est des décagones concentriques reliés par leurs angles.
En Python ça donne ça :

import turtle
import math

angles = 10
minium_radius = 30
max_radius = 200
space_between = 30


for radius in range(minium_radius, max_radius, space_between):
    turtle.penup()
    turtle.goto(radius, 0)
    turtle.pendown()
    for i in range(1, angles + 1):
        theta = math.pi * 2 * i / angles
        x = radius * math.cos(theta)
        y = radius * math.sin(theta)
        turtle.goto(x, y)
        turtle.setheading(i * 360 / angles)
        turtle.forward(space_between)
        turtle.backward(space_between)

Le Gif du début d'article est directement le résultat de ces lignes de code.
Chaque pentagone est en fait un cercle de rayon R sur lequel on va placer 10 points équidistants (paramètre angles).
Les coordonnées x,y de ces points sont la conversion en coordonnées cartésiennes de coordonnées polaires R*theta.

theta = math.pi * 2 * i / angles
x = radius * math.cos(theta)
y = radius * math.sin(theta)
On demande ensuite à notre tortue d'aller de point en point, en faisant à chaque point un petit détour vers le prochain pentagone.
turtle.setheading(i * 360 / angles)
turtle.forward(space_between)
turtle.backward(space_between)
La commande turtle.setheading permet d'orienter notre tortue dans la bonne direction, plus ou moins perpendiculaire au fil qui est en train d'être tissé !

Si le sujet vous intéresse, voici un lien vers une super galerie de turtle-art https://turtletoy.net

Envoyez-nous vos versions par mail à contact@fabdev.fr, et on ajoutera votre version à la suite de cet article ;)


Contribution de Mathieu Soul
import turtle


def create_turtle():
    window = turtle.Screen()
    window.bgcolor("black")
    t = turtle.Turtle()
    t.shape("turtle")
    t.color("yellow")
    t.speed(2)
    t.pensize(2)
    return t

def trace_axis(t, length):
    t.forward(length)
    t.forward(-length)

def trace_polygon(t, radius):
    for i in range(6):
        t.right(-60)
        t.forward(radius)

def draw_web(radius, number_of_webs):
    t = create_turtle()
    for i in range(6):
        t.right(60)
        trace_axis(t, radius)
    fraction = (radius-0.1*radius)/number_of_webs
    for i in range(number_of_webs):
        t.forward(fraction)
        t.right(-60)
        trace_polygon(t, (i+1)*fraction)
        t.right(60)


draw_web(200, 4)