Représentation simple d'une sphère

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 : 7132
Inscription : samedi 28 mai 2005, 14:23
Statut actuel : Enseignant

Représentation simple d'une sphère

Message par MB »

Bonjour, je souhaite obtenir "le plus simplement possible" la figure suivante à l'aide d'Asymptote.

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


Pour ce résultat j'ai utilisé solids et plus précisément le code suivant :

Code : Tout sélectionner

unitsize(0.70cm);

settings.render = 0;
settings.prc = false;

dotfactor = 3.5;

import solids;
currentprojection=perspective(10,100,10);
currentlight=nolight;

triple pO = (0,0,0);

revolution r = sphere(pO,2.5);
draw(r, m=2, frontpen=solid+black, backpen=solid+black);

skeleton s;
r.transverse(s,reltime(r.g,0.5));
draw(s.transverse.back, dashed+black);
draw(s.transverse.front, solid+black);

dot(pO);

shipout(bbox(xmargin=1mm,invisible));
Ce code n'est pas satisfaisant car si je modifie perspective(10,100,10), alors le cercle qui se veut dans le plan vertical ne l'est plus et j'ai donc une sphère aplatie. D'ailleurs, je ne sais pas très bien comment sont tracés ces deux arcs de cercle (mais ça vient du m=2 et si on augmente la valeur on a des cercles horizontaux qui s'ajoutent).

Bref, comment faire pour que la figure soient correcte quelque soit currentprojection ?

Tracer le cercle à la main avec la procédure circle du module three n'est pas simple car il faut prévoir la projection pour qu'il ne se déforme pas. Au pire, ça pourrait être pratique de projeter le skeleton et ensuite de travailler tranquillement en 2d ... mais bon, si quelqu'un à une solution je suis preneur.
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
MB (Pas d'aide en Message Privé)
Merci d'utiliser MathJax (voir ici) et d'éviter le style SMS pour la lisibilité des messages.

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

Re: [Asymptote] Représentation simple d'une sphére

Message par OG »

bonsoir

peux-tu donner le code qui donne une sphère aplatie ?

bonne soirée à toutes et à tous
à l'année prochaine
O.G.

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

Re: [Asymptote] Représentation simple d'une sphére

Message par MB »

OG a écrit :peux-tu donner le code qui donne une sphère aplatie ?
Il suffit (par exemple) de remplacer currentprojection par :

Code : Tout sélectionner

currentprojection=perspective(10,100,50);
MB (Pas d'aide en Message Privé)
Merci d'utiliser MathJax (voir ici) et d'éviter le style SMS pour la lisibilité des messages.

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

Re: [Asymptote] Représentation simple d'une sphére

Message par MB »

En fait, la commande suivante :

Code : Tout sélectionner

draw(r, m=2, frontpen=solid+black, backpen=solid+black);
revient exactement à :

Code : Tout sélectionner

r.longitudinal(s);
draw(s.longitudinal.front, solid+black);
draw(s.longitudinal.back, solid+black);
A priori, c'est le grand cercle du plan (xOz) qui est tracé (et il ne semble pas possible d'en tracer d'autres). Une fois la projection effectuée, le cercle n'est donc plus forcément circulaire. Il faudrait appliquer une rotation à ce skeleton pour compenser la projection. Mais bon ...
MB (Pas d'aide en Message Privé)
Merci d'utiliser MathJax (voir ici) et d'éviter le style SMS pour la lisibilité des messages.

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

Re: [Asymptote] Représentation simple d'une sphére

Message par OG »

bonjour et meilleurs voeux 2009.

Visiblement l'arc de cercle (en trait plein) pour la vue de la sphère ne dépend pas de la vue, d'où le côté aplatie.
Il faudrait la faire tourner. Quel est le but exactement de ce dessin ?

Visiblement c'est le shipout qui fait que mettre settings.render=4 donne un eps vide.

Amicalement
O.G.

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

Re: [Asymptote] Représentation simple d'une sphére

Message par MB »

Dans les exemples de Philippe (ici : figure 0040) j'ai trouvé le code qui semble répondre à ce que je cherche. Il s'agit de :

Code : Tout sélectionner

path3 c = rotate(90,X)*scale3(a)*unitcircle3;

triple cam = unit(currentprojection.camera);
real e = degrees(xypart(cam),false)-90;
real f = -sgn(cam.z)*aCos(sqrt(cam.x^2+cam.y^2)/abs(cam));
c = rotate(f,cross(Z,cam))*rotate(e,Z)*c;
draw(c, blue);
En gros, ça doit effectuer la rotation d'un cercle de même rayon que la sphère en fonction de la position de la caméra. Si Philippe utilise ce code, c'est qu'il ne doit pas y avoir plus simple. :?

Voici le code complet pour obtenir la figure suivante :

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

Code : Tout sélectionner

unitsize(1cm);

settings.render = 0;
settings.prc = false;

dotfactor = 3.5;

import solids;
currentprojection=perspective(10,100,50);
currentlight=nolight;

real a = 2.5;

triple pO = (0,0,0);

triple pX = (a,0,0);
triple pY = (0,a,0);
triple pZ = (0,0,a);

dot(pX^^pY^^pZ^^pO);

draw(Label("x",align=N),pO--pX,red);
draw(Label("y",align=E),pO--pY,red);
draw(Label("z",align=E),pO--pZ,red);

revolution r = sphere(pO,a);

draw(surface(r),lightgrey+opacity(0.5));

skeleton s;
r.transverse(s,reltime(r.g,0.5));
draw(s.transverse.back, dashed+black);
draw(s.transverse.front, solid+black);

r.longitudinal(s);
draw(s.longitudinal.front, green);
draw(s.longitudinal.back, dashed+green);

path3 c = rotate(90,X)*scale3(a)*unitcircle3;

triple cam = unit(currentprojection.camera);
real e = degrees(xypart(cam),false)-90;
real f = -sgn(cam.z)*aCos(sqrt(cam.x^2+cam.y^2)/abs(cam));
c = rotate(f,cross(Z,cam))*rotate(e,Z)*c;
draw(c, blue);

shipout(bbox(xmargin=1mm,invisible));
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
MB (Pas d'aide en Message Privé)
Merci d'utiliser MathJax (voir ici) et d'éviter le style SMS pour la lisibilité des messages.

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

Re: [Asymptote] Représentation simple d'une sphére

Message par MB »

OG a écrit :bonjour et meilleurs voeux 2009.
Merci, de même. :D
OG a écrit :Visiblement l'arc de cercle (en trait plein) pour la vue de la sphère ne dépend pas de la vue, d'où le côté aplatie.
Il faudrait la faire tourner.
J'ai pas très bien compris.

A priori, la sphère est construite par rotation d'un demi-cercle autour de l'axe (Oz). Tous les skeletons obtenus via r.transverse sont dans un plan perpendiculaire à l'axe de rotation (donc parallèle à (xOy), alors que les skeletons obtenus via r.longitudinal sont dans un plan parallèle à l'axe de rotation (mais je n'arrive à obtenir que le skeleton contenu dans le plan (xOz)).

Bref, à priori r.longitudinal ne dépend pas vraiment de la projection mais simplement de la sphère. Seulement, il va dépendre de la projection pour distinguer ses parties visibles et cachées.
OG a écrit :Quel est le but exactement de ce dessin ?
Simplement obtenir une figure semblable à la première mais indépendante de la projection (et bien sûr avec le code le plus simple possible).
OG a écrit :Visiblement c'est le shipout qui fait que mettre settings.render=4 donne un eps vide.
C'était plutôt settings.render=0 non ?
MB (Pas d'aide en Message Privé)
Merci d'utiliser MathJax (voir ici) et d'éviter le style SMS pour la lisibilité des messages.

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

Re: [Asymptote] Représentation simple d'une sphére

Message par GMaths »

MB a écrit :obtenir une figure semblable à la première mais indépendante de la projection (et bien sûr avec le code le plus simple possible).
J'ai posé la question ici :
http://sourceforge.net/forum/forum.php? ... _id=409349

et notamment, il y a la réponse de John Bowman suivante :
http://sourceforge.net/forum/message.php?msg_id=6052290

Gaétan

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

Re: [Asymptote] Représentation simple d'une sphère

Message par MB »

Bonjour et merci Gaétan.
Le code proposé par John Bowman est en effet plus simple. On peut remplacer :

Code : Tout sélectionner

path3 c = rotate(90,X)*scale3(a)*unitcircle3;

triple cam = unit(currentprojection.camera);
real e = degrees(xypart(cam),false)-90;
real f = -sgn(cam.z)*aCos(sqrt(cam.x^2+cam.y^2)/abs(cam));
c = rotate(f,cross(Z,cam))*rotate(e,Z)*c;
draw(c, blue);
par :

Code : Tout sélectionner

draw(align(unit(currentprojection.vector()))*scale3(a)*unitcircle3,blue);
Le code à utiliser pour obtenir une sphère semblable à celle du premier message, mais indépendante de la projection est donc :

Code : Tout sélectionner

unitsize(1cm);

settings.render = 0;
settings.prc = false;

dotfactor = 3.5;

import solids;
currentprojection=perspective(20,100,30);
currentlight=nolight;

real a = 2.5;

triple pO = (0,0,0);

dot(pO);

revolution r = sphere(pO,a);

skeleton s;
r.transverse(s,reltime(r.g,0.5));
draw(s.transverse.back,dashed+black);
draw(s.transverse.front,solid+black);

draw(align(unit(currentprojection.vector()))*scale3(a)*unitcircle3,solid+black);

shipout(bbox(xmargin=1mm,invisible));
Je vais le mettre sur le Wiki. :D
MB (Pas d'aide en Message Privé)
Merci d'utiliser MathJax (voir ici) et d'éviter le style SMS pour la lisibilité des messages.

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

Re: [Asymptote] Représentation simple d'une sphère

Message par GMaths »

MB a écrit :Je vais le mettre sur le Wiki. :D
J'ai fait comme toi...
http://www.marris.org/asymptote/Solides ... index.html

... et j'ai remis un message sur son forum pour l'inciter à l'intégrer à solids.asy. ;-)

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

Re: [Asymptote] Représentation simple d'une sphère

Message par MB »

GMaths a écrit :j'ai remis un message sur son forum pour l'inciter à l'intégrer à solids.asy. ;-)
Ca pourrait être pas mal en effet, car c'est très facile avec un cône ou un cylindre.
MB (Pas d'aide en Message Privé)
Merci d'utiliser MathJax (voir ici) et d'éviter le style SMS pour la lisibilité des messages.

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

Re: [Asymptote] Représentation simple d'une sphère

Message par GMaths »

GMaths a écrit :... et j'ai remis un message sur son forum pour l'inciter à l'intégrer à solids.asy. ;-)
ça y est... John a implémenté une fonction silhouette :

Code : Tout sélectionner

import solids; 
settings.render=0; 
settings.prc=false; 
 
size(200); 
 
revolution r=sphere(O,1); 
skeleton s; 
r.transverse(s,0.5*length(r.g)); 
draw(s.transverse.front); 
draw(s.transverse.back,dashed); 
draw(r.silhouette());


pour l'instant dans la version 1.58SVN.

... et donc cela ne fonctionne pas seulement qu'avec les sphères.

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

Re: [Asymptote] Représentation simple d'une sphère

Message par projetmbc »

GMaths a écrit :... et donc cela ne fonctionne pas seulement qu'avec les sphères.
Cela veut-il dire que cette fonctionnalité donne le contour apparent des solides concernés ?

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

Re: [Asymptote] Représentation simple d'une sphère

Message par MB »

GMaths a écrit :ça y est... John a implémenté une fonction silhouette
Efficace. Par contre, j'ai jeté un oeil au code : assez complexe. :D
MB (Pas d'aide en Message Privé)
Merci d'utiliser MathJax (voir ici) et d'éviter le style SMS pour la lisibilité des messages.

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

Re: [Asymptote] Représentation simple d'une sphère

Message par GMaths »

MB a écrit :Par contre, j'ai jeté un oeil au code : assez complexe. :D
... ce qui en dit long sur le niveau du "John" en question.
J'ai regardé de suite aussi : je confirme. Trop complexe pour moi. :D

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

Re: [Asymptote] Représentation simple d'une sphère

Message par MB »

GMaths a écrit :... ce qui en dit long sur le niveau du "John" en question.
Bon, c'est quand même le concepteur et le développeur principal d'Asymptote ! :D
MB (Pas d'aide en Message Privé)
Merci d'utiliser MathJax (voir ici) et d'éviter le style SMS pour la lisibilité des messages.

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

Re: [Asymptote] Représentation simple d'une sphère

Message par GMaths »

Apparemment, John a encore retouché solids.asy pour nous faciliter la vie.

Dorénavant, le code suivant :

Code : Tout sélectionner

import solids;
settings.render=0;
settings.prc=false;
size(200);
revolution r=sphere(O,1);
draw(r,1,longitudinalpen=nullpen);
draw(r.silhouette());
donnera la sphère et le dessin de la section circulaire dans le plan z=0.

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

Re: [Asymptote] Représentation simple d'une sphère

Message par MB »

C'est encore mieux en effet. C'est la ligne suivante qui trace ça je suppose, avec le m=1.

Code : Tout sélectionner

draw(r,1,longitudinalpen=nullpen);
MB (Pas d'aide en Message Privé)
Merci d'utiliser MathJax (voir ici) et d'éviter le style SMS pour la lisibilité des messages.