Représentation simple d'une sphère

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 :

Représentation simple d'une sphère

Message non lu 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.
Pièces jointes
sphere_1.png
sphere_1.png (12.64 Kio) Consulté 2743 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.
OG
Modérateur spécialisé
Modérateur spécialisé
Messages : 2293
Inscription : lundi 12 mars 2007, 11:20
Localisation : Rouen

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

Message non lu 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 : 8058
Inscription : samedi 28 mai 2005, 14:23
Statut actuel : Enseignant
Contact :

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

Message non lu 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. (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.
MB
Administrateur
Administrateur
Messages : 8058
Inscription : samedi 28 mai 2005, 14:23
Statut actuel : Enseignant
Contact :

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

Message non lu 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. (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.
OG
Modérateur spécialisé
Modérateur spécialisé
Messages : 2293
Inscription : lundi 12 mars 2007, 11:20
Localisation : Rouen

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

Message non lu 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 : 8058
Inscription : samedi 28 mai 2005, 14:23
Statut actuel : Enseignant
Contact :

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

Message non lu 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));
Pièces jointes
sphere_2.png
sphere_2.png (46.32 Kio) Consulté 2607 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.
MB
Administrateur
Administrateur
Messages : 8058
Inscription : samedi 28 mai 2005, 14:23
Statut actuel : Enseignant
Contact :

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

Message non lu 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. (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.
GMaths
Utilisateur chevronné
Utilisateur chevronné
Messages : 2042
Inscription : lundi 01 octobre 2007, 10:20

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

Message non lu 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 : 8058
Inscription : samedi 28 mai 2005, 14:23
Statut actuel : Enseignant
Contact :

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

Message non lu 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. (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.
GMaths
Utilisateur chevronné
Utilisateur chevronné
Messages : 2042
Inscription : lundi 01 octobre 2007, 10:20

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

Message non lu 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 : 8058
Inscription : samedi 28 mai 2005, 14:23
Statut actuel : Enseignant
Contact :

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

Message non lu 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. (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.
GMaths
Utilisateur chevronné
Utilisateur chevronné
Messages : 2042
Inscription : lundi 01 octobre 2007, 10:20

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

Message non lu 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 : 2238
Inscription : samedi 29 décembre 2007, 00:58

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

Message non lu 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 : 8058
Inscription : samedi 28 mai 2005, 14:23
Statut actuel : Enseignant
Contact :

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

Message non lu 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. (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.
GMaths
Utilisateur chevronné
Utilisateur chevronné
Messages : 2042
Inscription : lundi 01 octobre 2007, 10:20

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

Message non lu 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 : 8058
Inscription : samedi 28 mai 2005, 14:23
Statut actuel : Enseignant
Contact :

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

Message non lu 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. (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.
GMaths
Utilisateur chevronné
Utilisateur chevronné
Messages : 2042
Inscription : lundi 01 octobre 2007, 10:20

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

Message non lu 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 : 8058
Inscription : samedi 28 mai 2005, 14:23
Statut actuel : Enseignant
Contact :

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

Message non lu 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. (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