3D - Trigonométrie sphérique - Solids

Pour toute demande d'aide sur des exemples non finalisés, c'est ici.
Les exemples aboutis et intéressants seront ajoutés aux sous-forums qui suivent.

Règles du forum
Pour toute demande d'aide pour la conception (ou la confirmation d'un code) d'une figure Asymptote, c'est ici.

J'invite ceux qui ont régulièrement des questions à poser à aller dans leur panneau de l'utilisateur pour indiquer dans la signature de leurs messages :

  1. Nom du système d'exploitation (W7 ou Ubuntu 12.04 ou ...)
  2. Version d'Asymptote et éditeur utilisé pour les figures Asymptote
  3. Distribution LaTeX et éditeur utilisé pour les tex.


On va gagner du temps dans les réponses !
jmj
Messages : 3
Enregistré le : mar. 18 oct. 2016, 08:13

3D - Trigonométrie sphérique - Solids

Message non lu par jmj » jeu. 20 oct. 2016, 13:05

Bonjour,

Je cherche à faire de "beaux" dessins de trigonométrie sphérique. Je cherche dans un premier temps à tracer des grands cercles sur une sphère.
Pour ce faire j'utilise Solids et skeleton et les fonctions:
- "transverse", qui me dessine l'équateur
- "longitudinal" qui me dessine un méridien
- puis des rotations de ces 2 grands cercles de base

La rotation d'axe Y ( axe Y : Est-Oeust) de l'équateur est (me semble-t-il) correctement représentée.
Lorsque je pratique une rotation d'axe Z (axe Z : pôle sud- pôle Nord) du méridien , solids trace en trait interrompu, tout ce qui est sous l'équateur, sans tenir compte que dans la projection choisie, ceci est faux dans ce cas.

Des idées ? Des suggestions.

Merci

Salutations
JMJ



Le code est :

Code : Tout sélectionner

\begin{figure}
\centering
\begin{asy}
import solids;
import graph3;
unitsize(1cm);
size(10cm);

real Angle_Y = 23;	
real Angle_Z1 = -45;	
real Rayon   = 1;   // Rayon de la sphère

settings.render=4;		// Pose pb si =0 : Le plan devant la sphere est absent
settings.prc=false;
currentprojection=orthographic(3,10,5);
currentlight=White;

// Transfomations diverses
transform3 RotationDAxe_Y  = rotate(Angle_Y, Y);
transform3 Rotation1DAxe_Z  = rotate(Angle_Z1, Z);
        
// Axes du repère 3D.
 axes3("$x$", "$y$", "$z$",min=(0,-2,0),max=(2,2,2),Arrow3);
 
// définition de la sphère
revolution Rev_Sph = sphere((0,0,0),Rayon);    

// ATTENTION: draw(Rev_Sph.silhouette()); ne trace rien => 
// donc:
draw(surface(Rev_Sph), surfacepen=blue+opacity(.2), meshpen=0.6*grey);

skeleton s_Sphere;
// transverse => Perpendiculaire à l'axe de révolution: On trace donc un  parallèle et 0.5 place la génératrice nommée "g" au milieu => On trace l' équateur

Rev_Sph.transverse(s_Sphere,reltime(Rev_Sph.g,0.5),P=currentprojection);
draw(s_Sphere.transverse.front);
draw(s_Sphere.transverse.back,linetype("8 8",8));

// Rotation de l'équateur
Rev_Sph.transverse(s_Sphere,reltime(Rev_Sph.g,0.5),P=currentprojection);
draw(RotationDAxe_Y * s_Sphere.transverse.front,red);
draw(RotationDAxe_Y * s_Sphere.transverse.back,linetype("8 8",8)+red);

// longitudilal et 0.5 méridienne ATTENTION la syntaxe est différente de transverse. Le code ci-dessous ne marche pas
// Rev_Sph.longitudinal(s_Sphere,reltime(Rev_Sph.g,0.5),P=currentprojection);
//draw(s_Sphere.transverse.back,linetype("8 8",8));
// draw(s_Sphere.transverse.front);

