Empiler des surfaces

Pour toute demande d'aide sur des exemples non finalisés, c'est ici.
Les exemples aboutis et intéressants seront ajoutés aux sous-forums qui suivent.

Règles du forum
Pour toute demande d'aide pour la conception (ou la confirmation d'un code) d'une figure Asymptote, c'est ici.

J'invite ceux qui ont régulièrement des questions à poser à aller dans leur panneau de l'utilisateur pour indiquer dans la signature de leurs messages :

  1. Nom du système d'exploitation (W7 ou Ubuntu 12.04 ou ...)
  2. Version d'Asymptote et éditeur utilisé pour les figures Asymptote
  3. Distribution LaTeX et éditeur utilisé pour les tex.


On va gagner du temps dans les réponses !
mumblee
Messages : 38
Enregistré le : jeu. 11 mars 2010, 10:29
Localisation : Lille

Empiler des surfaces

Message non lu par mumblee » lun. 15 mars 2010, 15:36

Bonjour,

J'aimerais bien savoir s'il est possible de tracer deux surfaces espacées d'un pixel, afin qu'il n'y ait pas de "trou" lorsqu'on zoome sur la figure. Par exemple avec code suivant, le décalage est visible, même sans zoomer.

Code : Tout sélectionner

import three;

path3 fond,dessus;
fond=path3(unitsquare,XYplane);
dessus=shift(0.01*Z)*path3(scale(.9)*unitsquare,XYplane);

draw(surface(fond),black);
draw(surface(dessus),blue);

En fait je voudrais changer 0.01*Z en 1px , mais ça marche pô !

merci,

PS @Gaëtan : c'est pour accélérer mes routines d'affichage de cubes ;)
PPS : le bbcode pour le gras ne semble pas fonctionner. Ah ben si, mais pas dans l'aperçu avant édition.
PPPS : j'ai posté un message équivalent sur sf.net
Fabrice Eudes

Avatar du membre
GM
Administrateur du site
Administrateur du site
Messages : 1419
Enregistré le : dim. 7 mars 2010, 14:50

Re: Empiler des surfaces

Message non lu par GM » lun. 15 mars 2010, 16:40

Est-ce que tu ne t'embêtes pas pour rien ?
Tu remplaces 0.01 par 0.001 voire 0.0001 et tu n'auras plus le problème.
Index des fonctions - Exemple de lien donnant le résultat d'une recherche sur les mots 'arc' et 'triple' : http://asy.marris.fr/indexasy/?filtre=arc triple
Mes configurations (le 31/03/19) :
PC n°1 :Windows 10 - Asymptote(2.59)+MikTeX2.9 - Editeurs : Notepad++, TeXworks, Visual Studio Code.
Mes autres PC : Ubuntu 18.04LTS - Asymptote(2.52-?? git) + TexLive2018
Mon serveur : Debian Jessie - Asymptote(2.52-1 git) + TexLive2018
Merci de préciser la votre !

Avatar du membre
GM
Administrateur du site
Administrateur du site
Messages : 1419
Enregistré le : dim. 7 mars 2010, 14:50

Re: Empiler des surfaces

Message non lu par GM » lun. 15 mars 2010, 16:43

GM a écrit :Est-ce que tu ne t'embêtes pas pour rien ?
Tu remplaces 0.01 par 0.001 voire 0.0001 et tu n'auras plus le problème.


Tu peux même remplacer :

Code : Tout sélectionner

dessus=shift(0.01*Z)*path3(scale(.9)*unitsquare,XYplane);

par :

Code : Tout sélectionner

dessus=shift(0.0001*Z)*scale3(.9)*unitsquare3;


Bien sûr que l'écart restera là en zoomant beaucoup... mais qui va aller zoomer pour voir si les vignettes de couleur sont bien collées sur tes facettes ? :D
Index des fonctions - Exemple de lien donnant le résultat d'une recherche sur les mots 'arc' et 'triple' : http://asy.marris.fr/indexasy/?filtre=arc triple
Mes configurations (le 31/03/19) :
PC n°1 :Windows 10 - Asymptote(2.59)+MikTeX2.9 - Editeurs : Notepad++, TeXworks, Visual Studio Code.
Mes autres PC : Ubuntu 18.04LTS - Asymptote(2.52-?? git) + TexLive2018
Mon serveur : Debian Jessie - Asymptote(2.52-1 git) + TexLive2018
Merci de préciser la votre !

mumblee
Messages : 38
Enregistré le : jeu. 11 mars 2010, 10:29
Localisation : Lille

Re: Empiler des surfaces

Message non lu par mumblee » lun. 15 mars 2010, 17:30

GM a écrit :Tu peux même remplacer [...]

Je suis en train de faire du nettoyage dans le code...
GM a écrit :Bien sûr que l'écart restera là en zoomant beaucoup... mais qui va aller zoomer pour voir si les vignettes de couleur sont bien collées sur tes facettes ? :D

Voir sur le forum de sf.net : l'embêtant avec constante*Z est que cela dépend de l'unité de tracé choisie. Si on ne peut pas faire autrement, tant pis, mais c'est pas propre (oui, d'accord, comme mon code :oops: )
Fabrice Eudes

OG
V.I.P.
V.I.P.
Messages : 142
Enregistré le : dim. 7 mars 2010, 22:27

Re: Empiler des surfaces

Message non lu par OG » lun. 15 mars 2010, 19:04

Bonsoir

Pourquoi ne traces-tu pas la couronne carré et le carré intérieur ?
(rapidité ?)
Question unité, il faut voir il y a peut-être un truc à la deferred drawing...

O.G.

mumblee
Messages : 38
Enregistré le : jeu. 11 mars 2010, 10:29
Localisation : Lille

Re: Empiler des surfaces

Message non lu par mumblee » lun. 15 mars 2010, 19:08

OG a écrit :Pourquoi ne traces-tu pas la couronne carré et le carré intérieur ?
(rapidité ?)

C'était l'ancienne méthode que j'utilisais, mais effectivement j'essaie de gagner en rapidité.
Question unité, il faut voir il y a peut-être un truc à la deferred drawing...

Là, je ne sais pas...
Fabrice Eudes

Avatar du membre
pivaldi
V.I.P.
V.I.P.
Messages : 24
Enregistré le : jeu. 11 mars 2010, 21:09
Contact :

Re: Empiler des surfaces

Message non lu par pivaldi » lun. 15 mars 2010, 20:47

mumblee a écrit :
OG a écrit :Question unité, il faut voir il y a peut-être un truc à la deferred drawing...

Là, je ne sais pas...


Tu traces ce qui doit être indépendant de la mise à l'échelle dans une « picture » que tu ajoutes à la « currentpicture », comme du deferred drawing en 2D.
Concrètement ça donne ça :

Code : Tout sélectionner

import three;

unitsize(4cm);
draw(unitcube,invisible,black);

picture pic;
draw(pic,scale3(2cm)*unitcube,invisible,red);

currentpicture.add(new void(picture f, transform3 t) {
    f.add(shift(t*(0,0,0))*pic,group=true,above=true);
  });


Le cube rouge fera toujours 2cm, quelque soit le « unitsize » ou le « size » que tu mets.

Tout est dans ##la##doc## le code source de three (ligne 2199):

Code : Tout sélectionner

// Fit the picture src using the identity transformation (so user
// coordinates and truesize coordinates agree) and add it about the point
// position to picture dest.
void add(picture dest, picture src, triple position, bool group=true,
         bool above=true)
{
  dest.add(new void(picture f, transform3 t) {
      f.add(shift(t*position)*src,group,above);
    });
}

OG
V.I.P.
V.I.P.
Messages : 142
Enregistré le : dim. 7 mars 2010, 22:27

Re: Empiler des surfaces

Message non lu par OG » lun. 15 mars 2010, 20:52

Bon, le temps de manger un peu de crumble avec un thé à l'orange
et voici Philippe !
Au moins je n'aurai pas à passer des heures avant de donner le même exemple.

O.G.

Avatar du membre
pivaldi
V.I.P.
V.I.P.
Messages : 24
Enregistré le : jeu. 11 mars 2010, 21:09
Contact :

Re: Empiler des surfaces

Message non lu par pivaldi » lun. 15 mars 2010, 21:16

OG a écrit :Bon, le temps de manger un peu de crumble avec un thé à l'orange
et voici Philippe !
Au moins je n'aurai pas à passer des heures avant de donner le même exemple.
O.G.

:)

Comme ça tu as plus de temps pour construire ton avatar :D

OG
V.I.P.
V.I.P.
Messages : 142
Enregistré le : dim. 7 mars 2010, 22:27

Re: Empiler des surfaces

Message non lu par OG » lun. 15 mars 2010, 21:22

Re

Je ne sais pas si la complexité du deferred est préférable à prendre Z=0.0001.
Normalement le placement dans ce qui suit est indépendant de l'échelle.
(j'ai bien dit normalement)

Code : Tout sélectionner

import three;
real taille=4cm;
unitsize(taille);
path3 fond, dessus;
fond=path3(unitsquare,XYplane);
dessus=scale3(.9)*fond;//unitsquare;
draw(surface(fond),black);

picture pic;
draw(pic,scale3(taille)*surface(dessus),red);

currentpicture.add(new void(picture f, transform3 t) {
    transform3 it=inverse(t);
    triple zz=it*(0,0,.1bp);
    // .05=(1-.9)/2
    f.add(shift(t*zz+t*(.05,.05,0))*pic,group=true,above=true);
  });


Sinon le gain est vraiment appréciable entre la superposition de deux carrés
par rapport à la construction initiale (couronne carrée + carré) évidemment en
stockant la face de base créée par surface(.) et en translatant, tournant pour
construire ton cube ?

@Philippe : pourquoi un accent sur ton pi ?
mon avatar attendra...

O.G.

Répondre