[Résolu] Un petit défi

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] Un petit défi

Messagepar projetmbc » Samedi 02 Janvier 2010, 19:03

Bonjour,
je voudrais essayer de tracer des plans 3D avec les deux styles "originaux" ci-dessous. Je cherche des méthodes applicables à un plan "quelconque" défini par trois sommets "visuels", le 4ème étant induit.

troisPlans.png
troisPlans.png (58.25 Kio) Vu 1609 fois


Toute info. est la bienvenue.
Dernière édition par projetmbc le Dimanche 03 Janvier 2010, 13:55, édité 1 fois.
projetmbc
Péta-utilisateur
 
Messages: 1897
Inscription: Samedi 29 Décembre 2007, 00:58
Statut actuel: Actif et salarié | Enseignant

Publicité

Re: Asymptote-Un petit défi

Messagepar GMaths » Dimanche 03 Janvier 2010, 03:07

Je te mets sur la voie d'une solution avec ceci

Code: Tout sélectionner
size(7.5cm,0);
import three;
settings.tex="pdflatex";
for(int i; i<10; ++i)
   for(int j; j<10; ++j)
draw(shift(2*i,2*j,0)*surface(shift(-1,-1,0)*scale3(2)*unitsquare3^^reverse(scale3(.5)*unitcircle3),planar=true),white+opacity(.5));
draw(surface(shift(0,0,-5)*scale3(20)*unitsquare3,planar=true),paleblue);
shipout(bbox(2mm,Fill(white)));


tu obtiens :

2010-01-03_025721.png
2010-01-03_025721.png (7.39 Kio) Vu 1558 fois


Pour l'instant, la possibilité d'ajouter des textures n'est pas encore implémentée (à ma modeste connaissance) donc il faut bricoler un peu.

Ajouter un troisième plan sera facile,

Transformer cela en fonction, avec en paramètres trois "triple", c'est plus difficile...
... donc, quand c'est soumis à 24h de reprendre les cours avec plein de copies à corriger, c'est trop tard comme demande pour moi : il fallait venir au début des vacances avec ton défi. ;-)
A toi de chercher. ;-)
GMaths
Exa-utilisateur
 
Messages: 2031
Inscription: Lundi 01 Octobre 2007, 09:20
Statut actuel: Actif et salarié | Enseignant

Re: Asymptote-Un petit défi

Messagepar projetmbc » Dimanche 03 Janvier 2010, 11:03

GMaths a écrit:Je te mets sur la voie d'une solution avec ceci

Merci, c'est juste génial. Dire qu'il y en a qui doute de l'efficacité de Asymptote... :mrgreen:

GMaths a écrit:Transformer cela en fonction, avec en paramètres trois "triple", c'est plus difficile...

Où est la difficulté ?

GMaths a écrit:... quand c'est soumis à 24h de reprendre les cours avec plein de copies à corriger, c'est trop tard comme demande pour moi : il fallait venir au début des vacances avec ton défi. ;-)

Hum il y en a qui corrige leurs ciopies au dernier moment... :mrgreen:
projetmbc
Péta-utilisateur
 
Messages: 1897
Inscription: Samedi 29 Décembre 2007, 00:58
Statut actuel: Actif et salarié | Enseignant

Re: Asymptote-Un petit défi

Messagepar projetmbc » Dimanche 03 Janvier 2010, 11:08

Question : c'est bien le unitsquare3^^reverse(scale3(.5)*unitcircle3) qui fait les trous.

Avoir une solution à la main est pas mal car cela permet de faire des choses très persos.
projetmbc
Péta-utilisateur
 
Messages: 1897
Inscription: Samedi 29 Décembre 2007, 00:58
Statut actuel: Actif et salarié | Enseignant

Re: Asymptote-Un petit défi

Messagepar projetmbc » Dimanche 03 Janvier 2010, 11:45

J'ai un souci de mémoire. Cela vient de l'utilisation de settings.tex="pdflatex";. En utilisant le code suivant, cela fonctionne sans souci.
Code: Tout sélectionner
size(7.5cm,0);
import three;
for(int i; i<10; ++i)
   for(int j; j<10; ++j)
draw(shift(2*i,2*j,0)*surface(shift(-1,-1,0)*scale3(2)*unitsquare3^^reverse(scale3(.5)*unitcircle3),planar=true),white+opacity(.5));
draw(surface(shift(0,0,-5)*scale3(20)*unitsquare3,planar=true),paleblue);
shipout(bbox(2mm,Fill(white)));
projetmbc
Péta-utilisateur
 
Messages: 1897
Inscription: Samedi 29 Décembre 2007, 00:58
Statut actuel: Actif et salarié | Enseignant

Re: Asymptote-Un petit défi

Messagepar GMaths » Dimanche 03 Janvier 2010, 11:47

projetmbc a écrit:Question : c'est bien le unitsquare3^^reverse(scale3(.5)*unitcircle3) qui fait les trous.


si p1 et p2 sont des path3 fermés, convenablement positionnés et orientés (quitte à utiliser reverse pour changer l'orientation de l'un deux), alors
Code: Tout sélectionner
surface(p1^^p2,planar=true)

va te donner une partie de plan dont on enlève une partie.

Code: Tout sélectionner
size(7.5cm,0);
import graph3;

path3 p1=shift(-1,-1,0)*scale3(2)*unitsquare3,
      p2=scale3(.5)*unitcircle3;

draw(p1,1bp+red);
draw(p2,1bp+blue);

draw(surface(p1^^reverse(p2),planar=true),white+opacity(.5));

limits((-2,-2,-1),(2,2,1));
xaxis3("$x$",Arrow3);
yaxis3("$y$",Arrow3);
zaxis3("$z$",Arrow3);

shipout(bbox(2mm,Fill(white)));


2010-01-03_114320.png
2010-01-03_114320.png (5.95 Kio) Vu 1480 fois


Le plan troué de l'exemple précédent est une juxtaposition de carrés troués. ;-)
(bricolage en attendant que soit ajoutée la possibilité d'ajouter facilement des motifs/textures)
Dernière édition par GMaths le Dimanche 03 Janvier 2010, 12:04, édité 2 fois.
GMaths
Exa-utilisateur
 
Messages: 2031
Inscription: Lundi 01 Octobre 2007, 09:20
Statut actuel: Actif et salarié | Enseignant

Re: Asymptote-Un petit défi

Messagepar GMaths » Dimanche 03 Janvier 2010, 11:54

projetmbc a écrit:J'ai un souci de mémoire. Cela vient de l'utilisation de settings.tex="pdflatex";. En utilisant le code suivant, cela fonctionne sans souci.

Tu compiles comment alors ? Quel type de sortie ?


A un moment donné, il fallait compiler avec pdflatex pour obtenir des transparences, que l'on n'obtenait pas avec une sortie ps.
Mais je n'ai pas suivi le détail des modifications des dernières versions d'Asymptote... et j'ai le vague souvenir d'avoir vu passer des changements relatifs aux transparences.

Moi j'ai compilé pour obtenir un pdf et les plans en question, je peux les tourner dans le pdf (SI visualisation avec acrobat reader récent).
Le voilà : http://docs.gmaths.net/tempo/plans.pdf (160ko)
GMaths
Exa-utilisateur
 
Messages: 2031
Inscription: Lundi 01 Octobre 2007, 09:20
Statut actuel: Actif et salarié | Enseignant

Re: Asymptote-Un petit défi

Messagepar projetmbc » Dimanche 03 Janvier 2010, 13:04

GMaths a écrit:si p1 et p2 sont des path3 fermés, convenablement positionnés et orientés (quitte à utiliser reverse pour changer l'orientation de l'un deux), alors
Code: Tout sélectionner
surface(p1^^p2,planar=true)
va te donner une partie de plan dont on enlève une partie.

Ce serait pas mal si on pouvait additionner deux chemins pour former leur réunion...
projetmbc
Péta-utilisateur
 
Messages: 1897
Inscription: Samedi 29 Décembre 2007, 00:58
Statut actuel: Actif et salarié | Enseignant

Re: Asymptote-Un petit défi

Messagepar GMaths » Dimanche 03 Janvier 2010, 13:29

projetmbc a écrit:Ce serait pas mal si on pouvait additionner deux chemins pour former leur réunion...
Tiens, il me semble que tu as revu ta phrase : tu as bien fait ! ;-)

As-tu un exemple concret en tête ?
GMaths
Exa-utilisateur
 
Messages: 2031
Inscription: Lundi 01 Octobre 2007, 09:20
Statut actuel: Actif et salarié | Enseignant

Re: Asymptote-Un petit défi

Messagepar projetmbc » Dimanche 03 Janvier 2010, 13:45

Nickel pour les explications.
GMaths a écrit:Tu compiles comment alors ? Quel type de sortie ?

Rien de spécial, juste un "asy -f png pathOfTheFile" avec asymptote-1.90. J'obtiens l'image suivante :
planeWithHoles.png

Sinon j'ai pu faire le dessin suivant à partir de ton code :
planeOfAndWithHoles.png
planeOfAndWithHoles.png (6.93 Kio) Vu 1401 fois

Code utilisé :
Code: Tout sélectionner
// Source : http://forum.mathematex.net/latex-f6/asymptote-un-petit-defi-t10101.html
size(7.5cm,0);
import three;

for(int i; i<10; ++i){
   for(int j; j<10; ++j){
      draw(shift(2*i, 2*j, 5)*surface(shift(-1, -1, 0)*scale3(.5)*unitcircle3,planar=true),red);
      draw(shift(2*i, 2*j, 0)*surface(shift(-1, -1, 0)*scale3(2)*unitsquare3^^reverse(scale3(.5)*unitcircle3),planar=true),white+opacity(.5));
   }
}

draw(shift(-2,-2,5)*scale3(20.5)*unitsquare3);
draw(surface(shift(-2,-2,-5)*scale3(20.5)*unitsquare3,planar=true),paleblue);
shipout(bbox(2mm,Fill(white)));

Il reste juste à gérer l'angle de vue. Où a-t-on de la doc. compréhensible sur ce sujet ?
projetmbc
Péta-utilisateur
 
Messages: 1897
Inscription: Samedi 29 Décembre 2007, 00:58
Statut actuel: Actif et salarié | Enseignant

Re: Asymptote-Un petit défi

Messagepar projetmbc » Dimanche 03 Janvier 2010, 14:22

GMaths a écrit:
projetmbc a écrit:Ce serait pas mal si on pouvait additionner deux chemins pour former leur réunion...


As-tu un exemple concret en tête ?

Dans le cas du plan troué, on pourrait tracer un grand carré puis retirer le chemin union des cercles.

GMaths a écrit:
projetmbc a écrit:Ce serait pas mal si on pouvait additionner deux chemins pour former leur réunion...
Tiens, il me semble que tu as revu ta phrase : tu as bien fait ! ;-)

Damned...
projetmbc
Péta-utilisateur
 
Messages: 1897
Inscription: Samedi 29 Décembre 2007, 00:58
Statut actuel: Actif et salarié | Enseignant

Re: Asymptote-Un petit défi

Messagepar GMaths » Dimanche 03 Janvier 2010, 14:31

projetmbc a écrit:Il reste juste à gérer l'angle de vue. Où a-t-on de la doc. compréhensible sur ce sujet ?

C'est le plus "ch...." (...aque fois la même chose). :D

