[Résolu] Flocon de Van Koch

Tout ce qui concerne l'utilisation ou l'installation d'Asymptote.

Modérateur: gdm_asy

Règles du forum
Merci d'éviter le style SMS dans vos messages et de penser à utiliser la fonction Recherche avant de poster un message. Pour joindre des fichiers à vos messages, consulter ce sujet.
> Penser à utiliser les balises Code pour poster du code.

[Résolu] Flocon de Van Koch

Messagepar Achille » Jeudi 05 Juillet 2007, 12:55

Je découvre Asymptote depuis une journée et essaie d'emblée des choses difficiles! Comme je connais déjà bien pstricks, je tente de réaliser ce qui me semble impossible avec pstricks.

C'est ainsi que j'ai entrepris de réaliser le flocon de Van Koch. Mon code fonctionne presque, mais il y a néanmoins un problème que je ne parviens pas à résoudre tout seul. Lorsque n=0 ou n=1, tout va bien, mais dès que n>=2, il y a un problème que je ne comprends pas. Voici mon code:

Code: Tout sélectionner
unitsize(10cm);
pair A,B,C,P,Q;
A=(0,0);
B=(1,0);
C=rotate(60)*B;
int n=2;

picture Koch(int n, pair P, pair Q) {
   picture pic;
   draw(pic,P--Q);
   if(n == 0) return pic;
   draw(pic,P--Q,white);
   picture subpic=Koch(n-1,P,Q);
   add(pic,shift(P)*scale(1/3)*shift(-P)*subpic);
   add(pic,shift((1/3)*(Q-P))*shift(P)*rotate(60)*scale(1/3)*shift(-P)*subpic);
   add(pic,shift((2/3)*(Q-P))*shift(P)*rotate(120)*scale(1/3)*shift(-P)*subpic);
   add(pic,shift((2/3)*(Q-P))*shift(P)*scale(1/3)*shift(-P)*subpic);
   return pic;
}

add(Koch(n,B,A));
add(Koch(n,A,C));
add(Koch(n,C,B));


Merci pour votre aide!
Dernière édition par Achille le Jeudi 05 Juillet 2007, 13:30, édité 2 fois.
Achille
Déca-utilisateur
 
Messages: 12
Inscription: Lundi 25 Juin 2007, 06:29

Publicité

Messagepar guiguiche » Jeudi 05 Juillet 2007, 13:02

Edite ton message et mes des balises 'code' autour du code, cela améliore la lisibilité de ton message.
Pas d'aide par MP : les questions sont publiques, les réponses aussi.
Tu as apprécié l'aide qui t'a été fournie ? Alors n'hésite pas à rendre la pareille à quelqu'un d'autre.
Un peu d'autopromotion.
guiguiche
Modérateur
 
Messages: 8071
Inscription: Vendredi 06 Janvier 2006, 15:32
Localisation: Le Mans
Statut actuel: Actif et salarié | Enseignant

Messagepar OG » Jeudi 05 Juillet 2007, 13:25

Bonjour

J'ai fait par hasard des modifications

Code: Tout sélectionner
unitsize(10cm);
pair A,B,C,P,Q;
A=(0,0);
B=(1,0);
C=rotate(60)*B;
int n=5;

picture Koch(int n, pair P, pair Q) {
picture pic;
draw(pic,P--Q);
if(n == 0) return pic;
draw(pic,P--Q,white);
picture subpic=Koch(n-1,P,Q);
picture subpic1=Koch(n-1,Q,P);
add(pic,shift(P)*scale(1/3)*shift(-P)*subpic);
add(pic,shift((1/3)*(Q-P))*shift(P)*rotate(60)*scale(1/3)*shift(-P)*subpic);
add(pic,shift((2/3)*(Q-P))*shift(P)*rotate(120)*scale(1/3)*shift(-P)*subpic1);
add(pic,shift((2/3)*(Q-P))*shift(P)*scale(1/3)*shift(-P)*subpic);
return pic;
}

