Labels en 3D (Embbed)

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.

Labels en 3D (Embbed)

Messagepar cjorssen » Samedi 05 Mars 2011, 16:12

Bonjour à tous,

Je cherche à placer des labels en 3D, figés. Pour cela, j'utilise l'"interaction" Embedded (par opposition à Billboard par défaut). J'aimerais leur faire subir des rotations successives. Le problème c'est que je ne comprends pas bien où se trouve (dans quel plan) le label avant de lui faire subir les rotations.

Dans l'exemple suivant, j'aimerais que le label "r" soit dans le plan $(M,\vec{e_r},\vec{e_{\theta}})$ des coordonnées sphériques (du physicien). Intuitivement, je lui fais subir une rotation de phi autour de Z puis une rotation de theta autour de $\vec{e_{\varphi}}$. Mais cela ne fonctionne pas.

510efeab3392c3dbfb0f9390f14d39d9.png

Code: Tout sélectionner
import three;
size(4cm,0);
currentprojection=perspective(7,4,6);

interaction figer_les_labels = Embedded;

draw(O -- 3*X, Arrow3(TeXHead3));
draw(O -- 3*Y, Arrow3(TeXHead3));
draw(O -- 3*Z, Arrow3(TeXHead3));

real x=2, y=2, z=2;
real r, theta, phi;
r = sqrt(x^2 + y^2 + z^2);
theta = aCos(z/r);
phi = aTan(y/x);

triple pM = (2,2,2);

triple vvEr = unit(pM);
triple vvEtheta = dir(90+theta, phi);
triple vvEphi = cross(vvEr, vvEtheta);

path3 plan_M_r_theta = plane(vvEr, vvEtheta, pM);
path3 plan_M_r_phi = plane(vvEr, vvEphi, pM);
path3 plan_M_theta_phi = plane(vvEtheta, vvEphi, pM);

draw(surface(plan_M_r_theta),opacity(.5)+red);
draw(surface(plan_M_r_phi),opacity(.5)+blue);
draw(surface(plan_M_theta_phi),opacity(.5)+green);

label(rotate(phi,Z)*rotate(theta,vvEphi)*"$r$",pM,figer_les_labels);


Si quelqu'un a mieux compris comme faire, je suis preneur.

Merci d'avance

--
Christophe
cjorssen
Déca-utilisateur
 
Messages: 49
Inscription: Jeudi 05 Novembre 2009, 15:08
Statut actuel: Actif et salarié | Enseignant

Publicité

Re: Labels en 3D (Embbed)

Messagepar maurice » Samedi 05 Mars 2011, 17:39

Bonjour, je ne suis pas sûr d'avoir bien compris la question.

Peut-être avec plane project (doc officielle p 137, doc maurice p 31). J'ai essayé avec :

Code: Tout sélectionner
triple n=normal(plan_M_r_theta);

//transform3 pr=planeproject(n,pM);
transform3 pr=planeproject(plan_M_r_theta,n);
label(pr*rotate(phi,Z)*rotate(theta,vvEphi)*rotate(90,X)*"$r$",pM,figer_les_labels);


C'est bien un truc comme ça que tu veux obtenir ?

bb410592e883fda93ee60e9c8bd9713b.png

Code: Tout sélectionner
import three;
size(4cm,0);
currentprojection=perspective(7,4,6);

interaction figer_les_labels = Embedded;

draw(O -- 3*X, Arrow3(TeXHead3));
draw(O -- 3*Y, Arrow3(TeXHead3));
draw(O -- 3*Z, Arrow3(TeXHead3));

real x=2, y=2, z=2;
real r, theta, phi;
r = sqrt(x^2 + y^2 + z^2);
theta = aCos(z/r);
phi = aTan(y/x);

triple pM = (2,2,2);

triple vvEr = unit(pM);
triple vvEtheta = dir(90+theta, phi);
triple vvEphi = cross(vvEr, vvEtheta);

path3 plan_M_r_theta = plane(vvEr, vvEtheta, pM);
//path3 plan_M_r_phi = plane(vvEr, vvEphi, pM);
//path3 plan_M_theta_phi = plane(vvEtheta, vvEphi, pM);

draw(surface(plan_M_r_theta),opacity(.5)+red);
//draw(surface(plan_M_r_phi),opacity(.5)+blue);
//draw(surface(plan_M_theta_phi),opacity(.5)+green);


triple n=normal(plan_M_r_theta);

//transform3 pr=planeproject(n,pM);
transform3 pr=planeproject(plan_M_r_theta,n);
label(pr*rotate(phi,Z)*rotate(theta,vvEphi)*rotate(90,X)*"$r$",pM,figer_les_labels);


Maurice
Asymptote :
----> Démarrage rapide : http://cgmaths.fr/Atelier/Asymptote/Asymptote.html
----> Documentation 3D : http://www.mathco.tuxfamily.org et si ça ne marche pas, essayez la version pdf
maurice
Méga-utilisateur
 
Messages: 399
Inscription: Jeudi 25 Mars 2010, 13:49
Statut actuel: Actif et salarié | Enseignant

Re: Labels en 3D (Embbed)

Messagepar maurice » Samedi 05 Mars 2011, 18:29

Bonjour,

Autre solution (peut être mieux ?) avec :

Code: Tout sélectionner
label(YZ*"r",(0,pM.y,pM.z),figer_les_labels);
label(rotate(-90,(pM.x,pM.y,0),pM)*rotate(90-phi,Z)*YZ*"$r$",pM, figer_les_labels);




Code: Tout sélectionner
transform3 YZ=rotate(90,O,Z)*rotate(90,O,X);


Il y a un léger décalage que je ne m'explique pas pour l'instant. Mais on progresse ou bien ?

2cd21fb3df49f4ff920424f88feff329.png

Code: Tout sélectionner
import three;
size(4cm,0);
currentprojection=perspective(7,4,6);

interaction figer_les_labels = Embedded;

draw(O -- 3*X, Arrow3(TeXHead3));
draw(O -- 3*Y, Arrow3(TeXHead3));
draw(O -- 3*Z, Arrow3(TeXHead3));

real x=2, y=2, z=2;
real r, theta, phi;
r = sqrt(x^2 + y^2 + z^2);
theta = aCos(z/r);
phi = aTan(y/x);

triple pM = (2,2,2);

triple vvEr = unit(pM);
triple vvEtheta = dir(90+theta, phi);
triple vvEphi = cross(vvEr, vvEtheta);

path3 plan_M_r_theta = plane(vvEr, vvEtheta, pM);
//path3 plan_M_r_phi = plane(vvEr, vvEphi, pM);
//path3 plan_M_theta_phi = plane(vvEtheta, vvEphi, pM);

draw(surface(plan_M_r_theta),opacity(.5)+red);
//draw(surface(plan_M_r_phi),opacity(.5)+blue);
//draw(surface(plan_M_theta_phi),opacity(.5)+green);


label(YZ*"r",(0,pM.y,pM.z),figer_les_labels);
label(rotate(-90,(pM.x,pM.y,0),pM)*rotate(90-phi,Z)*YZ*"$r$",pM, figer_les_labels);


Maurice
Asymptote :
----> Démarrage rapide : http://cgmaths.fr/Atelier/Asymptote/Asymptote.html
----> Documentation 3D : http://www.mathco.tuxfamily.org et si ça ne marche pas, essayez la version pdf
maurice
Méga-utilisateur
 
Messages: 399
Inscription: Jeudi 25 Mars 2010, 13:49
Statut actuel: Actif et salarié | Enseignant

Re: Labels en 3D (Embbed)

Messagepar cjorssen » Samedi 05 Mars 2011, 19:41

maurice a écrit:Autre solution (peut être mieux ?) avec :

Code: Tout sélectionner
label(YZ*"r",(0,pM.y,pM.z),figer_les_labels);
label(rotate(-90,(pM.x,pM.y,0),pM)*rotate(90-phi,Z)*YZ*"$r$",pM, figer_les_labels);


Bonjour et merci de ta réponse. C'est vrai que c'est pas mal (il me manquait encore une rotation mais j'ai trouvé ce qu'il fallait) :

1eff61d417cb5e308b05b13904e427b4.png

Code: Tout sélectionner
import three;
size(10cm,0);
currentprojection=perspective(7,4,6);

interaction figer_les_labels = Embedded;

draw(O -- 3*X, Arrow3(TeXHead3));
draw(O -- 3*Y, Arrow3(TeXHead3));
draw(O -- 3*Z, Arrow3(TeXHead3));

real x=2, y=2, z=2;
real r, theta, phi;
r = sqrt(x^2 + y^2 + z^2);
theta = aCos(z/r);
phi = aTan(y/x);

triple pM = (x,y,z);

triple vvEr = unit(pM);
triple vvEtheta = dir(90+theta, phi);
triple vvEphi = cross(vvEr, vvEtheta);

path3 plan_M_r_theta = plane(vvEr, vvEtheta, pM);
draw(surface(plan_M_r_theta),opacity(.5)+red);

triple sph2cart(real distance,
real angle1,
real angle2) {
return (distance*Sin(angle1)*Cos(angle2),
distance*Sin(angle1)*Sin(angle2),
distance*Cos(angle1));}

label(YZ*"$r$",sph2cart(r,theta,90),figer_les_labels);

draw(arc((0,0,pM.z),pM,sph2cart(r,theta,90)), blue + opacity(.5));
label(rotate(90-phi,Z)*
YZ*"$r$",pM, 0*N, blue, figer_les_labels);

draw((pM.x,pM.y,0) -- pM, dashed + opacity(.5) + red);
label(rotate(-90,(pM.x,pM.y,0),pM)*
rotate(90-phi,Z)*
YZ*"$r$",pM, 0*N, red, figer_les_labels);

draw(pM -- pM + vvEphi, dashed + opacity(.5) + green);
label(rotate(theta,pM,pM + vvEphi)*
rotate(-90,(pM.x,pM.y,0),pM)*
rotate(90-phi,Z)*
YZ*"$r$",pM, 0*N, heavygreen, figer_les_labels);


maurice a écrit:Il y a un léger décalage que je ne m'explique pas pour l'instant. Mais on progresse ou bien ?


Je ne comprends vraiment pas ce décalage (voir les traits de construction) ?

En tout les cas, on progresse, c'est sûr : merci ! Mais pour l'instant, c'est plutôt de l'essai-erreur qu'une méthode systématique. En particulier, je n'ai pas l'impression que seule la rotation rotate(90-phi,Z) suffise à passe du r noir au r bleu ?

--
Christophe
cjorssen
Déca-utilisateur
 
Messages: 49
Inscription: Jeudi 05 Novembre 2009, 15:08
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 1 invité