Représentation simple d'une sphère

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.

Représentation simple d'une sphère

Messagepar MB » Mardi 30 Décembre 2008, 22:01

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

sphere_1.png
sphere_1.png (12.64 Kio) Vu 2207 fois


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.
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: 6892
Inscription: Samedi 28 Mai 2005, 13:23
Localisation: Créteil
Statut actuel: Actif et salarié | Enseignant

Publicité

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

Messagepar OG » Mercredi 31 Décembre 2008, 18:40

bonsoir

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

bonne soirée à toutes et à tous
à l'année prochaine
O.G.
OG
Modérateur
 
Messages: 2286
Inscription: Lundi 12 Mars 2007, 11:20
Localisation: Rouen
Statut actuel: Actif et salarié | Maître de conférence

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

Messagepar MB » Jeudi 01 Janvier 2009, 17:51

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

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

Messagepar MB » Samedi 03 Janvier 2009, 14:38

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

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

Messagepar OG » Samedi 03 Janvier 2009, 14:55

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.
OG
Modérateur
 
Messages: 2286
Inscription: Lundi 12 Mars 2007, 11:20
Localisation: Rouen
Statut actuel: Actif et salarié | Maître de conférence

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

Messagepar MB » Samedi 03 Janvier 2009, 14:57

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 :

sphere_2.png
sphere_2.png (46.32 Kio) Vu 2071 fois


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));
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: 6892
Inscription: Samedi 28 Mai 2005, 13:23
Localisation: Créteil
Statut actuel: Actif et salarié | Enseignant

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

Messagepar MB » Samedi 03 Janvier 2009, 15:11

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

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

Messagepar GMaths » Samedi 10 Janvier 2009, 11:51

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?thread_id=2808664&forum_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
GMaths
Exa-utilisateur
 
Messages: 2031
Inscription: Lundi 01 Octobre 2007, 09:20
Statut actuel: Actif et salarié | Enseignant

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

Messagepar MB » Samedi 10 Janvier 2009, 12:53

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

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

Messagepar GMaths » Samedi 10 Janvier 2009, 13:58

MB a écrit:Je vais le mettre sur le Wiki. :D


J'ai fait comme toi...
http://www.marris.org/asymptote/Solides/figure-index.html

... et j'ai remis un message sur son forum pour l'inciter à l'intégrer à solids.asy. ;-)
GMaths
Exa-utilisateur
 
Messages: 2031
Inscription: Lundi 01 Octobre 2007, 09:20
Statut actuel: Actif et salarié | Enseignant

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

Messagepar MB » Samedi 10 Janvier 2009, 17:17

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

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

Messagepar GMaths » Dimanche 11 Janvier 2009, 10:18

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.
GMaths
Exa-utilisateur
 
Messages: 2031
Inscription: Lundi 01 Octobre 2007, 09:20
Statut actuel: Actif et salarié | Enseignant

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

Messagepar projetmbc » Dimanche 11 Janvier 2009, 12:45

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 ?
projetmbc
Péta-utilisateur
 
Messages: 1897
Inscription: Samedi 29 Décembre 2007, 00:58
Statut actuel: Actif et salarié | Enseignant

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

Messagepar MB » Dimanche 11 Janvier 2009, 13:06

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

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

Messagepar GMaths » Dimanche 11 Janvier 2009, 14:06

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
GMaths
Exa-utilisateur
 
Messages: 2031
Inscription: Lundi 01 Octobre 2007, 09:20
Statut actuel: Actif et salarié | Enseignant

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

Messagepar MB » Dimanche 11 Janvier 2009, 18:40

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

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

Messagepar GMaths » Dimanche 11 Janvier 2009, 22:12

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.
GMaths
Exa-utilisateur
 
Messages: 2031
Inscription: Lundi 01 Octobre 2007, 09:20
Statut actuel: Actif et salarié | Enseignant

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

Messagepar MB » Dimanche 11 Janvier 2009, 23:55

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


Retourner vers Asymptote

 


  • Articles en relation
    Réponses
    Vus
    Dernier message

Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 6 invités