Un petit défi

Tout ce qui concerne le langage Asymptote. Ce langage est supporté sur le forum via les balises asy.

Modérateur : gdm_asy

Règles du forum
Merci de soigner la rédaction de vos messages et de consulter ce sujet avant de poster. Pensez également à utiliser la fonction recherche du forum.
projetmbc
Utilisateur chevronné
Utilisateur chevronné
Messages : 1903
Inscription : samedi 29 décembre 2007, 00:58

[Résolu] Un petit défi

Message par projetmbc »

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.

[attachment=0]troisPlans.png[/attachment]


Toute info. est la bienvenue.
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
Dernière modification par projetmbc le dimanche 03 janvier 2010, 13:55, modifié 1 fois.

GMaths
Utilisateur chevronné
Utilisateur chevronné
Messages : 2031
Inscription : lundi 01 octobre 2007, 10:20

Re: Asymptote-Un petit défi

Message par GMaths »

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
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. ;-)
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.

projetmbc
Utilisateur chevronné
Utilisateur chevronné
Messages : 1903
Inscription : samedi 29 décembre 2007, 00:58

Re: Asymptote-Un petit défi

Message par projetmbc »

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
Utilisateur chevronné
Utilisateur chevronné
Messages : 1903
Inscription : samedi 29 décembre 2007, 00:58

Re: Asymptote-Un petit défi

Message par projetmbc »

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
Utilisateur chevronné
Utilisateur chevronné
Messages : 1903
Inscription : samedi 29 décembre 2007, 00:58

Re: Asymptote-Un petit défi

Message par projetmbc »

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)));

GMaths
Utilisateur chevronné
Utilisateur chevronné
Messages : 2031
Inscription : lundi 01 octobre 2007, 10:20

Re: Asymptote-Un petit défi

Message par GMaths »

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
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)
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
Dernière modification par GMaths le dimanche 03 janvier 2010, 12:04, modifié 2 fois.

GMaths
Utilisateur chevronné
Utilisateur chevronné
Messages : 2031
Inscription : lundi 01 octobre 2007, 10:20

Re: Asymptote-Un petit défi

Message par GMaths »

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)

projetmbc
Utilisateur chevronné
Utilisateur chevronné
Messages : 1903
Inscription : samedi 29 décembre 2007, 00:58

Re: Asymptote-Un petit défi

Message par projetmbc »

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...

GMaths
Utilisateur chevronné
Utilisateur chevronné
Messages : 2031
Inscription : lundi 01 octobre 2007, 10:20

Re: Asymptote-Un petit défi

Message par GMaths »

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 ?

projetmbc
Utilisateur chevronné
Utilisateur chevronné
Messages : 1903
Inscription : samedi 29 décembre 2007, 00:58

Re: Asymptote-Un petit défi

Message par projetmbc »

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 :
[attachment=1]planeWithHoles.png[/attachment]

Sinon j'ai pu faire le dessin suivant à partir de ton code :
[attachment=0]planeOfAndWithHoles.png[/attachment]

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 ?
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.

projetmbc
Utilisateur chevronné
Utilisateur chevronné
Messages : 1903
Inscription : samedi 29 décembre 2007, 00:58

Re: Asymptote-Un petit défi

Message par projetmbc »

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...

GMaths
Utilisateur chevronné
Utilisateur chevronné
Messages : 2031
Inscription : lundi 01 octobre 2007, 10:20

Re: Asymptote-Un petit défi

Message par GMaths »

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
2010-01-03_140901.png



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
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.

OG
Modérateur
Modérateur
Messages : 2293
Inscription : lundi 12 mars 2007, 11:20
Localisation : Rouen

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

Message par OG »

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.

projetmbc
Utilisateur chevronné
Utilisateur chevronné
Messages : 1903
Inscription : samedi 29 décembre 2007, 00:58

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

Message par projetmbc »

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...

GMaths
Utilisateur chevronné
Utilisateur chevronné
Messages : 2031
Inscription : lundi 01 octobre 2007, 10:20

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

Message par GMaths »

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
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.

projetmbc
Utilisateur chevronné
Utilisateur chevronné
Messages : 1903
Inscription : samedi 29 décembre 2007, 00:58

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

Message par projetmbc »

Il ne manque plus que les gobelets... :D

GMaths
Utilisateur chevronné
Utilisateur chevronné
Messages : 2031
Inscription : lundi 01 octobre 2007, 10:20

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

Message par GMaths »

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
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.

projetmbc
Utilisateur chevronné
Utilisateur chevronné
Messages : 1903
Inscription : samedi 29 décembre 2007, 00:58

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

Message par projetmbc »

Et là te voila prêt à devenir un peintre...

OG
Modérateur
Modérateur
Messages : 2293
Inscription : lundi 12 mars 2007, 11:20
Localisation : Rouen

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

Message par OG »

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.
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.

GMaths
Utilisateur chevronné
Utilisateur chevronné
Messages : 2031
Inscription : lundi 01 octobre 2007, 10:20

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

Message par GMaths »

OG a écrit :Pour les gobelets
:D

Il a demandé un peintre, je crois, pour la figure suivante. :lol: :lol: