Figure à base de cylindre

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.

Figure à base de cylindre

Messagepar MB » Dimanche 14 Janvier 2007, 15:32

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

Figure2_small.jpg
(20.61 Kio) Téléchargé 966 fois
MB (Pas d'aide en Message Privé)
Merci d'utiliser $\LaTeX$ (voir ici) et d'éviter le style SMS pour la lisibilité des messages.
MB
Administrateur
 
Messages: 6872
Inscription: Samedi 28 Mai 2005, 13:23
Localisation: Créteil
Statut actuel: Actif et salarié | Enseignant

Publicité

Messagepar P.Fradin » Dimanche 14 Janvier 2007, 16:34

Salut MB,

Je sais que tu cherches à le faire avec Asymptote, mais est-ce que la version TeXgraph t'interesse?
P.Fradin
 

Messagepar MB » Dimanche 14 Janvier 2007, 17:15

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 (Pas d'aide en Message Privé)
Merci d'utiliser $\LaTeX$ (voir ici) et d'éviter le style SMS pour la lisibilité des messages.
MB
Administrateur
 
Messages: 6872
Inscription: Samedi 28 Mai 2005, 13:23
Localisation: Créteil
Statut actuel: Actif et salarié | Enseignant

Messagepar P.Fradin » Dimanche 14 Janvier 2007, 17:33

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.
Fichiers joints
cylindre.png
(23.03 Kio) Téléchargé 947 fois
P.Fradin
 

Messagepar MB » Dimanche 14 Janvier 2007, 17:46

Merci, la production est parfaite en effet. :D
MB (Pas d'aide en Message Privé)
Merci d'utiliser $\LaTeX$ (voir ici) et d'éviter le style SMS pour la lisibilité des messages.
MB
Administrateur
 
Messages: 6872
Inscription: Samedi 28 Mai 2005, 13:23
Localisation: Créteil
Statut actuel: Actif et salarié | Enseignant

Messagepar kib2 » Dimanche 14 Janvier 2007, 18:53

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).
kib2
Hecto-utilisateur
 
Messages: 80
Inscription: Samedi 25 Novembre 2006, 22:44

Messagepar P.Fradin » Dimanche 14 Janvier 2007, 21:49

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?
P.Fradin
 

Re: [Asymptote] Figure à base de cylindre

Messagepar Ph. Ivaldi » Lundi 15 Janvier 2007, 01:42

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/solid3d/index.html

Je vous laisse le soin d'utiliser les macros pour les marques de segments :P .
Ph. Ivaldi
Méga-utilisateur
 
Messages: 267
Inscription: Vendredi 12 Janvier 2007, 23:27
Statut actuel: Actif et salarié

Re: [Asymptote] Figure à base de cylindre

Messagepar P.Fradin » Lundi 15 Janvier 2007, 08:39

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

Re: [Asymptote] Figure à base de cylindre

Messagepar Ph. Ivaldi » Lundi 15 Janvier 2007, 10:46

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.
Ph. Ivaldi
Méga-utilisateur
 
Messages: 267
Inscription: Vendredi 12 Janvier 2007, 23:27
Statut actuel: Actif et salarié

Messagepar rebouxo » Lundi 15 Janvier 2007, 11:14

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
rebouxo
Modérateur
 
Messages: 6896
Inscription: Mercredi 15 Février 2006, 13:18
Localisation: le havre
Statut actuel: Actif et salarié | Enseignant

Re: [Asymptote] Figure à base de cylindre

Messagepar MB » Lundi 15 Janvier 2007, 11:54

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);
Fichiers joints
Figure2_bad.png
(64.34 Kio) Téléchargé 816 fois
MB (Pas d'aide en Message Privé)
Merci d'utiliser $\LaTeX$ (voir ici) et d'éviter le style SMS pour la lisibilité des messages.
MB
Administrateur
 
Messages: 6872
Inscription: Samedi 28 Mai 2005, 13:23
Localisation: Créteil
Statut actuel: Actif et salarié | Enseignant

Re: [Asymptote] Figure à base de cylindre

Messagepar P.Fradin » Lundi 15 Janvier 2007, 13:19

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".
P.Fradin
 

Messagepar Ph. Ivaldi » Lundi 15 Janvier 2007, 16:38

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/OpenGl/Sdin/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.
Ph. Ivaldi
Méga-utilisateur
 
Messages: 267
Inscription: Vendredi 12 Janvier 2007, 23:27
Statut actuel: Actif et salarié

Messagepar MB » Lundi 15 Janvier 2007, 19:08

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 ...
Fichiers joints
Figure2.png
(132.13 Kio) Téléchargé 697 fois
MB (Pas d'aide en Message Privé)
Merci d'utiliser $\LaTeX$ (voir ici) et d'éviter le style SMS pour la lisibilité des messages.
MB
Administrateur
 
Messages: 6872
Inscription: Samedi 28 Mai 2005, 13:23
Localisation: Créteil
Statut actuel: Actif et salarié | Enseignant

Messagepar Ph. Ivaldi » Lundi 15 Janvier 2007, 19:38

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.
Ph. Ivaldi
Méga-utilisateur
 
Messages: 267
Inscription: Vendredi 12 Janvier 2007, 23:27
Statut actuel: Actif et salarié

Messagepar MB » Lundi 15 Janvier 2007, 19:47

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 (Pas d'aide en Message Privé)
Merci d'utiliser $\LaTeX$ (voir ici) et d'éviter le style SMS pour la lisibilité des messages.
MB
Administrateur
 
Messages: 6872
Inscription: Samedi 28 Mai 2005, 13:23
Localisation: Créteil
Statut actuel: Actif et salarié | Enseignant

Messagepar P.Fradin » Lundi 15 Janvier 2007, 20:13

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

Messagepar Ph. Ivaldi » Lundi 15 Janvier 2007, 22:40

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.
Ph. Ivaldi
Méga-utilisateur
 
Messages: 267
Inscription: Vendredi 12 Janvier 2007, 23:27
Statut actuel: Actif et salarié

Messagepar MB » Lundi 15 Janvier 2007, 22:52

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 (Pas d'aide en Message Privé)
Merci d'utiliser $\LaTeX$ (voir ici) et d'éviter le style SMS pour la lisibilité des messages.
MB
Administrateur
 
Messages: 6872
Inscription: Samedi 28 Mai 2005, 13:23
Localisation: Créteil
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: Aucun utilisateur enregistré et 2 invités