Suggestion :

  • tu compiles sans l'option -f png, en n'oubliant pas d'enlever la dernière ligne \shipout..., pour obtenir la sortie OPENGL ;
  • tu tournes la figure pour obtenir l'angle désiré
  • clic droit puis choisir caméra dans la liste pour obtenir les paramètres de l'angle de vue choisi, que je récupère personnellement directement dans la console de notepad++
  • tu rajoutes le paramètre relatif à la caméra dans ton script puis tu refais une compilation avec le format de ton choix en sortie.

2010-01-03_140729.png
Copie d'écran de la sortie OPENGL : avec un clic-droit, on peut obtenir les paramètres de l'angle de vue.
2010-01-03_140729.png (10.34 Kio) Vu 1356 fois


2010-01-03_140901.png
Dans Notepad++, on obtient les paramètres, et il suffit de récupérer une partie du code et de l'ajouter au script.






Code: Tout sélectionner
size(7.5cm,0);
import three;

currentprojection=perspective(camera=(-7.99810087959634,-13.0384706190044,14.2845410966708));

for(int i; i<10; ++i){
   for(int j; j<10; ++j){
      draw(shift(2*i, 2*j, 5)*surface(shift(-1, -1, 0)*scale3(.5)*unitcircle3,planar=true),red);
      draw(shift(2*i, 2*j, 0)*surface(shift(-1, -1, 0)*scale3(2)*unitsquare3^^reverse(scale3(.5)*unitcircle3),planar=true),white+opacity(.5));
   }
}
draw(shift(-2,-2,5)*scale3(20.5)*unitsquare3);
draw(surface(shift(-2,-2,-5)*scale3(20.5)*unitsquare3,planar=true),paleblue);
//shipout(bbox(2mm,Fill(white)));


et cela donne ensuite en sortie png, ceci :
Image

en sortie pdf avec prc embarquée (visualisable avec acrobat reader récent), ceci :
http://docs.gmaths.net/tempo/troisplans.pdf
GMaths
Exa-utilisateur
 
Messages: 2031
Inscription: Lundi 01 Octobre 2007, 09:20
Statut actuel: Actif et salarié | Enseignant

Re: [RESOLU] Asymptote-Un petit défi

Messagepar OG » Dimanche 03 Janvier 2010, 14:49

Bravo à Gaëtan pour le code et les explications.
Pour le plan avec les trous "transparents", que donne la solution unitsquare évidé des disques en terme de mémoire/manipulation ?

@projetmbc : d'où vient ton exemple (et avec quel logiciel) ?

Finalement Asymptote peut être utile !

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

Re: [RESOLU] Asymptote-Un petit défi

Messagepar projetmbc » Dimanche 03 Janvier 2010, 15:51

Je ne savais pas que Asymptote permettait de manipuler une figure via OpenGl grâce "asy -V pathOfTheFile". Nickel, nickel... Cela m'intéresse d'autant plus que les paramètres de caméra apparaissant dans la console, on peut facilement les récupérer via un script Python lançant Asymptote (c'est ce principe qu'utilise notepad++). Cela me plait bien dans l'optique d'une interface graphique Python pour ajuster certaines choses dans une figure Asymptote.

Bien vu pour cette manipulation.

OG a écrit:@projetmbc : d'où vient ton exemple (et avec quel logiciel) ?

L'exemple vient de mon cours sur la Géométrie dans l'espace en Term. S pour donner les différents cas d'intersection de trois plans. Je l'avais fait via Cabri 3D.

OG a écrit:Finalement Asymptote peut être utile !

Je n'ai jamais douté de l'utilité d'Asymptote. Il y a juste une chose qui me posait réellement problème, exceptée la grosse bêtise que j'ai dite sur le rendu des images : son installation sur Mac. Mais j'ai lu récemment une méthode de compilation du code qui marche sans souci.

OG a écrit:Pour le plan avec les trous "transparents", que donne la solution unitsquare évidé des disques en terme de mémoire/manipulation ?

J'ai un PC un peu fatigué et je n'ai pas réussi à compiler le code : en fait, j'ai eu une drôle d'image qui avait à la fois des morceaux de l'image attendue et des morceaux de mon bureau. Je ne sais pas s'il s'agit d'un bug Ubuntu ou d'un souci de mémoire avec mon ordi. un peu fatigué. Si quelqu'un pouvait tester sous Ubuntu...
projetmbc
Péta-utilisateur
 
Messages: 1897
Inscription: Samedi 29 Décembre 2007, 00:58
Statut actuel: Actif et salarié | Enseignant

Re: [RESOLU] Asymptote-Un petit défi

Messagepar GMaths » Dimanche 03 Janvier 2010, 16:25

Une méthode alternative (on "enlève" un tableau de path3 à un path3) que je pense plus lente :

Code: Tout sélectionner
size(7.5cm,0);
import graph3;

currentprojection=perspective(
camera=(4.73228998404852,3.2090201378541,3.52563553483471),
up=(-0.00701016356306763,-0.00521599083684134,0.0145082405986303),
target=(-0.0883563917120318,0.0755335577321059,0.0698238638158672));

path3 p1=shift(-1,-1,0)*scale3(2)*unitsquare3,
      p2=scale3(.25)*unitcircle3;

path3[] p3=shift(.5,.5,0)*p2
           ^^shift(-.5,-.5,0)*p2
         ^^shift(.5,-.5,0)*p2
         ^^shift(-.5,.5,0)*p2;

draw(p1,1bp+red);
draw(p3,1bp+blue);

draw(surface(reverse(p1)^^p3,planar=true),white+opacity(.5));

limits(-1.5X-1.5Y-.5Z,1.5X+1.5Y+.5Z);
xaxis3("$x$",Arrow3);
yaxis3("$y$",Arrow3);
zaxis3("$z$",Arrow3);


2010-01-03_162102.png
GMaths
Exa-utilisateur
 
Messages: 2031
Inscription: Lundi 01 Octobre 2007, 09:20
Statut actuel: Actif et salarié | Enseignant

Re: [RESOLU] Asymptote-Un petit défi

Messagepar projetmbc » Dimanche 03 Janvier 2010, 16:32

Il ne manque plus que les gobelets... :D
projetmbc
Péta-utilisateur
 
Messages: 1897
Inscription: Samedi 29 Décembre 2007, 00:58
Statut actuel: Actif et salarié | Enseignant

Re: [RESOLU] Asymptote-Un petit défi

Messagepar GMaths » Dimanche 03 Janvier 2010, 17:29

exploitation de la méthode précédente sur un nouvel exemple :
Code: Tout sélectionner
size(5cm,0);
import graph3;

currentprojection=orthographic(
camera=(4.73228998404852,3.2090201378541,3.52563553483471),
up=(-0.00701016356306763,-0.00521599083684134,0.0145082405986303));

currentlight=light(3,-3,2);
currentlight.background=black;

path3 p1=(2,0,0)..(3,1,0)..(-1,2,0)..(-2,-3,0)..cycle,
      p2=scale3(.25)*unitcircle3,
     p4=shift(0,0,-1)*p1;

path3[] p3=shift(1.5,1.5,0)*p2
           ^^shift(-1.6,-.5,0)*p2
         ^^shift(.5,-.5,0)*p2
         ^^shift(-.5,.5,0)*p2;

draw(p1,1bp+red);
draw(p3,1bp+blue);
draw(p4,1bp+green);

draw(surface(p4,planar=true),yellow);
draw(surface(reverse(p1)^^p3,planar=true),white+opacity(.7));

limits(-1.5X-1.5Y-1.5Z,1.5X+1.5Y+1.5Z);
xaxis3("$x$",Arrow3);
yaxis3("$y$",Arrow3);
zaxis3("$z$",Arrow3);

shipout(bbox(2mm,Fill(white)));


surface_trouee.png
GMaths
Exa-utilisateur
 