add(Koch(n,B,A));
add(Koch(n,A,C));
add(Koch(n,C,B));


Il y a certainement mieux à faire !

Cordialement
O.G.
Dernière édition par OG le Jeudi 05 Juillet 2007, 13:36, édité 1 fois.
OG
Modérateur
 
Messages: 2285
Inscription: Lundi 12 Mars 2007, 11:20
Localisation: Rouen
Statut actuel: Actif et salarié | Maître de conférence

Messagepar Achille » Jeudi 05 Juillet 2007, 13:30

Au vu du résultat, le problème semble déjà résolu. Merci beaucoup OG!
Achille
Déca-utilisateur
 
Messages: 12
Inscription: Lundi 25 Juin 2007, 06:29

Messagepar OG » Jeudi 05 Juillet 2007, 13:50

Je ne sais pas si ce que j'ai donné donne la mention [Résolu]. Je ne veux pas m'attirer les foudres de la part des informaticiens. En effet, du point de vue de la complexité c'est bof-bof

Deux appels récursifs ... donnent tout de même une mauvaise image.
Voici une autre version :

Code: Tout sélectionner
unitsize(10cm);
pair A,B,C,P,Q;
A=(0,0);
B=(1,0);
C=rotate(60)*B;
int n=6;

picture Koch(int n, pair P, pair Q) {
picture pic;
draw(pic,P--Q);
if(n == 0) return pic;
draw(pic,P--Q,white);
picture subpic=Koch(n-1,P,Q);
picture subpic1=reflect(P,Q)*subpic;
add(pic,shift(P)*scale(1/3)*shift(-P)*subpic);
add(pic,shift((1/3)*(Q-P))*shift(P)*rotate(60)*scale(1/3)*shift(-P)*subpic);
add(pic,shift((2/3)*(Q-P))*shift(P)*rotate(120)*scale(1/3)*shift(-P)*subpic1);
add(pic,shift((2/3)*(Q-P))*shift(P)*scale(1/3)*shift(-P)*subpic);
return pic;
}


picture kn=Koch(n,B,A);
picture kn1=reflect(A,C)*rotate(60)*kn;
picture kn2=rotate(-60,B)*reflect(A,B)*kn;
add(kn);
add(kn1);
add(kn2);

//add(Koch(n,B,A));
//add(Koch(n,A,C));
//add(Koch(n,C,B));


Cordialement
O.G.
OG
Modérateur
 
Messages: 2285
Inscription: Lundi 12 Mars 2007, 11:20
Localisation: Rouen
Statut actuel: Actif et salarié | Maître de conférence

Messagepar Achille » Jeudi 05 Juillet 2007, 14:12

Je ne vois guère d'amélioration dans la seconde version.

Par contre, j'ai apporté à présent une autre correction qui évite d'avoir à effacer le segment en le traçant en blanc. Le code semble bien meilleur, au vu de la diminution de la taille des fichiers .pdf produits.

Code: Tout sélectionner
unitsize(10cm);
pair A,B,C,P,Q;
A=(0,0);
B=(1,0);
C=rotate(60)*B;
int n=6;

picture Koch(int n, pair P, pair Q) {
   picture pic;

   if(n == 0) {
      draw(pic,P--Q);
      return pic;
   }

   picture subpic=Koch(n-1,P,Q);
   picture subpic1=Koch(n-1,Q,P);

   add(pic,shift(P)*scale(1/3)*shift(-P)*subpic);
   add(pic,shift((1/3)*(Q-P))*shift(P)*rotate(60)*scale(1/3)*shift(-P)*subpic);
   add(pic,shift((2/3)*(Q-P))*shift(P)*rotate(120)*scale(1/3)*shift(-P)*subpic1);
   add(pic,shift((2/3)*(Q-P))*shift(P)*scale(1/3)*shift(-P)*subpic);

   return pic;
}

