Exemples de figures

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.
MB
Administrateur
Administrateur
Messages : 7260
Inscription : samedi 28 mai 2005, 14:23
Statut actuel : Enseignant

Message par MB »

Une chose intéressante dans cette figure : la fonction format.

Code : Tout sélectionner

unitsize(1cm);
import geometry;

real a=5;
real b=7;
real c=28;
real d=7.5;

pair pO=(0,0);

path d1=pO--(d,0);
path d2=pO--(d,d*tan(c*pi/180));

pair pA=(a,0);
pair pC=(b,0);
pair pB=intersectionpoint(pA--(a,d),d2);
pair pD=intersectionpoint(pC--(b,d),d2);

draw(pA--pB^^pC--pD);
draw(d1^^d2);

perpendicular(pA,NW,blue);
perpendicular(pC,NW,blue);

draw(format("$%.0f^\circ$",c),arc(pA,pO,pB,1.2),blue);

label("$O$",pO,SW);
label("$A$",pA,S);
label("$C$",pC,S);
label("$B$",pB,N);
label("$D$",pD,N);

shipout(bbox(xmargin=2mm,invisible));
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
MB. (rejoignez pCloud afin d'obtenir 10Go de stockage en ligne gratuits)
Pas d'aide en message privé. Merci de consulter ce sujet avant de poster votre premier message.
MB
Administrateur
Administrateur
Messages : 7260
Inscription : samedi 28 mai 2005, 14:23
Statut actuel : Enseignant

Message par MB »

Nouvelle figure : pattern et boucle for.

Code : Tout sélectionner

unitsize(1cm);
import patterns;

add("crosshatch",crosshatch(2mm,red));

real n=5;

fill((0,0)--(n,0)--(n,1)--(0,1)--cycle,pattern("crosshatch"));
fill((0,n-1)--(n,n-1)--(n,n)--(0,n)--cycle,pattern("crosshatch"));
fill((0,1)--(1,1)--(1,n-1)--(0,n-1)--cycle,pattern("crosshatch"));
fill((n-1,1)--(n,1)--(n,n-1)--(n-1,n-1)--cycle,pattern("crosshatch"));

for (int i=0; i <= n; ++i)
  {
     draw((0,i)--(n,i),gray);
     draw((i,0)--(i,n),gray); 
  }

shipout(bbox(xmargin=1mm,invisible));
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
MB. (rejoignez pCloud afin d'obtenir 10Go de stockage en ligne gratuits)
Pas d'aide en message privé. Merci de consulter ce sujet avant de poster votre premier message.
MB
Administrateur
Administrateur
Messages : 7260
Inscription : samedi 28 mai 2005, 14:23
Statut actuel : Enseignant

Message par MB »

Nouvelle figure :

Code : Tout sélectionner

unitsize(1cm);
import geometry;

usepackage("mathrsfs"); 

real R1=7.5;
real R2=2.5;

pair pO=(0,0);
pair pA=(-R1,0);
pair pB=(R1,0);

dot(pO);
dot(pA);
dot(pB);

draw(pA--pB);

label("$A$",pA,W);
label("$B$",pB,E);
label("$O$",pO,SW);

pair pE=(R1-R2,0);
pair pN=(R1-2*R2,0);

dot(pE);
dot(pN);

label("$E$",pE,S);
label("$N$",pN,SW);

path C1=circle(pO,R1); 
path C2=circle(pE,R2); 

draw(Label("$\mathscr{C}_1$",Relative(.6)),C1,gray); 
draw(Label("$\mathscr{C}_2$",Relative(.6)),C2,gray);

path C3=circle(pB,4); 

pair pM=intersectionpoint(C2,C3);
pair pP=intersectionpoint(C1,pM--interp(pB,pM,5));

dot(pM);
dot(pP);

label("$M$",pM,NE+N);
label("$P$",pP,NE+N);

draw(pB--pP);
draw(pN--pM^^pA--pP);

pair pK=interp(pO,pP,-1);

dot(pK);

label("$K$",pK,SE+S);

draw(pP--pK);
draw(pA--pK^^pB--pK);

shipout(bbox(xmargin=1mm,invisible));
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
MB. (rejoignez pCloud afin d'obtenir 10Go de stockage en ligne gratuits)
Pas d'aide en message privé. Merci de consulter ce sujet avant de poster votre premier message.
MB
Administrateur
Administrateur
Messages : 7260
Inscription : samedi 28 mai 2005, 14:23
Statut actuel : Enseignant

Message par MB »

Suite à l'intégration du package markers (dû à Ph. Ivaldi d'ailleurs) dans les dernières version d'Asymptote, l'utilisation des marqueurs est bien plus simple (par rapport à cet exemple de figure par exemple). Le code est ainsi grandement simplifié.

Code : Tout sélectionner

unitsize(1cm);
import markers;
import geometry;

pair pA=(0,0);
pair pB=(3,0);
pair pC=(3,-3);
pair pD=(0,-3);
pair pE=(-4,-3);
pair pF=(0,5);
pair pG=(3+5,-3);
pair pH=(0,-3-4);

label("$A$",pA,NW);
label("$B$",pB,NE);
label("$C$",pC,SE);
label("$D$",pD,SW);
label("$E$",pE,W);
label("$F$",pF,N);
label("$G$",pG,E);
label("$H$",pH,S);

perpendicular(pA,NE,blue);
perpendicular(pC,NE,blue);
perpendicular(pD,SE,blue);
perpendicular(pD,NW,blue);

draw(pA--pB--pC--pD--cycle);

draw(pD--pE,StickIntervalMarker(1,1,size=6,angle=-45,red)); 
draw(pD--pH,StickIntervalMarker(1,1,size=6,angle=-45,red)); 
draw(pA--pE,StickIntervalMarker(1,2,size=6,angle=-45,red));
draw(pA--pF,StickIntervalMarker(1,2,size=6,angle=-45,red)); 
draw(pC--pH,StickIntervalMarker(1,2,size=6,angle=-45,red));
draw(pC--pG,StickIntervalMarker(1,2,size=6,angle=-45,red)); 
draw(pB--pF,StickIntervalMarker(1,3,size=6,angle=-45,red)); 
draw(pB--pG,StickIntervalMarker(1,3,size=6,angle=-45,red)); 

shipout(bbox(xmargin=1mm,invisible));
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
MB. (rejoignez pCloud afin d'obtenir 10Go de stockage en ligne gratuits)
Pas d'aide en message privé. Merci de consulter ce sujet avant de poster votre premier message.
Nico
Utilisateur éprouvé
Utilisateur éprouvé
Messages : 616
Inscription : vendredi 24 juin 2005, 11:10
Localisation : Narbonne

Message par Nico »

Pas mal du tout....
Les label avec N, S, E, W, c'est bien trouvé....
Nico
Tarz at benec, kervorn denn Poulawenn!
Pas d'aide par MP.
rebouxo
Modérateur général
Modérateur général
Messages : 6962
Inscription : mercredi 15 février 2006, 13:18
Localisation : le havre

Message par rebouxo »

Il n'y a pas la possibilité de passer des options à plusieurs commandes ?
L'équivalent de \psset ?

Olivier
MB
Administrateur
Administrateur
Messages : 7260
Inscription : samedi 28 mai 2005, 14:23
Statut actuel : Enseignant

Message par MB »

rebouxo a écrit :Il n'y a pas la possibilité de passer des options à plusieurs commandes ?
L'équivalent de \psset ?
Si, ça doit être possible.
MB. (rejoignez pCloud afin d'obtenir 10Go de stockage en ligne gratuits)
Pas d'aide en message privé. Merci de consulter ce sujet avant de poster votre premier message.
OG
Modérateur
Modérateur
Messages : 2293
Inscription : lundi 12 mars 2007, 11:20
Localisation : Rouen

Message par OG »

Bonjour

il y a peut-être d'autres solutions, on peut au moins faire cela

Code : Tout sélectionner

marker mark1=StickIntervalMarker(1,1,size=6,angle=-45,red);
marker mark2=StickIntervalMarker(1,2,size=6,angle=-45,red);
marker mark3=StickIntervalMarker(1,3,size=6,angle=-45,red);
draw(pD--pE,mark1);
draw(pD--pH,mark1);
draw(pA--pE,mark2);
draw(pA--pF,mark2);
draw(pC--pH,mark2);
draw(pC--pG,mark2);
draw(pB--pF,mark3);
draw(pB--pG,mark3);
Cordialement
O.G.
MB
Administrateur
Administrateur
Messages : 7260
Inscription : samedi 28 mai 2005, 14:23
Statut actuel : Enseignant

Message par MB »

Merci OG, c'est parfait non ? (pas besoin de chercher à faire autrement je pense) :D
MB. (rejoignez pCloud afin d'obtenir 10Go de stockage en ligne gratuits)
Pas d'aide en message privé. Merci de consulter ce sujet avant de poster votre premier message.
rebouxo
Modérateur général
Modérateur général
Messages : 6962
Inscription : mercredi 15 février 2006, 13:18
Localisation : le havre

Message par rebouxo »

Je vais finir par être conquis.

Olivier
MB
Administrateur
Administrateur
Messages : 7260
Inscription : samedi 28 mai 2005, 14:23
Statut actuel : Enseignant

Message par MB »

Nouvelle figure :

Code : Tout sélectionner

unitsize(0.75cm);
import markers; 

int xmax=7;
int xmin=-5;
int ymax=7;
int ymin=-4;

for (int i=1; i <= xmax; ++i)
  {
     draw((i,ymin)--(i,ymax),mediumgray);
  }
  
for (int i=xmin; i <= -1; ++i)
  {
     draw((i,ymin)--(i,ymax),mediumgray);
  }  

for (int j=1; j <= ymax; ++j)
  {
     draw((xmin,j)--(xmax,j),mediumgray);
  }
  
for (int j=ymin; j <= -1; ++j)
  {
     draw((xmin,j)--(xmax,j),mediumgray);
  }

draw((xmin,0)--(xmax,0),black,Arrow);
draw((0,ymin)--(0,ymax),black,Arrow);

dot(Label("$O$",align=SW),(0,0));
dot(Label("$I$",align=SE),(2,0));
dot(Label("$J$",align=NW),(0,2));

pair pA=(1,2)*2;
pair pB=(2.5,1)*2;
pair pC=(1.5,-1.5)*2;
pair pD=(0,-0.5)*2;
pair pE=(-1.5,1.5)*2;
pair pF=(-2,-1)*2;
pair pG=(-0.5,3)*2;
pair pH=(3,-1)*2;
pair pM=(-0.5,0.5)*2;

dot(Label("$A$",align=NE),pA);
dot(Label("$B$",align=NE),pB);
dot(Label("$C$",align=SE),pC);
dot(Label("$D$",align=SW),pD);
dot(Label("$E$",align=NW),pE);
dot(Label("$F$",align=SW),pF);
dot(Label("$G$",align=NW),pG);
dot(Label("$H$",align=SE),pH);
dot(Label("$M$",align=NW),pM);

draw(pA--pC,StickIntervalMarker(2,1,size=6,angle=-45,red));
draw(pD--pB,StickIntervalMarker(2,1,size=6,angle=-45,red));
draw(pE--pF,StickIntervalMarker(1,2,size=6,angle=-45,red));
draw(pE--pA,StickIntervalMarker(1,2,size=6,angle=-45,red));
draw(pA--pF,StickIntervalMarker(2,3,size=6,angle=-45,red));
draw(pA--pB--pC--pD--cycle);

shipout(bbox(xmargin=1mm,invisible));
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
MB. (rejoignez pCloud afin d'obtenir 10Go de stockage en ligne gratuits)
Pas d'aide en message privé. Merci de consulter ce sujet avant de poster votre premier message.
MB
Administrateur
Administrateur
Messages : 7260
Inscription : samedi 28 mai 2005, 14:23
Statut actuel : Enseignant

Message par MB »

Un cône :

Code : Tout sélectionner

unitsize(1cm);
import solids;
import math;

currentprojection=orthographic(0,100,25);

real r=4, h=7, hprime=4, rprime=r*hprime/h;

triple pO=(0,0,0);
triple pOprime=(0,0,3);
triple pS=(0,0,h);

triple pA=(r,0,0);
triple pAprime=(rprime,0,h-hprime);

revolution rC=cone(pO,r,h,Z);
revolution rCprime=cone(pOprime,rprime,hprime,Z);

label("$S$",pS,N); 
dot(Label("$O$",align=SE),pO);
dot(Label("$O'$",align=SE),pOprime);
dot(Label("$A$",align=W),pA);
dot(Label("$A'$",align=W),pAprime);

rC.draw();
rCprime.draw();

draw(pS--pO^^pO--pA^^pOprime--pAprime,dashed);

shipout(bbox(xmargin=1mm,invisible));
Par ailleurs, quelqu'un saurait comment hachurer (avec un fill et un pattern par exemple) la section de centre $O'$ assez simplement ?
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
MB. (rejoignez pCloud afin d'obtenir 10Go de stockage en ligne gratuits)
Pas d'aide en message privé. Merci de consulter ce sujet avant de poster votre premier message.
OG
Modérateur
Modérateur
Messages : 2293
Inscription : lundi 12 mars 2007, 11:20
Localisation : Rouen

Message par OG »

Bonjour

Jolies figures et merci pour tes commentaires sur mathematex et f.c.t.t.
As-tu regardé sur le site d'asymptote

http://asymptote.sourceforge.net/gallery/workcone.asy

et son pdf ?

Cordialement
O.G.
MB
Administrateur
Administrateur
Messages : 7260
Inscription : samedi 28 mai 2005, 14:23
Statut actuel : Enseignant

Message par MB »

OG a écrit :merci pour tes commentaires sur mathematex et f.c.t.t.
C'est normal.
OG a écrit : As-tu regardé sur le site d'asymptote

http://asymptote.sourceforge.net/gallery/workcone.asy

et son pdf ?
Oui, je viens de regarder, mais ça ne me donne pas la réponse à ma question. Il n'y a pas de remplissage d'une section de cône en fait.
On peut tracer un cercle et le remplir, mais je n'arrive pas à faire apparaitre les pointillés pour la section cachée.
MB. (rejoignez pCloud afin d'obtenir 10Go de stockage en ligne gratuits)
Pas d'aide en message privé. Merci de consulter ce sujet avant de poster votre premier message.
MB
Administrateur
Administrateur
Messages : 7260
Inscription : samedi 28 mai 2005, 14:23
Statut actuel : Enseignant

Message par MB »

J'ai trouvé une méthode permettant de hachurer cette fameuse section.
De plus, je n'utilise plus 2 cône pour tracer le contour de la section mais j'utilise la fonction transverse et un skeleton (ce qui me permet d'obtenir les pointillés alors qu'avec un simple cercle ça ne fonctionnait pas). J'utilise par contre un cercle et un simple fill (non draw) pour hachurer la section.

Code : Tout sélectionner

unitsize(1cm);
import solids;
import math;
import patterns;

add("crosshatch",crosshatch(2mm,red));

currentprojection=orthographic(0,100,25);

real r=4, h=7, hprime=4, rprime=r*hprime/h;

triple pO=(0,0,0);
triple pOprime=(0,0,3);
triple pS=(0,0,h);

triple pA=(r,0,0);
triple pAprime=(rprime,0,h-hprime);

revolution rC=cone(pO,r,h,Z);

skeleton s;
rC.transverse(s,reltime(rC.g,1-hprime/h));
rC.longitudinal(s);
draw(s.back,dashed);
draw(s.front);

fill(circle(pOprime,rprime),pattern("crosshatch"));

rC.draw();

label("$S$",pS,N); 
dot(Label("$O$",align=SE),pO);
dot(Label("$O'$",align=SE),pOprime);
dot(Label("$A$",align=W),pA);
dot(Label("$A'$",align=W),pAprime);

draw(pS--pO^^pO--pA^^pOprime--pAprime,dashed);

shipout(bbox(xmargin=1mm,invisible));
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
MB. (rejoignez pCloud afin d'obtenir 10Go de stockage en ligne gratuits)
Pas d'aide en message privé. Merci de consulter ce sujet avant de poster votre premier message.
rebouxo
Modérateur général
Modérateur général
Messages : 6962
Inscription : mercredi 15 février 2006, 13:18
Localisation : le havre

Message par rebouxo »

B'soir.

J'ai passé ma journée sur la doc pourrie d'Asymptote. Manque d'exemple dans la doc et manque de commentaire dans les exemples. :x

Bon, voici mon code

Code : Tout sélectionner

import solids;

unitsize(1cm);

currentprojection=orthographic(0,100,25);

real r=2, R=2.5, h=0.5, H=1;

triple CB=(0,0,0);
triple CM=(0,0,H);
triple CH=(0,0,H+h);

revolution C=cylinder(CB,R,H,Z);
revolution c=cylinder(CM,r,h,Z);

C.filldraw(white,solid);
filldraw(circle(CM,R),white,black);
c.filldraw(white,solid,false);
filldraw(circle(CH,r),white,black);

triple D=(r,0,h+H);
triple G=(-r,0,h+H);

triple d=(r,0,h+H+1);
triple g=(-r,0,h+H+1);

draw(d--D);
draw(g--G);
draw(d--g,Arrows,Label("$d$",N));

shipout(bbox(xmargin=1mm,invisible));
Et voici l'image que j'ai.

Or je voudrais, un label entre au dessus des flèches, et que les parties latérales des cylindres soient blanches et non transparent.

Savez-vous comment faire ?

Olivier
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
MB
Administrateur
Administrateur
Messages : 7260
Inscription : samedi 28 mai 2005, 14:23
Statut actuel : Enseignant

Message par MB »

Pour le label déjà :

Tu peux remplacer :

Code : Tout sélectionner

draw(d--g,Arrows,Label("$d$",N));
par :

Code : Tout sélectionner

draw("$d$",d--g,N,Arrows);
Sinon, c'est vrai que la documentation est un peu creuse.
J'ai pas encore bien compris l'usage du Label.
MB. (rejoignez pCloud afin d'obtenir 10Go de stockage en ligne gratuits)
Pas d'aide en message privé. Merci de consulter ce sujet avant de poster votre premier message.
rebouxo
Modérateur général
Modérateur général
Messages : 6962
Inscription : mercredi 15 février 2006, 13:18
Localisation : le havre

Message par rebouxo »

Merci MB.

Et pour le côté plein du cylindre, as-tu une idée ?


Olivier
MB
Administrateur
Administrateur
Messages : 7260
Inscription : samedi 28 mai 2005, 14:23
Statut actuel : Enseignant

Message par MB »

rebouxo a écrit :Et pour le côté plein du cylindre, as-tu une idée ?
Pour ça j'ai moins bien compris ce que tu souhaites faire.
De plus, les fill de solides sont un peu pénibles à maitriser au niveau des couleurs à cause des effets de lumière (qui me semblent imposés).

Je te propose le code suivant qui donne un résultat proche de celui que tu souhaitais (d'après ce que j'ai compris). Il n'y a pas de fill dans les cylindres en fait et j'utilise aussi un disque blanc au dessus pour cacher les parties non visibles.

Il reste encore deux petites parties qui ne sont pas cachées du fait que je ne fill pas la surface latérale du cylindre (à cause de ces problèmes de lumière). Je vais continuer à regarder, mais tu peux déjà me dire si c'est bien ce que tu veux.

Code : Tout sélectionner

import solids;
unitsize(1cm);

currentprojection=orthographic(0,100,25);

real r=2, R=2.5, h=0.5, H=1;

triple CB=(0,0,0);
triple CM=(0,0,H);
triple CH=(0,0,H+h);

revolution C=cylinder(CB,R,H,Z);
revolution c=cylinder(CM,r,h,Z);

C.draw(backpen=white);
c.draw(backpen=white);
filldraw(circle(CH,r),white,black);

triple D=(r,0,h+H);
triple G=(-r,0,h+H);

triple d=(r,0,h+H+1);
triple g=(-r,0,h+H+1);

draw(d--D,dotted);
draw(g--G,dotted);
draw("$d$",d--g,N,Arrows);

shipout(bbox(xmargin=1mm,invisible));
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
MB. (rejoignez pCloud afin d'obtenir 10Go de stockage en ligne gratuits)
Pas d'aide en message privé. Merci de consulter ce sujet avant de poster votre premier message.
rebouxo
Modérateur général
Modérateur général
Messages : 6962
Inscription : mercredi 15 février 2006, 13:18
Localisation : le havre

Message par rebouxo »

Nickel. Je me suis bien exprimé alors :D .
Il y a juste un tout p'tit truc qui me chiffonne, on voit le cylindre du dessous, en bas du cylindre du haut (heu, là c'est pas clair).
Olivier