Messages: 2031
Inscription: Lundi 01 Octobre 2007, 09:20
Statut actuel: Actif et salarié | Enseignant

Re: [RESOLU] Asymptote-Un petit défi

Messagepar projetmbc » Dimanche 03 Janvier 2010, 17:50

Et là te voila prêt à devenir un peintre...
projetmbc
Péta-utilisateur
 
Messages: 1897
Inscription: Samedi 29 Décembre 2007, 00:58
Statut actuel: Actif et salarié | Enseignant

Re: [RESOLU] Asymptote-Un petit défi

Messagepar OG » Dimanche 03 Janvier 2010, 21:32

Bonsoir

Pour le graphique obtenu avec une partie du "bureau", c'est un pb de driver et d'OpenGL.
Problème courant, cité dans la doc. Mon dell D630 est sous Ubuntu Karmic, carte graphique Intel intégré GM 965. Je crois qu'il y a eu des progrès par rapport à Jaunty, car chez moi cela fonctionne plutôt bien (au moins pour un fichier généré, pour plusieurs je ne sais pas), mais auparavant j'avais ce genre de problème ou encore les bandes noires, etc...

Une solution possible est l'option -GlOptions=-indirect, ou encore de jouer avec -maxviewport et -maxtile.

Pour les gobelets

Code: Tout sélectionner
size(7.5cm,0);
import graph3;

currentprojection=perspective(
                              camera=(4.73228998404852,3.2090201378541,3.52563553483471),
                              up=(-0.00701016356306763,-0.00521599083684134,0.0145082405986303),
                              target=(-0.0883563917120318,0.0755335577321059,0.0698238638158672));

path3 p1=shift(-1,-1,0)*scale3(2)*unitsquare3,
p2=scale3(.25)*unitcircle3;

path3[] p3=shift(.5,.5,0)*p2
  ^^shift(-.5,-.5,0)*p2
  ^^shift(.5,-.5,0)*p2
  ^^shift(-.5,.5,0)*p2;

draw(p1,1bp+red);
draw(p3,1bp+blue);

draw(surface(reverse(p1)^^p3,planar=true),white+opacity(.5));


limits(-1.5X-1.5Y-.5Z,1.5X+1.5Y+.5Z);

transform3 t1=rotate(90,O,Z);
transform3 t2=t1*t1;
transform3 t3=t2*t1;

surface gobelet;
gobelet.s=new patch[4];
real r=.25;
patch s=unitfrustum(.35,.25);
gobelet.s[0]=s;
gobelet.s[1]=t1*s;
gobelet.s[2]=t2*s;
gobelet.s[3]=t3*s;

gobelet=zscale3(-7)*shift(0,0,-.75)*gobelet;
surface gobelet=surface(patch(scale3(.25)*unitcircle3)...gobelet.s);
draw(shift(.5,.5,0)*gobelet,grey+opacity(.5));
draw(shift(-.5,.5,0)*gobelet,grey+opacity(.5));
draw(shift(-.5,-.5,0)*gobelet,grey+opacity(.5));
draw(shift(.5,-.5,0)*gobelet,grey+opacity(.5));
xaxis3("$x$",Arrow3);
yaxis3("$y$",Arrow3);
zaxis3("$z$",Arrow3);


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

Re: [RESOLU] Asymptote-Un petit défi

Messagepar GMaths » Dimanche 03 Janvier 2010, 21:38

OG a écrit:Pour les gobelets
:D

Il a demandé un peintre, je crois, pour la figure suivante. :lol: :lol:
GMaths
Exa-utilisateur
 
Messages: 2031
Inscription: Lundi 01 Octobre 2007, 09:20
Statut actuel: Actif et salarié | Enseignant

Suivante

Retourner vers Asymptote

 


  • Articles en relation
    Réponses
    Vus
    Dernier message

Qui est en ligne

Utilisateurs parcourant ce forum: MSN [Bot] et 2 invités