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);