// Ce code trace le grand cercle passant par (1,0,0), (0,0,1) et (0,0,-1)
// C.-à-d. Point sur l'équateur au méridien 0,Pole Nord, Pole Sud
Rev_Sph.longitudinal(s_Sphere,P=currentprojection);
draw(s_Sphere.longitudinal.front);
draw(s_Sphere.longitudinal.back,linetype("8 8",8));

// Rotation du méridien
Rev_Sph.longitudinal(s_Sphere,P=currentprojection);
draw(Rotation1DAxe_Z * s_Sphere.longitudinal.front,blue);
draw(Rotation1DAxe_Z * s_Sphere.longitudinal.back,linetype("8 8",8)+blue);

\end{asy}
\caption{Surface Sphere avec grands cercles \label{Unit Sphere avec grands cercle} }
\end{figure}

Avatar du membre
GM
Administrateur du site
Administrateur du site
Messages : 1512
Enregistré le : dim. 7 mars 2010, 14:50

Re: 3D - Trigonométrie sphérique - Solids

Message non lu par GM » jeu. 20 oct. 2016, 13:53

Bonjour,

je ne suis pas en mesure de faire des tests actuellement et je sais que pour les pointillés en 3D, c'est toujours la galère (pour ne pas dire du bricolage) puisqu'avec le format prc, c'est normalement en jouant sur les transparence que l'on doit distinguer les faces vues des faces cachées.

Mais je me souviens de cet exemple : http://asy.marris.fr/asymptote/Solides/ ... 509_sphere qui peut peut-être donner des idées, si j'ai compris la demande.
Index des fonctions - Exemple de lien donnant le résultat d'une recherche sur les mots 'arc' et 'triple' : http://asy.marris.fr/indexasy/?filtre=arc triple
Mes configurations (le 24/02/21) :
PC n°1 :Windows 10 - Asymptote(2.82)+MikTeX2.9 - Editeurs : Notepad++, TeXworks, Visual Studio Code.
PC n°2 : Ubuntu 20.04LTS - Asymptote(2.67-?? git) + TexLive2020
Mon serveur : Debian Stretch- Asymptote(2.68-16 git) + TexLive2018
Merci de préciser la votre !

OG
V.I.P.
V.I.P.
Messages : 142
Enregistré le : dim. 7 mars 2010, 22:27

Re: 3D - Trigonométrie sphérique - Solids

Message non lu par OG » mer. 9 nov. 2016, 00:37

Bonsoir

J'ai fait des tests.
Il est normal que la fonction ne retourne pas le résultat voulu. En effet

Code : Tout sélectionner

Rotation1DAxe_Z * s_Sphere.longitudinal.front
ne fait que tourner le chemin mais en aucun cas il n'y a un nouveau calcul de
qui est caché qui ne l'est pas.

Le lien donné par Gaëtan est utile. En fait si on fait tourner la sphère, asymptote va faire tourner
l'axe de révolution et donc on peut créer des nouvelles coupes, nouveaux méridiens. Mais il faut "récupérer"
l'angle que fait le méridien "silhouette" en xy. Bref en créant faisant tourner comme il faut la sphère, son
méridien sera ce que l'on veut.

Code : Tout sélectionner

// angle de la caméra, il doit y avoir un autre moyen
// à modifier selon currentprojection=orthographic(3,10,5);
real angle_adapt=degrees((3,10));
skeleton ss_Sphere;
// une nouvelle sphère comme il faut pour que son équateur
// corresponde à ce qu'on veut
revolution ss=rotate(angle_adapt, Z)*Rotation1DAxe_Z*rotate(90,(0,1,0))* Rev_Sph;
ss.transverse(ss_Sphere,reltime(ss.g,0.5),P=currentprojection);
draw(ss_Sphere.transverse.front,yellow+2bp);
draw(ss_Sphere.transverse.back,linetype("8 8",8)+green+2bp);
J'espère que cela fonctionne car j'ai la tête qui tourne...

O.G.

Répondre