Page 1 sur 2

Empiler des surfaces

Posté : lun. 15 mars 2010, 15:36
par mumblee
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

Re: Empiler des surfaces

Posté : lun. 15 mars 2010, 16:40
par GM
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.

Re: Empiler des surfaces

Posté : lun. 15 mars 2010, 16:43
par GM
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

Re: Empiler des surfaces

Posté : lun. 15 mars 2010, 17:30
par mumblee
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: )

Re: Empiler des surfaces

Posté : lun. 15 mars 2010, 19:04
par OG
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.

Re: Empiler des surfaces

Posté : lun. 15 mars 2010, 19:08
par mumblee
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...

Re: Empiler des surfaces

Posté : lun. 15 mars 2010, 20:47
par pivaldi
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);
    });
}

Re: Empiler des surfaces

Posté : lun. 15 mars 2010, 20:52
par OG
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.

Re: Empiler des surfaces

Posté : lun. 15 mars 2010, 21:16
par pivaldi
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

Re: Empiler des surfaces

Posté : lun. 15 mars 2010, 21:22
par OG
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.