Figure à base de cylindre

Tout ce qui concerne le langage Asymptote. Ce langage est utilisable sur le forum via les balises asy.
[participation réservée aux utilisateurs inscrits]
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 : 8058
Inscription : samedi 28 mai 2005, 14:23
Statut actuel : Enseignant
Contact :

Figure à base de cylindre

Message non lu par MB »

Je souhaite réaliser la figure suivante avec Asymptote (mais pour l'instant j'ai du mal à utiliser la fonction cylinder).
figure_cylindre.jpg
MB. (rejoignez pCloud et bénéficiez de 10Go de stockage en ligne gratuits)
Pas d'aide en message privé. Merci de consulter ce sujet avant de poster votre premier message.
P.Fradin

Message non lu par P.Fradin »

Salut MB,

Je sais que tu cherches à le faire avec Asymptote, mais est-ce que la version TeXgraph t'interesse?
MB
Administrateur
Administrateur
Messages : 8058
Inscription : samedi 28 mai 2005, 14:23
Statut actuel : Enseignant
Contact :

Message non lu par MB »

P.Fradin a écrit :Je sais que tu cherches à le faire avec Asymptote, mais est-ce que la version TeXgraph t'interesse?
Ca m'intéresse toujours ! :D
(de même que la version geoPyX d'ailleurs).

En passant, geoPyX fait vraiment de belles choses (comme ça par exemple).
MB. (rejoignez pCloud et bénéficiez de 10Go de stockage en ligne gratuits)
Pas d'aide en message privé. Merci de consulter ce sujet avant de poster votre premier message.
P.Fradin

Message non lu par P.Fradin »

Re,

Pour une version TeXgraph, le code (toujours dans un élément graphique utilisateur):

Code : Tout sélectionner

[ $R:=4, $h:=1.25, $O:=Origin+h*vecK, $O':=Origin-h*vecK,  
 HideStyle:=dashed, Width:=6, NbPoints:=75, DotStyle:=bigdot,
 Dcylindre(O', 2*h*vecK, R, 0),
 $A:=[R*exp(-i*pi/6), h],  $B:=[R*exp(i*pi/2),h], $C:=B-2*h*vecK,  
 $D:=A-2*h*vecK, $F:=[R*exp(i*pi/6),h], $E:=(O+F)/2,
 Ligne( Proj3D( [A, B, O, A, D, jump, O, F]), 0),
 FillStyle:=full, FillColor:=black, 
 Ligne( [Get(angleD(Proj3D(B), Proj3D(E), Proj3D(O), 0.3)), Proj3D(E)],1),
 FillStyle:=none,  
 markseg(Proj3D(O), Proj3D(E), 2,0.1,0.3), markseg(Proj3D(E), Proj3D(F), 2,0.1,0.3),
LineStyle:= dashed,
 Ligne( Proj3D( [ D, C, O',D, jump, C, B, jump, O, O']), 0),
 LabelDot(Proj3D(O),"$O$","N",1), LabelDot(Proj3D(O'),"$O'$","NE",1),
 LabelDot(Proj3D(A),"$A$","NO",1), LabelDot(Proj3D(B),"$B$","N",1),  
 LabelDot(Proj3D(C),"$C$","S",1), LabelDot(Proj3D(D),"$D$","NO",1),
 LabelDot(Proj3D(F),"$F$","NE",1), LabelDot(Proj3D(E),"$E$","S",1) ]
Il s'agit d'une figure dans l'espace, c'est à dire qu'on peut la faire pivoter dans le logiciel.
Pièces jointes
cylindre.png
(23.03 Kio) Téléchargé 947 fois
MB
Administrateur
Administrateur
Messages : 8058
Inscription : samedi 28 mai 2005, 14:23
Statut actuel : Enseignant
Contact :

Message non lu par MB »

Merci, la production est parfaite en effet. :D
MB. (rejoignez pCloud et bénéficiez de 10Go de stockage en ligne gratuits)
Pas d'aide en message privé. Merci de consulter ce sujet avant de poster votre premier message.
kib2

Message non lu par kib2 »

Salut les fêlés du dessin :wink:

...et excusez-moi, j'ai râté la discussion. Comme geoPyX ne gêre pas la 3d, je peux le faire en 2d à coups d'ellipses et de quadrilatères, mais ce ne serait que de la triche, et je préfère attendre que tout cela soit implémenté plus tard.

En tout cas, chapeau à Patrick pour la version TeXgraph, c'est magnifique ! Tiens, pendant que j'y suis Patrick : quelles-ont été tes lectures pour la gestion de la 3d ?

Pour l'exemple des cocottes en papier, c'est vraiment très simple. La transparence y joue beaucoup, mais il y a un bug dans PyX que les auteurs doivent régler avant que ce ne soit totalement au point (on ne peut pas tracer le contour des objects autrement qu'en mode transparent, pas très gênant mais quand même un peu pour moi).
P.Fradin

Message non lu par P.Fradin »

kib2 a écrit :Salut les fêlés du dessin
Salut, entre fêlés on se dit toujours salut!
Tiens, pendant que j'y suis Patrick : quelles-ont été tes lectures pour la gestion de la 3d ?
Rien de particulier, quelques trucs sur le net, comme l'algorithme du peintre. En fait TeXgraph ne sait pas faire grand-chose en 3D, il a seulement deux commandes: Surface (comme son nom l'indique) et Proj3D (qui calcule les projetés d'une liste de points de l'espace sur l'écran). Tout le reste (Axes3D, gestion des polyèdres avec arêtes cachées ...) ce sont des macros écrites dans le langage de TeXgraph et chargées au démarrage. Mais il n'y a pas de gestion d'ensemble des parties cachées de la scène comme avec OpenGL. Quant aux point de l'espace ils ne necéssitent pas de type particulier dans le logiciel car TeXgraph ne connait qu'un seul type: les listes de complexes, donc un point de l'espace de coordonnées (x,y,z) c'est: [x+i*y, z], de même le logiciel sait ajouter des listes, les multiplier par un nombre etc...
mais il y a un bug dans PyX que les auteurs doivent régler avant que ce ne soit totalement au point (on ne peut pas tracer le contour des objects autrement qu'en mode transparent, pas très gênant mais quand même un peu pour moi).
En parlant de geoPyX, peux-tu (peut-être en privé) me dire ce que je dois faire du fichier source que tu as donné sur un autre fil pour l'essayer? j'aurais également quelques questions sur Python (que je ne connais pas), est-il raisonnable d'écrire une interface graphique comme TeXgraph en Python, car c'est un langage interprêté non?
Ph. Ivaldi

Re: [Asymptote] Figure à base de cylindre

Message non lu par Ph. Ivaldi »

MB a écrit :Je souhaite réaliser la figure suivante avec Asymptote (mais pour l'instant j'ai du mal à utiliser la fonction cylinder).
Salut,

Je ne vois pas de problème particulier avec cette fonction...
Le plus pénible est de créer un fonction qui trace un angle droit dans l'espace:

Code : Tout sélectionner

//Draw right angle (OA,OB) in 3D
void drawrightangle(picture pic=currentpicture,
                    triple Oo, triple A, triple B,
                    real radius,
                    pen p=currentpen,
                    pen fillpen=nullpen,
                    projection P=currentprojection)
{
  p=linejoin(0)+linecap(0)+p;
  transform3 T=shift(-Oo);
  triple OA=radius/sqrt(2)*unit(T*A),
    OB=radius/sqrt(2)*unit(T*B),
    OC=OA+OB;
  path3 _p=shift(Oo)*(O--OA--OC--OB--cycle3);
  if (fillpen==nullpen)
    draw(pic, _p, p=p);
  else filldraw(pic, _p, fillpen=fillpen, drawpen=p);
}
Ensuite c'est simple, il suffit de placer les points avec leurs coordonnées à trois dimensions; en utilisant quelques transformations de l'espace ça simplifie la tache...

Code : Tout sélectionner

real r=1, h=.75;
real gle=60;
real gleA=20;
transform3 tR=rotate(gle,Z);
transform3 tT=shift((0,0,-h));

triple H=(0,0,h),//the label is O in the picture.
  A=rotate(gleA,Z)*(0,r,h),
  F=tR*A,
  B=tR*F,
  D=tT*A,
  C=tT*B,
  E=intersectionpoint(H--F,A--B);

revolution r=cylinder(O,r,h,Z);
// r.fill(white);
r.draw();

draw(O--H, dashed);
draw(H--B--F--A--cycle3^^H--F^^A--B^^A--D);
draw(O--D--C--cycle3^^O--H^^B--C, dashed);

drawrightangle(E,H,B,.1,fillpen=black);

dot(Label("$A$",align=NW), A);
dot(Label("$B$",align=N),B);
dot(Label("$C$",align=S), C);
dot(Label("$D$",align=NW), D);
dot(Label("$E$",align=S), E);
dot(Label("$F$",align=S), F);
dot(Label("$O$",align=N), H);
dot(Label("$O'$",align=NE+E), O);

shipout(bbox(xmargin=10mm,invisible));
Résultat et code complet ici:
http://home.tele2.fr/phivaldi/asymptote ... index.html

Je vous laisse le soin d'utiliser les macros pour les marques de segments :P .
P.Fradin

Re: [Asymptote] Figure à base de cylindre

Message non lu par P.Fradin »

Ph. Ivaldi a écrit : Le plus pénible est de créer un fonction qui trace un angle droit dans l'espace
Bonjour,

J'ai vu dans ton code que tu utilises la projection orthographique (c'est le cas de TeXgraph aussi), auquel cas tu peux très bien dessiner ton angle droit dans le plan de projection en raisonnant non plus sur les points de l'espace mais sur les projétés. Cette projection étant affine, elle conserve le parallèlisme. Cette même propriété permet aussi de tracer une courbe de Bézier de l'espace en disposant seulement d'une fonction Bézier dans le plan.

Amicalement
Ph. Ivaldi

Re: [Asymptote] Figure à base de cylindre

Message non lu par Ph. Ivaldi »

P.Fradin a écrit :J'ai vu dans ton code que tu utilises la projection orthographique (c'est le cas de TeXgraph aussi), auquel cas tu peux très bien dessiner ton angle droit dans le plan de projection en raisonnant non plus sur les points de l'espace mais sur les projétés. Cette projection étant affine, elle conserve le parallèlisme. Cette même propriété permet aussi de tracer une courbe de Bézier de l'espace en disposant seulement d'une fonction Bézier dans le plan.
C'est vrai mais, à faire une macro, autant qu'elle fonctionne quelque soit le type de projection disponible sous Asymptote:
perspective, oblique, obliqueX, obliqueY ou orthographic.

Votre logiciel TeXGraph semble vraiment intéressant, je vais l'essayer prochainement bien que mon choix soit fixé sur Asymptote.
Amicalement
De même.
rebouxo
Modérateur honoraire
Modérateur honoraire
Messages : 6962
Inscription : mercredi 15 février 2006, 13:18
Localisation : le havre
Contact :

Message non lu par rebouxo »

Je vais peut-être posé une question stupide, mais pourquoi ne pas placer la marque de l'angle droit dans le plan défini par les deux droites perpendiculaires et laisser à la macro de projection le soin de projeter le tout...

Ainsi, la macro rightmark fonctionnerais tout le temps, non ?

Pouvez-vous expliquer ce qui se cache derrière les noms de vos différentes projections ; perspective, oblique, obliqueX, obliqueY, orthographic ? Et leurs rapports éventuels avec les perspectives cavalière, isométrique,...

Je dois dire que mes connaissances là dessus sont assez parcellaires,...

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

Re: [Asymptote] Figure à base de cylindre

Message non lu par MB »

Ph. Ivaldi a écrit :
MB a écrit :Je souhaite réaliser la figure suivante avec Asymptote (mais pour l'instant j'ai du mal à utiliser la fonction cylinder).
Salut,

Je ne vois pas de problème particulier avec cette fonction...
Bonjour, le problème que j'avais était que le cylindre apparaissait toujours déformé.
Par exemple, avec le code suivant :

Code : Tout sélectionner

unitsize(1cm);
import solids;

real r=4, h=2.5;

revolution r=cylinder(O,r,h,Z);
r.draw();
J'obtenais la figure ci-jointe.

Je vois maintenant qu'il faut utiliser en premier :

Code : Tout sélectionner

currentprojection=orthographic(-50,100,40);
Pièces jointes
Figure2_bad.png
(64.34 Kio) Téléchargé 816 fois
MB. (rejoignez pCloud et bénéficiez de 10Go de stockage en ligne gratuits)
Pas d'aide en message privé. Merci de consulter ce sujet avant de poster votre premier message.
P.Fradin

Re: [Asymptote] Figure à base de cylindre

Message non lu par P.Fradin »

Ph. Ivaldi a écrit : C'est vrai mais, à faire une macro, autant qu'elle fonctionne quelque soit le type de projection disponible sous Asymptote:
perspective, oblique, obliqueX, obliqueY ou orthographic.
Je comprends mieux maintenant. Sous TeXgraph il n'y a que la projection orthographique par défaut (mais on peut évidemment programmer les autres).
Votre logiciel TeXGraph semble vraiment intéressant, je vais l'essayer prochainement bien que mon choix soit fixé sur Asymptote.
De même.
Merci du compliment, je dois dire que moi aussi je suis d'assez près ce que peuvent les autres outils comme Asymptote ou geoPyX, ou les macros de pstricks-add etc... Condition indispensable pour faire progresser ses propres outils! Pour le moment je constate que le langage de programmation est plus complet dans Asymptote que dans TeXgraph mais peut-être un peu plus "lourd".
Ph. Ivaldi

Message non lu par Ph. Ivaldi »

rebouxo a écrit :Je vais peut-être posé une question stupide, mais pourquoi ne pas placer la marque de l'angle droit dans le plan défini par les deux droites perpendiculaires et laisser à la macro de projection le soin de projeter le tout...

Ainsi, la macro rightmark fonctionnerais tout le temps, non ?
Ce n'est pas du tout stupide mais dans le cas présent c'est un peu plus compliqué.
Un marque d'angle n'est pas un chemin (une courbe), c'est une image.
En effet, avec Asymptote on peut spécifier la taille finale de l'image.
Si par exemple je place un "size(10cm,0);" dans le code (au début pour plus de lisibilité) alors:

Code : Tout sélectionner

size(10cm,0);
draw((0,0),(1,0));
ou

Code : Tout sélectionner

size(10cm,0);
draw((0,0),(1000,0));
me donnera toujours un segment de 10cm de long et

Code : Tout sélectionner

size(10cm,0);
draw((0,0),(1,0));
draw((0,0),(2,-.1));


donnera un segment de 5cm et un segment de 10cm.
Comment, dans ces conditions savoir quelle taille donner à la marque?
Simplement en traçant la marque dans une autre image avec une mesure absolue, puis en ajoutant cette image au bon endroit:

Code : Tout sélectionner

size(10cm,0);

draw((0,0)--(1,0));

picture pic;
draw(pic, (0,0)--(1cm,0));
add(pic,(0,-.1));
produira un segment horizontal de 10cm et, 1cm plus bas, un segment de 1cm.
S'il me vient l'envie de sortir la figure en 15cm de large, le segment du bas (maintenant 1.5cm plus bas) fera toujours 1cm de long.

En disant ça je me rends compte que la façon dont j'ai coder la fonction pour marquer l'angle dans l'espace n'est pas propre, puisque la taille de ma marque dépend de l'échelle utilisée.
Je vais la modifier prochainement...

Dans le plan les marques que j'ai définies ici
[url]file:///home/pi/www/phivaldi/asymptote/geometrie/index.html[/url] figure : fig1055.asy
sont, elles, indépendantes de la taille de sortie (ce qui est souhaité par les développeurs d'Asymptote).

Reste à voir si l'on peut appliquer les transformations de l'espace à un image du plan XY...
Si quelqu'un à le code Asymptote pour balancer les marques du plan dans l'espace, je suis preneur!

Peut être (???) avec la commande:

Code : Tout sélectionner

triple invert(pair z, triple normal, triple point,
              projection P=currentprojection);
qui permet de récupérer les coordonnées spatiale d'un point Z de la page comme s'il était dans le plan de vecteur normal "normal" et passant par le point "point".
rebouxo a écrit :Pouvez-vous expliquer ce qui se cache derrière les noms de vos différentes projections ; perspective, oblique, obliqueX, obliqueY, orthographic ? Et leurs rapports éventuels avec les perspectives cavalière, isométrique,...

Je dois dire que mes connaissances là dessus sont assez parcellaires,...
Ben comme ça on est au moins deux...
C'est l'occasion pour moi aussi de tirer ça au clair.
Voici ce que j'ai compris grâce à cette page:
http://rvirtual.free.fr/programmation/O ... /c1106.htm

8<------8<------8<------8<------8<------8<------8<------8<------

,----[les fonctions d'asymptotes
| orthographic(triple camera, triple up=Z)
| orthographic(real x, real y, real z, triple up=Z)
| This projects three dimensions onto two using the view seen at the
| location camera or (x,y,z), respectively, orienting the camera so
| that, if possible, the vector up points upwards. Parallel lines are
| projected to parallel lines.
`----

Dans cette projection les droites de projection sont parallèles entre elles.
Elle est dites:
* ORTHOGONALE:
quand la direction de projection est orthogonale au plan de
projection lui même parallèle à un des axes du repère;

* DIMÉTRIQUE ou ISOMÉTRIQUE:
quand le plan de projection n'est parallèle à aucun des plans X=0 ou
Y=0 ou Z=0.
. Si seulement deux vecteurs unitaires du repère sont de même longueur
après projection, elle est dite dimétrique;
. Si les trois V.U. ont la même longueur après projection elle est
dite isométrique.

8<------8<------8<------8<------8<------8<------8<------8<------

,----[les fonctions d'asymptotes
| oblique
|
| oblique(real angle) The point (x,y,z) is projected to
| (x-0.5z,y-0.5z). If an optional real argument is given, the negative
| z axis is drawn at this angle in degrees. The projection obliqueZ is
| a synonym for oblique.
|
| oblique
|
| obliqueX(real angle) The point (x,y,z) is projected to
| (y-0.5x,z-0.5x). If an optional real argument is given, the negative
| x axis is drawn at this angle in degrees.
|
| obliqueY
|
| obliqueY(real angle)
| The point (x,y,z) is projected to (x+0.5y,z+0.5y). If an optional
| real argument is given, the positive y axis is drawn at this angle
| in degrees.
`----

8<------8<------8<------8<------8<------8<------8<------8<------

Dans ces projections dites OBLIQUES:
le plan de projection est perpendiculaire, non plus à la direction de
projection comme précédemment, mais à l'un des axes du repère.
En particulier, elle est dite:
. CAVALIÈRE quand la direction de projection fait un angle de 45° avec
le plan de projection et les distances ne sont pas réduites. Les
lignes de fuite sont dessinées généralement avec un angle de 30 ou 45°
avec l'horizontale;
. CABINET quand on raccourcit les arrêtes portées par les lignes
fuyantes dans le rapport de 1/2.

8<------8<------8<------8<------8<------8<------8<------8<------

,----[les fonctions d'asymptotes
| perspective(triple camera, triple up=Z)
| perspective(real x, real y, real z, triple up=Z)
| These project three dimensions onto two taking account of
| perspective, as seen from the location camera or (x,y,z),
| respectively, orienting the camera so that, if possible, the vector up
| points upwards.
`----

Dans cette projection dite PERSPECTIVE:
le centre de projection se situe à une distance finie du plan de
projection.
La taille des objets est inversement proportionnelle à leur distance
au centre de projection : un objet éloigné sera plus petit que s'il
était prés, comme il nous paraît dans la réalité. Les distances et
les angles sont modifiés lors de la projection sauf lorsque les
faces sont parallèles au plan de projection. De même, le
parallélisme n'est pas conservé sauf pour les droites incluses dans un
plan parallèle au plan de projection.

8<------8<------8<------8<------8<------8<------8<------8<------

Merci de me corriger s'il y a des erreurs.
MB
Administrateur
Administrateur
Messages : 8058
Inscription : samedi 28 mai 2005, 14:23
Statut actuel : Enseignant
Contact :

Message non lu par MB »

Voici la figure obtenue après adaptation du code :

Code : Tout sélectionner

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

currentprojection=orthographic(-50,100,30);

//Draw right angle (MA,MB) in 3D
void drawrightangle(picture pic=currentpicture,
                    triple M, triple A, triple B,
                    real radius,
                    pen p=currentpen,
                    pen fillpen=nullpen,
                    projection P=currentprojection)
{
  p=linejoin(0)+linecap(0)+p;
  transform3 T=shift(-M);
  triple OA=radius/sqrt(2)*unit(T*A),
    OB=radius/sqrt(2)*unit(T*B),
    OC=OA+OB;
  path3 _p=shift(M)*(O--OA--OC--OB--cycle3);
  if (fillpen==nullpen)
    draw(pic, _p, p=p);
  else filldraw(pic, _p, fillpen=fillpen, drawpen=p);
}

real r=4, h=2.5;
real gle=60;
real gleA=20;
transform3 tR=rotate(gle,Z);
transform3 tT=shift((0,0,-h));

triple p0=(0,0,h),
  pA=rotate(gleA,Z)*(0,r,h),
  pF=tR*pA,
  pB=tR*pF,
  pD=tT*pA,
  pC=tT*pB,
  pE=intersectionpoint(p0--pF,pA--pB);

revolution r=cylinder(O,r,h,Z);
r.draw();

draw(O--p0, dashed);
draw(p0--pB--pF--pA--cycle3^^p0--pF^^pA--pB^^pA--pD);
draw(O--pD--pC--cycle3^^O--p0^^pB--pC, dashed);

fill(pA--pD--pC--pB--cycle3,lightgray+opacity(0.5));

drawrightangle(pE,p0,pB,0.6,fillpen=gray);

dot(Label("$A$",align=NW),pA);
dot(Label("$B$",align=NE),pB);
dot(Label("$C$",align=S),pC);
dot(Label("$D$",align=NW),pD);
dot(Label("$E$",align=S),pE);
dot(Label("$F$",align=S),pF);
dot(Label("$O$",align=N),p0);
dot(Label("$O'$",align=NE),O);

typedef void dotmark(picture, pair);
dotmark DotMark(pen p=currentpen)
{
  return new void(picture pic, pair pt)
    {
      dot(pic,pt,p);
    };
}

dotmark NoDotMark(pen p=currentpen)
{
  return new void(picture pic, pair pt){};
}

dotmark DotMark=DotMark();
dotmark NoDotMark=NoDotMark();

markroutine dirmarkroutine(int n, dotmark dotmark=NoDotMark) {
  return new void(picture pic=currentpicture, path g, frame f) {
    if(n == 0) return;
    else
      {
        real width=1/n;
        for(int i=0; i < n; ++i){
          add(pic,
              rotate(degrees(dir(g,arctime(g,(i+.5)*width*arclength(g)))))*f,
              relpoint(g,(i+.5)*width));
          dotmark(pic,relpoint(g,i*width));
        }
        dotmark(pic,relpoint(g,1));
      }
  };
}

picture picturemarkmaker(path g, real n=1,
                         real size=0, real space=0,
                         real angle=0, real hoffset=0, pen p=currentpen)
{
  picture opic;
  int pos=0;
  for(int i=1; i<=n; ++i)
    {
      draw (opic,shift((space*(pos-.5*((n+1)%2)),hoffset))*
            rotate(angle)*
            scale(size/2)*g,p);
      pos=pos+i*(-1)^(i+1);
    }
  return opic;
}

real minstickmarkspace=dotsize(currentpen);
real minstickmarksize=3*dotsize(currentpen);
frame stickpicture(real n=1, real size=0, real space=0,
                   real angle=0, real hoffset=0, pen p=currentpen)
{
  if(size == 0) size=minstickmarksize+2*linewidth(p);
  if(space == 0) space=minstickmarkspace+linewidth(p);
  return picturemarkmaker(N--S,n,size,space,angle,hoffset,p).fit();
}

marker StickMarker(int n=1, int div=1,
                   real size=0, real space=0,
                   real angle=0, real hoffset=0,
                   dotmark dotmark=NoDotMark(), pen p=currentpen)
  {
    return marker(stickpicture(n,size,space,angle,hoffset,p),dirmarkroutine(div,dotmark));
  }
  
draw(p0--pF,StickMarker(1,2,size=6,angle=-45,DotMark,red));  

shipout(bbox(xmargin=2mm,invisible));
Pour les marqueurs, j'ai utilisé les macros réalisée par Ph. Ivaldi, mais je ne sais pas si il n'y a pas plus simple ...
Pièces jointes
Figure2.png
(132.13 Kio) Téléchargé 697 fois
MB. (rejoignez pCloud et bénéficiez de 10Go de stockage en ligne gratuits)
Pas d'aide en message privé. Merci de consulter ce sujet avant de poster votre premier message.
Ph. Ivaldi

Message non lu par Ph. Ivaldi »

MB a écrit :Voici la figure obtenue après adaptation du code :

Code : Tout sélectionner

//Draw right angle (MA,MB) in 3D
void drawrightangle(picture pic=currentpicture,
                    triple M, triple A, triple B,
                    real radius,
                    pen p=currentpen,
                    pen fillpen=nullpen,
                    projection P=currentprojection)
{
  p=linejoin(0)+linecap(0)+p;
  transform3 T=shift(-M);
  triple OA=radius/sqrt(2)*unit(T*A),
    OB=radius/sqrt(2)*unit(T*B),
    OC=OA+OB;
  path3 _p=shift(M)*(O--OA--OC--OB--cycle3);
  if (fillpen==nullpen)
    draw(pic, _p, p=p);
  else filldraw(pic, _p, fillpen=fillpen, drawpen=p);
}
La nouvelle mouture de cette fonction, plus propre:

Code : Tout sélectionner

//Draw right angle (MA,MB) in 3D
void drawrightangle(picture pic=currentpicture,
                    triple M, triple A, triple B,
                    real radius=0,
                    pen p=currentpen,
                    pen fillpen=nullpen,
                    projection P=currentprojection)
{
  p=linejoin(0)+linecap(0)+p;
  if (radius==0) radius=arrowfactor*sqrt(2);
  transform3 T=shift(-M);
  triple OA=radius/sqrt(2)*unit(T*A),
    OB=radius/sqrt(2)*unit(T*B),
    OC=OA+OB;
  path3 _p=OA--OC--OB;
  picture pic_;
    draw(pic_, _p, p=p);
    if (fillpen!=nullpen) fill(pic_, O--_p--cycle3, fillpen);
  add(pic,pic_,M);
}
La ligne

Code : Tout sélectionner

drawrightangle(pE,p0,pB,0.6,fillpen=gray); 
peut simplement être remplacée par

Code : Tout sélectionner

drawrightangle(pE,p0,pB,fillpen=gray);

Une question: comment faites vous pour obtenir de la transparence dans le .png ?
asy -V -f png fichier.asy ne rend pas la transparence.

Merci.
MB
Administrateur
Administrateur
Messages : 8058
Inscription : samedi 28 mai 2005, 14:23
Statut actuel : Enseignant
Contact :

Message non lu par MB »

Merci pour la modification de la fonction.

Par ailleurs, ce que j'ai utilisé pour les marques d'égalité de longueurs est correct ou il y avait plus simple ? (ou plus propre)
Ph. Ivaldi a écrit :Une question: comment faites vous pour obtenir de la transparence dans le .png ?
asy -V -f png fichier.asy ne rend pas la transparence.
En fait, je compile toujours en PDF avec Asymptote et j'effectue ensuite la conversion en PNG via la fonction convert d'ImageMagick.

[Edit] Par contre, ce qui n'est pas super, c'est que les lignes du cylindre et les segments qui devraient être en noir sont un peu grisé lors du remplissage de la surface. Il faudrait sans doute remplir la surface avant de tracer ces lignes.
MB. (rejoignez pCloud et bénéficiez de 10Go de stockage en ligne gratuits)
Pas d'aide en message privé. Merci de consulter ce sujet avant de poster votre premier message.
P.Fradin

Message non lu par P.Fradin »

MB a écrit : En fait, je compile toujours en PDF avec Asymptote et j'effectue ensuite la conversion en PNG via la fonction convert d'ImageMagick.
J'ai l'impression que cette conversion fait des images un peu gourmandes en taille quand je compare les différentes productions. Personnellement, je fais un apercu dans acrobat reader puis une capture d'écran (avec KSnapshot sous linux et Qv sous windows) j'ai l'impression que la taille est moins importante. Tu peux aussi faire la conversion avec ghostscript.
Par contre, ce qui n'est pas super, c'est que les lignes du cylindre et les segments qui devraient être en noir sont un peu grisé lors du remplissage de la surface. Il faudrait sans doute remplir la surface avant de tracer ces lignes.
C'est la transparence qui fait cela, j'ai constaté la même chose avec pstricks, il faut remplir le fond en transparence (sans contour), puis dessiner le contour sans remplissage.
Ph. Ivaldi

Message non lu par Ph. Ivaldi »

P.Fradin a écrit :
MB a écrit : En fait, je compile toujours en PDF avec Asymptote et j'effectue ensuite la conversion en PNG via la fonction convert d'ImageMagick.
J'ai l'impression que cette conversion fait des images un peu gourmandes en taille quand je compare les différentes productions. Personnellement, je fais un apercu dans acrobat reader puis une capture d'écran (avec KSnapshot sous linux et Qv sous windows) j'ai l'impression que la taille est moins importante. Tu peux aussi faire la conversion avec ghostscript.
Comment fait on avec gs ?
J'ai regardé le script imagen du paquet Hevea mais je n'ai pas vu comment augmenter la qualité.
Pour mon site (toutes les pages sont génrées automatiquement à partir d'un répertoire de travail; la ligne de commande est donc obligatoire), j'utilise la commande:

Code : Tout sélectionner

convert -density 200 -geometry 50%x +antialias ${ficssext}.eps ${ficssext}.${EXTIMAG}
qui produit une qualité/poids convenable (la suppression de l'anti-aliasing --option +antialias -- réduit le poids me semble-t-il).
Par contre, ce qui n'est pas super, c'est que les lignes du cylindre et les segments qui devraient être en noir sont un peu grisé lors du remplissage de la surface. Il faudrait sans doute remplir la surface avant de tracer ces lignes.
P.Fradin a écrit : C'est la transparence qui fait cela, j'ai constaté la même chose avec pstricks, il faut remplir le fond en transparence (sans contour), puis dessiner le contour sans remplissage.
Il faut peut-être essayer la commande filldraw, quand c'est possible.
MB
Administrateur
Administrateur
Messages : 8058
Inscription : samedi 28 mai 2005, 14:23
Statut actuel : Enseignant
Contact :

Message non lu par MB »

P.Fradin a écrit :
MB a écrit : En fait, je compile toujours en PDF avec Asymptote et j'effectue ensuite la conversion en PNG via la fonction convert d'ImageMagick.
J'ai l'impression que cette conversion fait des images un peu gourmandes en taille quand je compare les différentes productions. Personnellement, je fais un apercu dans acrobat reader puis une capture d'écran (avec KSnapshot sous linux et Qv sous windows) j'ai l'impression que la taille est moins importante. Tu peux aussi faire la conversion avec ghostscript.
Oui, c'est vrai que c'est plus lourd.
Je passe la résolution à 300dpi. Ca doit être pour ça.
MB. (rejoignez pCloud et bénéficiez de 10Go de stockage en ligne gratuits)
Pas d'aide en message privé. Merci de consulter ce sujet avant de poster votre premier message.
Répondre
  • Sujets similaires
    Réponses
    Vues
    Dernier message