Français   Grilles

Une grille élastique

Imaginer une grille élastique. Lorsqu'elle n'est pas déformée, elle semble composée de cellules carrées régulières. Appliquer une déformation et alors chaque cellule se retrouve étirée ou tordue.

Vous pouvez commenter une ligne de code dans la procédure demarrer pour ne tracer que les horizontales ou les verticales.

Vous pouvez changer le maillage de la grille en modifiant la variable :size dans la procédure demarrer
# Commande principale: demarrer
pour new
# set defaults, screen, pen et tortue
init ftd [400 400]
fcfg noir fcc vert levecrayon cachetortue
fin

pour gridpos :i :j :size
donne "x (:i/(0.5*:size))-1
donne "y (:j/(0.5*:size))-1
donne "rect function :x :y
retourne liste 180*premier :rect 180*dernier :rect
fin

pour function :x :y
retourne liste :x :y #unchanged
fin

pour demarrer
new fcc vert
donne "size 19 #increase (eg 29) repetepour finer grid
repetepour [l 0 1] [
repetepour phrase liste "i 0 :size [levecrayon
repetepour phrase liste "j 0 :size [
si :l=0 [ #vertical lines
fpos gridpos :i :j :size baissecrayon]
si :l=1 [ #horizontal lines
fpos gridpos :j :i :size baissecrayon]
]]]
fin



Remplacer la procedure function par l'une des suivantes pour etirer ou tordre la grille. Augmenter le maillage à 29.

pour Function :X :Y
si :X< 0 [donne "XSign Moins 1][donne "XSign 1]
si :Y< 0 [donne "YSign Moins 1][donne "YSign 1]
donne "X Puissance :X 2
donne "Y Puissance :Y 2
retourne Liste :XSign*:X :YSign*:Y
Fin

pour Function :X :Y
donne "X :X + 0.05 * Sin 360* :Y
donne "Y :Y + 0.05 * Cos 360* :X
retourne Liste :X :Y
fin



Ensuite, commencer par ajouter ces deux procédures qui permettent de travailler avec des coordonnées polaires. La première permet de passer des polaires aux cartésiens. La deuxième fait l'inverse.

pour PtoR :RadDist :Theta
# convert polar to rectangular
donne "X :RadDist * Sin :Theta
donne "Y :RadDist * Cos :Theta
retourne Liste :X :Y
fin

pour RtoP :X :Y
# uses a second turtle to convert rectangular to polar
fixetortue 1 lc FixeXY :X :Y
donne "RadDist racine ((Puissance :X 2) + (Puissance :Y 2))
FixeCap Vers [0 0] donne "myHeading cap fixeTortue 0
retourne Liste :RadDist :myHeading+180
fin



Maintenant, reste à remplacer successivement avec l'une des procédures suivantes:

pour Function :X :Y
donne "Polar RtoP :X :Y
donne "RadDist premier :Polar donne "Theta dernier :Polar
si :RadDist <1 [
donne "RadDist Puissance :RadDist 0.4] #change 0.4 to 2
retourne PtoR :RadDist :Theta
fin

pour Function :X :Y
donne "Polar RtoP :X :Y
donne "RadDist premier :Polar donne "Theta dernier :Polar
si :RadDist <1 [
donne "Theta :Theta-100*(1-:RadDist)] #change 100 to 200
retourne PtoR :RadDist :Theta
fin

pour Function :X :Y
donne "Polar RtoP :X :Y
donne "RadDist premier :Polar donne "Theta dernier :Polar
donne "RadDist Puissance :RadDist 0.4
retourne PtoR :RadDist :Theta
fin

Tester le programme maintenant

Procédure à exécuter:
demarrer