add(Koch(n,B,A));
add(Koch(n,A,C));
add(Koch(n,C,B));
Achille
Déca-utilisateur
 
Messages: 12
Inscription: Lundi 25 Juin 2007, 06:29

Messagepar OG » Jeudi 05 Juillet 2007, 15:07

Bonjour

Le rendu est bien sûr le même, c'était juste la question d'image, de style de programmation. En théorie la deuxième version est plus rapide, mais dans les faits, pour l'exécution ça ne change rien, c'est tout aussi rapide et pur $n=8$ c'est inutilisable.

Cordialement
O.G.
OG
Modérateur
 
Messages: 2285
Inscription: Lundi 12 Mars 2007, 11:20
Localisation: Rouen
Statut actuel: Actif et salarié | Maître de conférence

Messagepar Achille » Jeudi 05 Juillet 2007, 17:55

Dans la foulée, je me suis attaqué au triangle de Sierpinski:
Code: Tout sélectionner
unitsize(10cm);
pair A,B,C;
A=(0,0);
B=(1,0);
C=rotate(60)*B;
int n=10;

void Sierpinski(int n, pair A, pair B, pair C) {

   pair P,Q,R;

   if(n == 0) {
      fill(A--B--C--cycle);
      return;
   }

   transform ta=shift(A)*scale(1/2)*shift(-A);   
   transform tb=shift((1/2)*(B-A))*shift(A)*scale(1/2)*shift(-A);
   transform tc=shift((1/2)*(C-A))*shift(A)*scale(1/2)*shift(-A);

   P=ta*A;
   Q=ta*B;
   R=ta*C;
   Sierpinski(n-1,P,Q,R);

   P=tb*A;
   Q=tb*B;
   R=tb*C;
   Sierpinski(n-1,P,Q,R);

   P=tc*A;
   Q=tc*B;
   R=tc*C;
   Sierpinski(n-1,P,Q,R);

   return;

}

Sierpinski(n,A,B,C);


Ce qui m'a permis de recoder beaucoup plus simplement le flocon de Van Koch:
Code: Tout sélectionner
unitsize(10cm);
pair A,B,C;
A=(0,0);
B=(1,0);
C=rotate(60)*B;
int n=6;

void Koch(int n, pair A, pair B) {

   pair P,Q;

   if(n == 0) {
      draw(A--B);
      return;
   }

   transform ta=shift(A)*scale(1/3)*shift(-A);   
   transform tb=shift((1/3)*(B-A))*shift(A)*rotate(60)*scale(1/3)*shift(-A);
   transform tc=shift((2/3)*(B-A))*shift(A)*rotate(120)*scale(1/3)*shift(-A);
   transform td=shift((2/3)*(B-A))*shift(A)*scale(1/3)*shift(-A);

   P=ta*A;
   Q=ta*B;
   Koch(n-1,P,Q);

   P=tb*A;
   Q=tb*B;
   Koch(n-1,P,Q);

   P=tc*A;
   Q=tc*B;
   Koch(n-1,Q,P);

   P=td*A;
   Q=td*B;
   Koch(n-1,P,Q);   

   return;

}

Koch(n,B,A);
Koch(n,A,C);
Koch(n,C,B);
Achille
Déca-utilisateur
 
Messages: 12
Inscription: Lundi 25 Juin 2007, 06:29

Messagepar OG » Vendredi 20 Juillet 2007, 15:54

Bonjour

J'avais oublié que sur la page de Philippe cela existait forcément !
Voir ici : figures 157 et 158 !

Cordialement
O.G.
OG
Modérateur
 
Messages: 2285
Inscription: Lundi 12 Mars 2007, 11:20
Localisation: Rouen
Statut actuel: Actif et salarié | Maître de conférence


Retourner vers Asymptote

 


  • Articles en relation
    Réponses
    Vus
    Dernier message

Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 1 invité