Dessiner un tétraédre.

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.

Dessiner un tétraédre.

Messagepar Fabrice » Sam 13 Mar 2010, 12:23

Bonjour à tous,
J'ai déjà posé cette question sur le forum officiel, mais je n'ai pas vraiment eu de réponses.
Il faut d'abord savoir que ce code provoque chez moi un rectangle noir qui vient probablement de ma carte graphique que je vais changer sous peu.
Ma question porte surtout sur le code :
est-ce la façon la plus élégante pour construire un tétraèdre ?
Merci.
Code: Tout sélectionner
import three;
 import graph3;
 import math;
 import animate;
 import bsp;
 settings.outformat="pdf";
 settings.prc=true;
 settings.render=4;
size(8cm);
currentprojection;
pen p=fontsize(8pt);
 real a=2;
 triple[] z={(0,0,0),(a,0,0),(0,a,0),(0,0,a)};
 path3[] tetra={z[0]--z[1]--z[2]--cycle,z[0]--z[1]--z[3]--cycle,z[0]--z[2]--z[3]--cycle,z[3]--z[1]--z[2]--cycle};
 for (int i=0; i<tetra.length; ++i){ draw(surface(tetra[i]),lightgrey+opacity(0.5),nolight);
draw(tetra[i]);}
 triple N=midpoint(z[1]--z[2]);
 path3 g5=z[0]--N;
draw(g5,dashed);
draw(shift(N-z[0])*g5);
real t=0.5;
triple M=(1-t)*z[0]+t*N;
 path3 plan=plane(normal(tetra[0]),z[2]-z[1],shift(z[1]-N)*M);
triple[] T1=intersectionpoints(plan,tetra[2]);
triple[] T2=intersectionpoints(plan,tetra[1]);
draw(surface(T1[0]--T1[1]--T2[1]--T2[0]--cycle),red+opacity(0.5),nolight);
draw(T1[0]--T1[1]--T2[1]--T2[0]--cycle); limits(z[0],1.2*(z[1]+z[2]+z[3]));
xaxis3(Label("$x$",1),Arrow3);
yaxis3(Label("$y$",1),Arrow3);
 zaxis3(Label("$z$",1),Arrow3);
label("A",z[1],NW,p); label("B",z[2],S,p);
 label("C",z[3],NE,p); label("N",N,S+W,p);
 label("K",T1[0],NE,p);
label("J",T1[1],NE,p);
 label("L",T2[0],NW,p);
 label("I",T2[1],NW,p);
 label("O",z[0],NW,p);
 shipout(bbox(1mm,blue+1bp));


PS : un petit clin d'oeil à OG qui doit avoir dans ses fichiers une petite animation que j'ai écrite ! ;)
Fabrice
 
Messages: 30
Inscription: Sam 13 Mar 2010, 11:41

Re: Dessiner un tétraédre.

Messagepar GM » Sam 13 Mar 2010, 14:45

Remarques préalables :
pourquoi tant d'import (inutiles) dans le code proposé ???
... et il y a des choses contradictoires : bsp et prc.

Fabrice a écrit:Ma question porte surtout sur le code :
est-ce la façon la plus élégante pour construire un tétraèdre ?


On espère tous un geometry3d... mais en attendant, ce n'est pas forcément simple... et il y a plusieurs méthodes.

Pour un simple tétraèdre, et si l'intention n'est pas de faire tourner la figure, on peut signaler l'existence de geoespace, qui donne cela :

Figure asymptote bf4b0939a954c0bd7af316d426bf8128
*** 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. import geoespace;
  2. triple A,B,C,D;
  3. size(150,0);
  4. A=(0,0,0);
  5. B=(0,3,0);
  6. C=(-1.5,1.5,0);
  7. D=(1,1,3);
  8. pyramide(D,A--B--C--cycle);
  9. trace();
  10. label("$A$",A,sud);
  11. label("$B$",B,sud);
  12. label("$C$",C,sud);
  13. label("$D$",D,nord);


Il reste à voir si cela peut être adapté à ta figure.

NB : Olivier, Philippe... je précise que c'est la version originale de geoespace... car la version modifiée de Philippe (qui a été proposée sur mathematex récemment) foire avec cet exemple simple.
Index des fonctions - Exemple de lien donnant le résultat d'une recherche sur les mots 'arc' et 'triple' : http://gmaths.net/asy/index/?filtre=arc triple
Avatar de l’utilisateur
GM
Administrateur du site
Administrateur du site
 
Messages: 627
Inscription: Dim 7 Mar 2010, 14:50

Re: Dessiner un tétraédre.

Messagepar GM » Sam 13 Mar 2010, 15:09

On peut aussi signaler l'existence de polyhedron_js.asy sur le site de Philippe.

Avec le code suivant :
Code: Tout sélectionner
import polyhedron_js;
settings.tex="pdflatex";
settings.outformat="pdf";
size(150cm);
currentprojection=orthographic(2,1,1);

polyhedron[] parr={tetrahedron};
filldraw(parr,new pen[]{0.95white},op=0.7);

tu obtiendras quelque chose comme cela que tu pourras faire tourner cette fois :
2010-03-13_150813.png
2010-03-13_150813.png (4.81 Kio) Vu 260 fois

polyhedron.pdf
(35.48 Kio) Téléchargé 12 fois
(possibilité de faire tourner le tétrahèdre dans le pdf si visualisation avec une version récente d'AcrobatReader)

Il n'y a encore aucune solution satisfaisante à 100% :
  • Avec le couple bsp/geoespace... tu pourras avoir des pointillés, mais tu ne pourras pas faire tourner via opengl.
  • Si tu préfères faire tourner (choix de prc/opengl), tu pourras jouer sur les transparences pour les faces cachées, mais les arrêtes cachées ne seront pas en pointillés.
Index des fonctions - Exemple de lien donnant le résultat d'une recherche sur les mots 'arc' et 'triple' : http://gmaths.net/asy/index/?filtre=arc triple
Avatar de l’utilisateur
GM
Administrateur du site
Administrateur du site
 
Messages: 627
Inscription: Dim 7 Mar 2010, 14:50

Re: Dessiner un tétraédre.

Messagepar pivaldi » Sam 13 Mar 2010, 15:34

GM a écrit:NB : Olivier, Philippe... je précise que c'est la version originale de geoespace... car la version modifiée de Philippe (qui a été proposée sur mathematex récemment) foire avec cet exemple simple.

Exact !
Essaye la nouvelle version.
Avatar de l’utilisateur
pivaldi
V.I.P.
V.I.P.
 
Messages: 24
Inscription: Jeu 11 Mar 2010, 21:09

Re: Dessiner un tétraédre.

Messagepar GM » Sam 13 Mar 2010, 15:44

pivaldi a écrit:
GM a écrit:NB : Olivier, Philippe... je précise que c'est la version originale de geoespace... car la version modifiée de Philippe (qui a été proposée sur mathematex récemment) foire avec cet exemple simple.

Exact !
Essaye la nouvelle version.


Figure asymptote 1f689b075dccd069296a4ccba9c8c482
*** 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. import geoespace_pi;
  2. triple A,B,C,D;
  3. size(150,0);
  4. A=(0,0,0);
  5. B=(0,3,0);
  6. C=(-1.5,1.5,0);
  7. D=(1,1,3);
  8. pyramide(D,A--B--C--cycle);
  9. trace();
  10. label("$A$",A,sud);
  11. label("$B$",B,sud);
  12. label("$C$",C,sud);
  13. label("$D$",D,nord);


Cela fonctionne ! C'est vrai que les pointillés sont bien mieux.

NB : Philippe, Olivier, je précise que sur le forum, il y a les deux possibilités dorénavant : geoespace et geoespace_pi (nouvelle version de Philippe donnée ci-dessus).
Index des fonctions - Exemple de lien donnant le résultat d'une recherche sur les mots 'arc' et 'triple' : http://gmaths.net/asy/index/?filtre=arc triple
Avatar de l’utilisateur
GM
Administrateur du site
Administrateur du site
 
Messages: 627
Inscription: Dim 7 Mar 2010, 14:50

Re: Dessiner un tétraédre.

Messagepar GM » Sam 13 Mar 2010, 20:03

Toujours sur le sujet du tétraèdre, j'ai dans l'idée que celui qui fera geometry3 utilisera des structures.

Deux exemples :

Figure asymptote bb34edaef79e0e3e8d14d8a9a870f536
*** 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. import geoespace_pi;
  2. //defaultbackpen +=linewidth(0);
  3. currentprojection=orthographic(10,4,6);
  4. size(250);
  5.  
  6. real a=5;
  7.  
  8. struct PYRA { triple S;
  9. path3 base;
  10. triple[] sb;
  11. shape fa;
  12. pen colar;
  13. pen colfa;
  14. void operator init(triple S, path3 base, pen colar=black, pen colfa=white) {
  15. this.S=S;
  16. this.base=base;
  17. this.colar=colar;
  18. this.colfa=colfa;
  19. for(int i=0; i<length(this.base); ++i) {
  20. this.sb.push(point(this.base,i));
  21.  
  22. }
  23. this.sb.cyclic=true;
  24. this.fa[0]=this.base;
  25. for(int i=0; i<length(this.base); ++i) {
  26. this.fa.push(this.S--this.sb[i]--this.sb[i+1]--cycle);
  27. }
  28. }
  29. void misenscene() {
  30. insertscene(this.fa,this.colfa,this.colar);
  31. }
  32. }
  33.  
  34. PYRA t=PYRA((0,0,a),(0,0,0)--(a,0,0)--(0,a,0)--cycle,red,paleblue+opacity(.5));
  35. t.misenscene();
  36.  
  37. dot("$S$",t.S);
  38. dot("$A$",t.sb[0]);
  39. dot("$B$",t.sb[1]);
  40. dot("$C$",t.sb[2]);
  41. trace();
  42.  


Figure asymptote d2d7b928a0d82c6555cf9d836b7e78d6
*** 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. import geoespace_pi;
  2. //defaultbackpen +=linewidth(0);
  3. currentprojection=orthographic(10,4,6);
  4. size(250);
  5.  
  6. real a=5;
  7.  
  8. struct PYRA { triple S;
  9. path3 base;
  10. triple[] sb;
  11. shape fa;
  12. pen colar;
  13. pen colfa;
  14. void operator init(triple S, path3 base, pen colar=black, pen colfa=white) {
  15. this.S=S;
  16. this.base=base;
  17. this.colar=colar;
  18. this.colfa=colfa;
  19. for(int i=0; i<length(this.base); ++i) {
  20. this.sb.push(point(this.base,i));
  21.  
  22. }
  23. this.sb.cyclic=true;
  24. this.fa[0]=this.base;
  25. for(int i=0; i<length(this.base); ++i) {
  26. this.fa.push(this.S--this.sb[i]--this.sb[i+1]--cycle);
  27. }
  28. }
  29. void misenscene() {
  30. insertscene(this.fa,this.colfa,this.colar);
  31. }
  32. }
  33.  
  34. PYRA t=PYRA((0,0,a),(0,0,0)--(a,0,0)--(a,a,0)--(0,a,0)--cycle,blue,orange+opacity(.5));
  35. t.misenscene();
  36.  
  37. dot("$S$",t.S);
  38. dot("$A$",t.sb[0]);
  39. dot("$B$",t.sb[1]);
  40. dot("$C$",t.sb[2]);
  41. trace();
  42.  
Index des fonctions - Exemple de lien donnant le résultat d'une recherche sur les mots 'arc' et 'triple' : http://gmaths.net/asy/index/?filtre=arc triple
Avatar de l’utilisateur
GM
Administrateur du site
Administrateur du site
 
Messages: 627
Inscription: Dim 7 Mar 2010, 14:50

Re: Dessiner un tétraédre.

Messagepar pivaldi » Sam 13 Mar 2010, 20:18

Oui mais pas comme ça, j'espère !
Définir un objet ne signifie pas le tracer ! :shock:
Et cette routine "trace()", qu'est-ce qu'elle vient faire dans Asymptote ? Aucun paquet ne fonctionne ainsi…
Pour bien faire, il faut surcharger les routines de tracé comme le font les autres paquets et tester le settings.render pour savoir comment faire le rendu.
Si je devais me lancer dans ce projet, je partirais certainement de polyhedron_js.asy en surchargent le module bsp pour qu'il trace les arrêtes cachées… il n'y en aurait pas pour très longtemps, finalement… mais comme je ne vais pas m'y lancer je :arrow:
Avatar de l’utilisateur
pivaldi
V.I.P.
V.I.P.
 
Messages: 24
Inscription: Jeu 11 Mar 2010, 21:09

Re: Dessiner un tétraédre.

Messagepar GM » Sam 13 Mar 2010, 20:30

pivaldi a écrit:Oui mais pas comme ça, j'espère !

:lol: :lol:
pivaldi a écrit:Définir un objet ne signifie pas le tracer ! :shock:

Là, je n'ai pas compris... car je peux le définir sans le tracer.
pivaldi a écrit:Et cette routine "trace()", qu'est-ce qu'elle vient faire dans Asymptote ? Aucun paquet ne fonctionne ainsi…

Tu ne voulais pas que je fasse geometry3 en 30mn tout de même ? :mrgreen: J'ai repris ce que fournissait geoespace pour l'affichage... car je voulais juste montrer le principe de structure. ;-)
pivaldi a écrit:Pour bien faire, il faut surcharger les routines de tracé comme le font les autres paquets et tester le settings.render pour savoir comment faire le rendu.
Si je devais me lancer dans ce projet, je partirais certainement de polyhedron_js.asy en surchargent le module bsp pour qu'il trace les arrêtes cachées… il n'y en aurait pas pour très longtemps, finalement… mais comme je ne vais pas m'y lancer je :arrow:

Oui, sors car tu devrais avoir honte de nous dire que c'est si rapide à faire que cela pourrait déjà être fait. :lol: :mrgreen:
Index des fonctions - Exemple de lien donnant le résultat d'une recherche sur les mots 'arc' et 'triple' : http://gmaths.net/asy/index/?filtre=arc triple
Avatar de l’utilisateur
GM
Administrateur du site
Administrateur du site
 
Messages: 627
Inscription: Dim 7 Mar 2010, 14:50

Re: Dessiner un tétraédre.

Messagepar pivaldi » Sam 13 Mar 2010, 21:30

GM a écrit:
pivaldi a écrit:Définir un objet ne signifie pas le tracer ! :shock:

Là, je n'ai pas compris... car je peux le définir sans le tracer.

Heu… oui, mille excuses, je n'avais pas vus le t.misentruc(); :oops:
Avatar de l’utilisateur
pivaldi
V.I.P.
V.I.P.
 
Messages: 24
Inscription: Jeu 11 Mar 2010, 21:09

Re: Dessiner un tétraédre.

Messagepar Fabrice » Dim 14 Mar 2010, 11:41

Bonjour à tous,
GM a écrit:pourquoi tant d'import (inutiles) dans le code proposé ???
... et il y a des choses contradictoires : bsp et prc.

ce code n'est pas fini, j'y compte faire une animation (d'où animate) en montrant l'évolution de l'aire du rectangle, mais ma carte graphique ne me permet pas de le faire pour l'instant.
bsp et prc, là je suis d'accord.
Merci.
@+
Fabrice
 
Messages: 30
Inscription: Sam 13 Mar 2010, 11:41

Suivante

Retourner vers Les demandes d'aide

Qui est en ligne

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

cron