Page 1 sur 1

Flocon

Posté : sam. 27 mars 2010, 19:18
par maurice
Bonjour,

novice avec asymptote et nouveau sur ce forum.
Me disant qu'il n'y a qu'en pratiquant qu'on progresse, j'ai essayé de faire un script pour dessiner le flocon de Van Koch.
Le voici :

Code : Tout sélectionner

// Flocon de Van Koch avec Asymptote


//Taille de l'image
size(10cm,0);

//Nombre d'itérations
int iteration;
iteration=5;

//Nombre de sommets
int n;
n=3;

//Définition des sommets du triangle initial
pair[] pA = {(0,0),
        (1,0),
        (1/2,sqrt(3)/2)};

//Tracé du cercle circonscrit
pair I,O;
I=((pA[0]+pA[1])/2);
O=((2*I+pA[2])/3);
draw(circle(O,2*sqrt(3)/6));


//Calcul du périmètre et calcul de l'aire initiaux
real perimetre;
perimetre = 3;

real aire;
aire = sqrt(3)/4;


//iteration
for (int k=1; k<=iteration; ++k) {

//Initialisation du nouveau pA
pair[] pD=new pair[4*n];
for (int i=0; i<=n-1; ++i) {
   if (i<n-1)
      {pD[4*i+0] = pA[i];
      pD[4*i+1] = (2*pA[i]+pA[i+1])/3;
      pD[4*i+2] = rotate(-60,(2*pA[i]+pA[i+1])/3)*((pA[i]+2*pA[i+1])/3);
      pD[4*i+3] = (pA[i]+2*pA[i+1])/3;
   }
   else
      {pD[4*i+0] = pA[i];
      pD[4*i+1] = (2*pA[i]+pA[0])/3;
      pD[4*i+2] = rotate(-60,(2*pA[i]+pA[0])/3)*((pA[i]+2*pA[0])/3);
      pD[4*i+3] = (pA[i]+2*pA[0])/3;
   }
}
pA=pD;


//Nouveau nombres de sommets
n = 4*n;

//Calcul du périmètre
perimetre = perimetre*(1+1/3);
}


//Tracé des triangles
for (int i=0; i<=n-1; ++i) {
   if (i<n-1)
      {draw(pA[i]--pA[i+1]);
      }
   else {draw(pA[i]--pA[0]);
   }
}


//Affichage du périmètre
label("p\'erim\`etre : ", (0.5,-0.35),W);
label(string(perimetre), (0.5,-0.35),E);


débutant, je suis bien sur interressé par toute les remarques ou suggestion qu'on pourra me faire.

Par ailleur le script marche bien et est rapide pour iteration = 6.
A iteration = 8, il est déjà beaucoup plus long et à partir de iteration=9, j'ai l'impression que l'ordi tourne en rond.
A quoi cela peut-il être du a votre avis ?

Maurice

Re: Flocon

Posté : sam. 27 mars 2010, 19:28
par GM
maurice a écrit :débutant, je suis bien sur interressé par toute les remarques ou suggestion qu'on pourra me faire.

Par ailleur le script marche bien et est rapide pour iteration = 6.
A iteration = 8, il est déjà beaucoup plus long et à partir de iteration=9, j'ai l'impression que l'ordi tourne en rond.
A quoi cela peut-il être du a votre avis ?


Pas le temps de tester à l'instant présent... mais je peux donnerune source d'inspiration différente.

Code : Tout sélectionner

pair z0=(1,0); 
pair z1=rotate(120)*z0;
pair z2=rotate(120)*z1;
koch(z0,z1,2,red);
koch(z1,z2,3,blue);
koch(z2,z0,4,green);

donne cela :

Figure asymptote 115f6f04012edd8b42d8371af498cce3
*** Pour masquer/découvrir le code Asymptote qui a permis de créer la figure, il faut cliquer dessus. ;-) ***

CODE ASYMPTOTE de la figure ci-dessus : Tout sélectionner
  1. size(250);
  2. void koch(pair A, pair B, int n, pen stylo=black) {
  3. pair C;
  4. C=rotate(120, point(A--B,1/3))*A;
  5. if (n>0) {
  6. koch(A,point(A--B,1/3),n-1,stylo);
  7. koch(point(A--B,1/3),C,n-1,stylo);
  8. koch(C,point(A--B,2/3),n-1,stylo);
  9. koch(point(A--B,2/3),B,n-1,stylo);
  10. }
  11. else draw(A--point(A--B,1/3)--C--point(A--B,2/3)--B,stylo);
  12. }
  13. pair z0=(1,0);
  14. pair z1=rotate(120)*z0;
  15. pair z2=rotate(120)*z1;
  16. koch(z0,z1,2,red);
  17. koch(z1,z2,3,blue);
  18. koch(z2,z0,4,green);
  19.  

Re: Flocon

Posté : sam. 27 mars 2010, 19:38
par GM
Exemple précédent modifié !

Re: Flocon

Posté : sam. 27 mars 2010, 19:40
par pivaldi
GM a écrit :Pas le temps de tester à l'instant présent... mais je peux donnerune source d'inspiration différente.

Idem.
Par L-System
Par récursion

Re: Flocon

Posté : sam. 27 mars 2010, 19:57
par GM
pivaldi a écrit :
GM a écrit :Pas le temps de tester à l'instant présent... mais je peux donnerune source d'inspiration différente.

Idem.
Par L-System
Par récursion

Maurice aura remarqué le commentaire précisant l'auteur sur l'exemple dont j'ai donné le lien : c'est ton exemple récursif que je citais. :-)

Je viens d'ajouter de la couleur ci-dessus pour bien voir les trois parties.

Quand on voit ce que donne p=4... je crois qu'il est inutile de monter jusque 8.

Re: Flocon

Posté : sam. 27 mars 2010, 20:42
par maurice
Merci pour les sources d'inspiration, je vais essayer de décortiquer tout ca.
je crois que pour Lsystem je vais attendre un peu d'être famalliarisé avec les trucs plus basiques d'Asymptote !

Maurice

Re: Flocon

Posté : sam. 27 mars 2010, 21:36
par GM
maurice a écrit :je crois que pour Lsystem je vais attendre un peu

L'extension est créée : Philippe l'a faite.
Donc si tu devais t'y intéresser... ce ne serait plus un problème d'asymptote : il suffirait de regarder cette jolie galerie de Philippe et de lire des choses comme ceci sur wikipedia, pour comprendre la syntaxe des chaines à passer à la fonction Lsystem.