Page 1 sur 1
Du texte sur une surface... Comment faire, et comprendre ?
Posté : mar. 29 juin 2010, 18:24
par DK
Bonjour,
J'ai essayé de m'inspirer d'un code source qui a été utilisé pour montrer l'action (et l'effet) des "begingroup3"... J'ai compris comment fonctionne le begingroup3, mais ce qui m'avait interpellé c'est l'exemple lui-même où du texte 3D était placé sur la surface paramétrique même et en épousait la forme !
Absolument génial, mais comprendre comment cela a été fait : difficile, puisque je tourne en rond pour tenter d'écrire du texte sur une sphère ! L'exemple dont je parle est ici, et qui marche très bien :
http://asy.gmaths.net/forum/accueil-news-sav-f4/nouvelle-version-d-asymptote-t70.html#p780.
La génération de la surface, c'est clair. Mais ce code là, je n'ai pas compris comment il fonctionne :
Code : Tout sélectionner
draw(surface(xscale(0.26)*yscale(0.1)*rotate(90)*hi,s,4.9,1.4,h,bottom=false),"[pi,2pi]");
. L'action invoquée entre le "s" et le "bottom" (qui fait parti de la structure de la commande "surface") : je ne comprend pas ce que c'est et comment paramétrer. Ou encore dit autrement, comment placer le texte là où l'on veut sur la surface de la sphère (par exemple) à la taille que l'on veut...
Si quelqu'un a des explications... Merci d'avance.
DK.
Re: Du texte sur une surface... Comment faire, et comprendre
Posté : mar. 29 juin 2010, 19:21
par GM
DK a écrit :Si quelqu'un a des explications... Merci d'avance.
DK.
Par manque de temps (car copies de bac à corriger !!!), juste la syntaxe et le code de la fonction, dans three_surface.asy, qui permet cela :
Code : Tout sélectionner
// Embed a Label onto a surface.
surface surface(Label L, surface s, real uoffset, real voffset,
real height=0, bool bottom=true, bool top=true)
{
int nu=s.index.length;
int nv;
if(nu == 0) nu=nv=1;
else {
nv=s.index[0].length;
if(nv == 0) nv=1;
}
path[] g=texpath(L);
pair m=min(g);
pair M=max(g);
pair lambda=inverse(L.T*scale(nu-epsilon,nv-epsilon))*(M-m);
lambda=(abs(lambda.x),abs(lambda.y));
path[] G=bezulate(g);
path3 transpath(path p, real height) {
return path3(unstraighten(p),new triple(pair z) {
real u=uoffset+(z.x-m.x)/lambda.x;
real v=voffset+(z.y-m.y)/lambda.y;
if(((u < 0 || u >= nu) && !s.ucyclic()) ||
((v < 0 || v >= nv) && !s.vcyclic())) {
warning("cannotfit","cannot fit string to surface");
u=v=0;
}
return s.point(u,v)+height*unit(s.normal(u,v));
});
}
surface s;
for(path p : G) {
for(path g : regularize(p)) {
path3 b;
bool extrude=height > 0;
if(bottom || extrude)
b=transpath(g,0);
if(bottom) s.s.push(patch(b));
if(top || extrude) {
path3 h=transpath(g,height);
if(top) s.s.push(patch(h));
if(extrude) s.append(extrude(b,h));
}
}
}
return s;
}
Re: Du texte sur une surface... Comment faire, et comprendre
Posté : mar. 29 juin 2010, 19:47
par GM
Un exemple pour comprendre les paramètres :
*** Pour masquer/découvrir le code Asymptote qui a permis de créer la figure, il faut cliquer dessus. ;-) ***
- CODE ASYMPTOTE de la figure ci-dessus :
Tout sélectionner
import graph3;
size(200);
currentprojection=orthographic(
camera=(-0.46115537749058,1.17130959910743,5.2359684929413),
up=(-0.00651970599365431,0.00966944070439416,-0.00273731877240859),
target=(-2.93764578634947e-16,1.78134416939368e-16,1.14578485588268e-15),
zoom=0.676839362028687);
real f(pair z) {return z.y^2-z.x^2;}
surface s=surface(f,(-1,-1),(1,1),nx=20,ny=4,Spline);
draw(s,lightblue+opacity(0.8),blue);
draw(surface(scale(.5)*"GM",s,uoffset=10,voffset=1,height=0.03),red);
Extrait du code :
Code : Tout sélectionner
surface s=surface(f,(-1,-1),(1,1),nx=20,ny=4,Spline);
draw(surface(scale(.5)*"GM",s,uoffset=10,voffset=1,height=0.03),red);
Compte les lignes du "quadrillage" de la surface : tu vas comprendre la signification des nombres 20, 4, 10 et 1.
Re: Du texte sur une surface... Comment faire, et comprendre
Posté : mar. 29 juin 2010, 20:35
par projetmbc
C'est pour quoi faire tout ceci concrètement. Question un peu provocatrice.
PS : GM j'ai eu peur pendant un moment que tu prennes le plan tangent. Me voilà rassuré.
Re: Du texte sur une surface... Comment faire, et comprendre
Posté : mar. 29 juin 2010, 20:42
par GM
projetmbc a écrit :PS : GM j'ai eu peur pendant un moment que tu prennes le plan tangent. Me voilà rassuré.
Est-ce normal que je ne comprenne rien à cette phrase ?
Re: Du texte sur une surface... Comment faire, et comprendre
Posté : mar. 29 juin 2010, 21:04
par chellier
projetmbc a écrit :C'est pour quoi faire tout ceci concrètement.
Il faut vraiment qu'il y ait une utilité ?

