Re: À propos de la routine surface()
Posté : jeu. 19 janv. 2012, 16:38
Je suis moi-même complètement débordé en ce moment... et je suis debout depuis 3h30... donc pas très frais...
Tout cela pour te dire... que pour faire au plus vite pour te dépanner... et retourner à mon propre boulot,
j'ai, sans trop réfléchir à l'optimisation, commencé par reproduire ta vue 2D... puis j'ai bêtement créé chaque triple correspondant (en ajoutant 0) pour les cotations... sans réfléchir à la possibilité d'optimiser pour réduire le code,
et pour te proposer cela en dépannage :
Tout cela pour te dire... que pour faire au plus vite pour te dépanner... et retourner à mon propre boulot,
j'ai, sans trop réfléchir à l'optimisation, commencé par reproduire ta vue 2D... puis j'ai bêtement créé chaque triple correspondant (en ajoutant 0) pour les cotations... sans réfléchir à la possibilité d'optimiser pour réduire le code,
et pour te proposer cela en dépannage :
Code : Tout sélectionner
import three;
import geometry;
size(10cm);
currentprojection=orthographic(-1,-1,1);
//================ by CHELLIER
void cote3D(picture pic=currentpicture,
Label L="", triple A, triple B,
real d=5mm, triple v, bool cc=true,
pen p=currentpen, pen joinpen=dotted,
arrowbar3 arrow=Arrows3)
{
transform3 T=shift(d*unit(v));
triple A=A, B=B;
pic.add(new void(picture f, transform3 t) {
picture opic;
path3 dist;
triple Ap=t*A, Bp=t*B;
triple a=T*Ap, b=T*Bp;
if (cc) {dist=a--b;}
else {dist=b--a;}
draw(opic,L,dist,p,arrow);
draw(opic,a--Ap^^b--Bp,joinpen);
add(f,opic);
}, true);
}
//==========================================
real AO=15,
OH=7,
HC=6,
OC=OH+HC,
AH=sqrt(AO^2-OH^2),
CB=sqrt(AO^2-OC^2),
ep=.8;
point pO=(0,0),
pH=(-OH,0),
pA=(-OH,AH),
pC=(-OC,0),
pB=(-OC,-CB);
triple O=(0,0,0),
H=(-OH,0,0),
A=(-OH,AH,0),
C=(-OC,0,0),
B=(-OC,-CB,0);
circle c=circle(pO,AO);
path p= pO--arc(c,pA,pB,CW)--cycle;
transform3 t=shift(0,0,ep);
draw(extrude(p,ep*Z),lightgray);
draw(surface(path3(p)^^(t*path3(p))),lightgray);
/////////////////
cote3D(Label(format("$%f\,\textrm{cm}$",OH),red),O,H,0Z);
cote3D(Label(format("$%f\,\textrm{cm}$",HC),red),H,C,0Z);
cote3D(Label(format("$%f\,\textrm{cm}$",AO),red),O,A,1Z);
cote3D(Label("$HA$",red),H,A,0Z);
cote3D(Label("$CB$",red),C,B,0Z);