Itération sur triple

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.

Itération sur triple

Messagepar XavteX » Samedi 15 Janvier 2011, 11:30

Bonjour,

Je souhaite dessiner un empilement de 6 sphères suivant l'axe (Ox) (dans un premier temps).
Je dois préalablement déclarer les centres de ces sphères avec des "triple".
Est-il possible d'utiliser une instruction "for" pour cette déclaration?

Merci de votre aide
XavteX
Kilo-utilisateur
 
Messages: 122
Inscription: Jeudi 13 Janvier 2011, 09:44
Statut actuel: Actif et salarié | Enseignant

Publicité

Re: iteration sur triple

Messagepar chellier » Samedi 15 Janvier 2011, 11:56

Bonjour,

Une solution :

ee8bcf04414b0523ed73a344a1699063.png

Code: Tout sélectionner
import solids;
import graph3;
size(10cm);

settings.render=0; //à commenter si besoin
settings.prc=false;//à commenter si besoin
triple[] cSphere;

for(int i=0; i<6; ++i) {
cSphere.push((i,0,0));
}

for(int i=0; i<6; ++i) {
draw(surface(sphere(cSphere[i],.25)),lightblue);
}

xaxis3("$x$");


On peut bien sûr tout mettre dans la même boucle for.

Christophe
chellier
Modérateur
 
Messages: 355
Inscription: Samedi 25 Juillet 2009, 11:25
Localisation: Le Creusot
Statut actuel: Actif et salarié | Enseignant

Re: iteration sur triple

Messagepar GMaths » Samedi 15 Janvier 2011, 12:14

XavteX a écrit:Je dois préalablement déclarer les centres de ces sphères avec des "triple".
Est-il possible d'utiliser une instruction "for" pour cette déclaration?


Pour des espacements irréguliers, un type de boucle for à connaitre :
Code: Tout sélectionner
import solids;
triple[] centres={(1,0,0),(2,0,0),(5,0,0)};
for(triple pt:centres) draw(surface(sphere(pt,.5)),red);
GMaths
Exa-utilisateur
 
Messages: 2031
Inscription: Lundi 01 Octobre 2007, 09:20
Statut actuel: Actif et salarié | Enseignant

Re: iteration sur triple

Messagepar XavteX » Samedi 15 Janvier 2011, 12:24

Voilà ce que j'ai finalement écrit :
Code: Tout sélectionner
import three;
import solids;
size(5,0);
for (int x=0 ; x<6; ++x) {
for (int y=0 ; y<6; ++y) {
for (int z=0 ; z<6; ++z) {
revolution sxyz=sphere((x,y,z),0.5);
draw(surface(sxyz),blue);
}
}
}

Je veux un empilement cubique de 6^3 sphères!
Mais il n'y a pas assez de mémoire!!!
Comment résoudre le problème?
Dernière édition par chellier le Samedi 15 Janvier 2011, 12:57, édité 1 fois.
Raison: Balises Code !
XavteX
Kilo-utilisateur
 
Messages: 122
Inscription: Jeudi 13 Janvier 2011, 09:44
Statut actuel: Actif et salarié | Enseignant

Re: iteration sur triple

Messagepar GMaths » Samedi 15 Janvier 2011, 12:32

XavteX a écrit:Comment résoudre le problème?

Changer de pc :

Image

Plus sérieusement ? Je ne sais pas.
GMaths
Exa-utilisateur
 
Messages: 2031
Inscription: Lundi 01 Octobre 2007, 09:20
Statut actuel: Actif et salarié | Enseignant

Re: iteration sur triple

Messagepar chellier » Samedi 15 Janvier 2011, 12:56

