Monday, May 05, 2014

Spirographe

Il ne s'agira pas vraiment de la simulation d'un spirographe, qui utilise des hypotrochoïdes (Wikipedia dixit). Deux cycles sont composés: un point tourne autour d'un centre qui tourne lui-même, de façon plus lente, autour d'un point fixe comme la lune tourne autour de la terre, qui tourne autour du soleil.

Attention: j'utilise encore python 2.x, qui doit se lancer avec -Qnew pour disposer de la division 'réelle'. 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#! /usr/bin/python -Qnew
# -*- coding: utf-8 -*-
import math
 
gr=150 # grand rayon
pr=50  # petit rayon
 
# rapport du cycle secondaire. Attention:
# si signe==1, le nombre de spires= n-1
# si signe==-1, le nombre de spires= n+1 
rapport=7
signe=1; s="p"
 
# decommenter la ligne suivante pour inverser le sens de la courbe secondaire
#signe=-1; s="m"
 
centre=gr+pr+10 # eloignement maximal du centre + marge de 10 pixels
cote=centre*2  # image side 
 
matrice=['0']*cote*cote # pixels matrix 
 
for i in range(4000): # courbe resultant de la revolution de cercles autour d'un cercle 
  angle=i*math.pi/2000 # le cercle fait 2PI, chaque pas 2PI/10000, donc PI/5000
  x=int(round(centre+math.cos(angle)*gr+math.cos(angle*rapport)*pr))
  y=int(round(centre+math.sin(angle)*gr+math.sin(angle*rapport)*pr*signe))
  matrice[y*cote+x]="1" # chaque pixel '1' est noir
 
nom="spiro-%d-%d%s%d" %(gr,pr,s,rapport)
 
entete="P1 %s %s " %(cote,cote) # entete de fichier PNM noir/blanc au format ASCII
fichier=entete+"".join(matrice) # transforme la liste ['0','0','1','0'...] en chaîne '0010...'
 
han=open(nom+".pnm","w")
han.write(fichier)
han.close()
 
# Compl´etion de l'image avec le cercle de base en pointill´e
 
for i in range(200): # tour trigonometrique plus rapide
  angle=i*math.pi/100
  x=int(round(centre+math.cos(angle)*gr))
  y=int(round(centre+math.sin(angle)*gr))
  matrice[y*cote+x]="1"
 
fichier=entete+"".join(matrice)
 
han=open(nom+".trace.pnm","w")
han.write(fichier)
han.close()

 

Petit paradoxe:alors que le rapport entre le cycle secondaire est de 7 par rapport au cycle central, on obtient seulement six spires. C'est parce qu'il faut décompter le tour du cycle central sur lui-même.

En décommentant la ligne 15, l'orientation des spires est inversée. Et ici, le nombre de spires est supérieur au rapport 7.

  Note: j'ai placé l'image contenant le tracé en pointillé du cycle central. Une suite est prévue!!!

Add comment

Add comment

authimage