- toto.png (95.38 Kio) Vu 13342 fois
Christophe
Re: Du texte sur une surface... Comment faire, et comprendre
Posté : mar. 29 juin 2010, 21:28
par projetmbc
chellier a écrit :Il faut vraiment qu'il y ait une utilité ?
Une question doit-elle forcément être intéressante ? Je parle de la mienne bien entendu.
Ceci étant dit, j'ai ajouté que ma question était volontairement provocatrice car je suis moi-même coutumier des fonctionnalités anecdotiques comme la mise en forme d'une multiplication par jalousie.
Avec le texte sur une surface, on peut faire des logos. Pour un dessin purement scientifique, on peut rendre plus "lisible" une équation d'une surface en la mettant sur cette dernière.
GM a écrit :projetmbc a écrit :PS : GM j'ai eu peur pendant un moment que tu prennes le plan tangent. Me voilà rassuré.
Est-ce normal que je ne comprenne rien à cette phrase ?
J'ai toujours confondu plan tangent et tangente. Je te rassure, je vais aller suivre mon traitement.

Re: Du texte sur une surface... Comment faire, et comprendre
Posté : mar. 29 juin 2010, 21:57
par chellier
projetmbc a écrit :Ceci étant dit, j'ai ajouté que ma question était volontairement provocatrice
Ma réponse l'était tout autant

.
Sinon :

- equateur2.png (56.27 Kio) Vu 13334 fois
est quand même mieux que :

- Equateur1.png (48.38 Kio) Vu 13334 fois
Christophe
PS : code de la première figure
Code : Tout sélectionner
size(6*cm,0);
usepackage("fourier");
import solids;
settings.render=2; // à commenter si besoin
//settings.prc=false; // à commenter si besoin
pen pSphere=blue+opacity(.4); // +opacity(.4)
triple pO=(0,0,0), pN=(0,0,1), pS=(0,0,-1);
revolution Terre=sphere(O,1,n=4*nslice);
surface s=surface(Terre);
draw(s, pSphere);
// Équateur
skeleton e;
Terre.transverse(e,reltime(Terre.g,.5));
draw(e.transverse.front,.7*linewidth(bp)+red);
draw(e.transverse.back,.7*bp+dashed+red);
// ------------- Tracés en pointillés ----------------
draw(pN--pS,dashed);
// ------------- Labels -------------
draw(surface(scale(.08)*"\'Equateur",s,uoffset=4.5,voffset=24,height=0.01),red);
Re: Du texte sur une surface... Comment faire, et comprendre
Posté : mer. 30 juin 2010, 10:25
par DK
Merci pour les explications du code. Pour le principe du texte sur la sphère (par exemple) c'est effectivement ce que je veux faire : mettre du texte (court) sur la surface et non mettre du texte comme label.
Effectivement cela méritait quelques explications centrées. (je n'ai rien vu de tel sur la doc officielle...)
DK.
Re: Du texte sur une surface... Comment faire, et comprendre
Posté : mer. 30 juin 2010, 12:18
par projetmbc
En ces temps de chaleur, un exemple avec l'équateur risque de surchauffer les esprits.