Ça compile aussi chez moi (mais c'est long !)
Essaye avec ça :
Code: Tout sélectionner
surface sxyz=scale3(.5)*unitsphere;
draw(shift(x,y,z)*sxyz,blue);

Il me semble que c'est un peu plus rapide.

Christophe
chellier
Modérateur
 
Messages: 355
Inscription: Samedi 25 Juillet 2009, 11:25
Localisation: Le Creusot
Statut actuel: Actif et salarié | Enseignant

Re: iteration sur triple

Messagepar maurice » Samedi 15 Janvier 2011, 12:57

XavteX a écrit:Comment résoudre le problème?


Peut-être en jouant avec le paramètre nslice (=12 par défaut).
A la maison, la figure prend 34,% de mémoire avec n=nslice et 24% seulement avec n=2 (sur 3,6 Go).

Code: Tout sélectionner
import three;
import solids;
size(5,0);
for (int x=0 ; x<6; ++x) {
for (int y=0 ; y<6; ++y) {
for (int z=0 ; z<6; ++z) {
revolution sxyz=sphere((x,y,z),0.5,n=2);
draw(surface(sxyz),blue);
}
}
}


A voir si cela suffit ?...
Tiens nous au courant.

Maurice.
Asymptote :
----> Démarrage rapide : http://cgmaths.fr/Atelier/Asymptote/Asymptote.html
----> Documentation 3D : http://www.mathco.tuxfamily.org et si ça ne marche pas, essayez la version pdf
maurice
Méga-utilisateur
 
Messages: 399
Inscription: Jeudi 25 Mars 2010, 13:49
Statut actuel: Actif et salarié | Enseignant

Re: Itération sur triple

Messagepar GMaths » Samedi 15 Janvier 2011, 13:50

Code: Tout sélectionner
settings.thick=false;
import solids;
defaultrender.sphere=0; // Renders slowly but produces smaller PRC files.
defaultrender.granularity=0;
size(5cm,0);
int n=6;
surface sxyz=surface(sphere(.5,n=4));
for (int x=0 ; x<n; ++x) {
    for (int y=0 ; y<n; ++y) {
        for (int z=0 ; z<n; ++z) {
            draw(shift(x,y,z)*sxyz,blue);
        }
    }
}
GMaths
Exa-utilisateur
 
Messages: 2031
Inscription: Lundi 01 Octobre 2007, 09:20
Statut actuel: Actif et salarié | Enseignant

Re: Itération sur triple

Messagepar XavteX » Samedi 15 Janvier 2011, 14:26

Je viens d'essayer le code de Maurice : c'est long mais ça passe!
ça passe mieux avec en sortie adobereader9 qu'avec OpenGL.
En revanche, avant activation de la figure, la figure de base occupe toute la plage et est très flou!
Je crois qu'il y a un pb de taille... size?
Après activation, sa taille se réduit, et la figure est nette (sauf en arrière plan ou la figure de base reste présente).
C'est assez bizarre!
XavteX
Kilo-utilisateur
 
Messages: 122
Inscription: Jeudi 13 Janvier 2011, 09:44
Statut actuel: Actif et salarié | Enseignant

Re: Itération sur triple

Messagepar GMaths » Samedi 15 Janvier 2011, 14:48

XavteX a écrit:C'est assez bizarre!

L'ajout de "render 4", ajouter une image png aussi de l'animation pour qu'il y ait quelque chose à voir avec des lecteurs pdf autres qu'acrobat reader, sinon ce serait blanc.
Mais si tu visualises avec adobe reader, tu peux enlever le "render 4" et tu ne verras que la version prc.
GMaths
Exa-utilisateur
 
Messages: 2031
Inscription: Lundi 01 Octobre 2007, 09:20
Statut actuel: Actif et salarié | Enseignant

Re: Itération sur triple

Messagepar chellier » Samedi 15 Janvier 2011, 15:40

Bon, je viens de faire différents tests avec les versions proposées sur ma configuration : GMaths : 10 secondes, poids 484 Kio.
Maurice : 13,5 secondes, poids 180,9 Kio.
Avec la version que j'avais donné plus haut, avec unitsphere : 6,5 secondes, poids 49,9 Kio. Attention à bien mettre size(5cm,0), et non size(5,0) par contre.
on peut encore améliorer avec render(merge=true) :
Code: Tout sélectionner
surface sxyz=scale3(.5)*unitsphere;
draw(shift(x,y,z)*sxyz,blue,render(merge=true));


J'ai gagné, où il y a une réelle différence de rendu :?:

Christophe

PS : je sais, c'est pas un concours, mais c'est intéressant quand même :wink:
chellier
Modérateur
 
Messages: 355
Inscription: Samedi 25 Juillet 2009, 11:25
Localisation: Le Creusot
Statut actuel: Actif et salarié | Enseignant

Re: Itération sur triple

Messagepar XavteX » Samedi 15 Janvier 2011, 16:00

Oui lorsque je supprime le render 4 je n'ai pas besoin d'activer la figure pour la bouger...

Que signifie :
settings.thick=false;
defaultrender.sphere=0;
et
defaultrender.granularity=0;

Comment se débarrasser du parallélogramme de construction lorsqu'on tourne la figure?

Ton code donne un fichier plus lourd que le code de Maurice...
XavteX
Kilo-utilisateur
 
Messages: 122
Inscription: Jeudi 13 Janvier 2011, 09:44
Statut actuel: Actif et salarié | Enseignant

Re: Itération sur triple

Messagepar XavteX » Samedi 15 Janvier 2011, 16:22

Je ne comprends pas non plus : shift(x,y,z)*sxyz?
une translation?
ça change quoi par rapport à draw(sxyz,blue)?

Chellier : surface sxyz=scale3(.5)*unitsphere semble beaucoup plus léger effectivement!
XavteX
Kilo-utilisateur
 
Messages: 122
Inscription: Jeudi 13 Janvier 2011, 09:44
Statut actuel: Actif et salarié | Enseignant

Re: Itération sur triple

Messagepar GMaths » Dimanche 16 Janvier 2011, 13:56

XavteX a écrit:Que signifie :
settings.thick=false;

Quelque chose d'inutile dans cet exemple.
Avoir des traits épais dans une figure 3D a un "coût mémoire" : si tu demandes un trait d'épaisseur 2bp, Asymptote te crée une ligne tube... avec tous les calculs que cela implique : faire un zoom pour s'en convaincre.

Avec cette option ou sans cette option, zoome sur un trait et tu verras la différence en zoomant.

XavteX a écrit:defaultrender.sphere=0;


Il y a deux modélisations d'une sphère : voir la propriété sphere de la classe render ci-dessous.

Code: Tout sélectionner
// Useful lossy compression values.
restricted real Zero=0;
restricted real Low=0.0001;
restricted real Medium=0.001;
restricted real High=0.01;

restricted int PRCsphere=0;   // Renders slowly but produces smaller PRC files.
restricted int NURBSsphere=1; // Renders fast but produces larger PRC files.

struct render
{
  // PRC parameters:
  real compression;     // lossy compression parameter (0=no compression)
  real granularity;     // PRC rendering granularity

  bool closed;          // use one-sided rendering?
  bool tessellate;      // use tessellated mesh to store straight patches?
  bool3 merge;          // merge nodes before rendering, for lower quality
                        // but faster PRC rendering?
                        // (default=merge only transparent patches)
  int sphere;           // PRC sphere type (PRCsphere or NURBSsphere).

...................



XavteX a écrit:defaultrender.granularity=0;


C'est évoqué ci-dessus.

C'était un essai personnel non convaincant...
... que j'avais oublié d'effacer avant de poster.

XavteX a écrit:Comment se débarrasser du parallélogramme de construction lorsqu'on tourne la figure?


???

XavteX a écrit:Ton code donne un fichier plus lourd que le code de Maurice...


Pour qu'il soit moins lourd, il eut fallu pour cela que je me soucie de la taille des figures.

J'ai juste fait une proposition par rapport à une impression (estimée, non calculée) de rapidité...
... qui n'est apparemment pas la même suivant les systèmes ou les pcs.

Je ne confirme pas chez moi les temps qui ont été calculés... mais comme je ne suis pas à 2 secondes près, je ne vais pas chercher le pourquoi des différences.
Ma seule préoccupation était de proposer une version de plus, différente, pour que tu augmentes tes chances de visualiser ce que tu voulais.

XavteX a écrit:Je ne comprends pas non plus : shift(x,y,z)*sxyz ?
une translation ?


oui

XavteX a écrit:ça change quoi par rapport à draw(sxyz,blue)?


Attention le "sxyz" n'est pas le même !
La différence est que dans un cas, on utilise unitsphere et dans l'autre sphere.

XavteX a écrit:surface sxyz=scale3(.5)*unitsphere semble beaucoup plus léger effectivement!


Les méthodes sont bien différentes donc ne soyons pas étonnés qu'il ait une différence de temps sensible surtout si la figure comporte 216 sphères.

Code: Tout sélectionner
revolution sphere(triple c=O, real r, int n=nslice)
{
  return revolution(c,Arc(c,r,180,0,0,0,Y,n),Z);
}


Code: Tout sélectionner
restricted patch octant1=patch(X{Y}..{-X}Y{Z}..{-Y}Z..Z{X}..{-Z}cycle,
                               new triple[] {(1,a,a),(a,1,a),(a^2,a,1),
                                             (a,a^2,1)});

restricted surface unithemisphere=surface(octant1,t1*octant1,t2*octant1,
                                          t3*octant1);
restricted surface unitsphere=surface(octant1,t1*octant1,t2*octant1,t3*octant1,
                                      i*octant1,i*t1*octant1,i*t2*octant1,
                                      i*t3*octant1);
GMaths
Exa-utilisateur
 
Messages: 2031
Inscription: Lundi 01 Octobre 2007, 09:20
Statut actuel: Actif et salarié | Enseignant

Re: Itération sur triple

Messagepar XavteX » Dimanche 16 Janvier 2011, 14:03

MERCI! :D
XavteX
Kilo-utilisateur
 
Messages: 122
Inscription: Jeudi 13 Janvier 2011, 09:44
Statut actuel: Actif et salarié | Enseignant


Retourner vers Asymptote

Qui est en ligne

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