J'ai essayé et j'ai pas trop l'impression.
Code : Tout sélectionner
nitsize(1cm);
import solids;
import math;
currentprojection=orthographic(-50,100,30);
//Draw right angle (MA,MB) in 3D
void drawrightangle(picture pic=currentpicture,
triple M, triple A, triple B,
real radius,
pen p=currentpen,
pen fillpen=nullpen,
projection P=currentprojection)
{
p=linejoin(0)+linecap(0)+p;
transform3 T=shift(-M);
triple OA=radius/sqrt(2)*unit(T*A),
OB=radius/sqrt(2)*unit(T*B),
OC=OA+OB;
path3 _p=shift(M)*(O--OA--OC--OB--cycle3);
if (fillpen==nullpen)
draw(pic, _p, p=p);
else filldraw(pic, _p, fillpen=fillpen, drawpen=p);
}
real r=4, h=2.5;
real gle=60;
real gleA=20;
transform3 tR=rotate(gle,Z);
transform3 tT=shift((0,0,-h));
triple p0=(0,0,h),
pA=rotate(gleA,Z)*(0,r,h),
pF=tR*pA,
pB=tR*pF,
pD=tT*pA,
pC=tT*pB,
pE=intersectionpoint(p0--pF,pA--pB);
revolution r=cylinder(O,r,h,Z);
fill(pA--pD--pC--pB--cycle3,lightgray+opacity(0.5));
drawrightangle(pE,p0,pB,0.6,fillpen=gray);
dot(Label("$A$",align=NW),pA);
dot(Label("$B$",align=NE),pB);
dot(Label("$C$",align=S),pC);
dot(Label("$D$",align=NW),pD);
dot(Label("$E$",align=S),pE);
dot(Label("$F$",align=S),pF);
dot(Label("$O$",align=N),p0);
dot(Label("$O'$",align=NE),O);
r.draw();
draw(O--p0, dashed);
draw(p0--pB--pF--pA--cycle3^^p0--pF^^pA--pB^^pA--pD);
draw(O--pD--pC--cycle3^^O--p0^^pB--pC, dashed);
typedef void dotmark(picture, pair);
dotmark DotMark(pen p=currentpen)
{
return new void(picture pic, pair pt)
{
dot(pic,pt,p);
};
}
dotmark NoDotMark(pen p=currentpen)
{
return new void(picture pic, pair pt){};
}
dotmark DotMark=DotMark();
dotmark NoDotMark=NoDotMark();
markroutine dirmarkroutine(int n, dotmark dotmark=NoDotMark) {
return new void(picture pic=currentpicture, path g, frame f) {
if(n == 0) return;
else
{
real width=1/n;
for(int i=0; i < n; ++i){
add(pic,
rotate(degrees(dir(g,arctime(g,(i+.5)*width*arclength(g)))))*f,
relpoint(g,(i+.5)*width));
dotmark(pic,relpoint(g,i*width));
}
dotmark(pic,relpoint(g,1));
}
};
}
picture picturemarkmaker(path g, real n=1,
real size=0, real space=0,
real angle=0, real hoffset=0, pen p=currentpen)
{
picture opic;
int pos=0;
for(int i=1; i<=n; ++i)
{
draw (opic,shift((space*(pos-.5*((n+1)%2)),hoffset))*
rotate(angle)*
scale(size/2)*g,p);
pos=pos+i*(-1)^(i+1);
}
return opic;
}
real minstickmarkspace=dotsize(currentpen);
real minstickmarksize=3*dotsize(currentpen);
frame stickpicture(real n=1, real size=0, real space=0,
real angle=0, real hoffset=0, pen p=currentpen)
{
if(size == 0) size=minstickmarksize+2*linewidth(p);
if(space == 0) space=minstickmarkspace+linewidth(p);
return picturemarkmaker(N--S,n,size,space,angle,hoffset,p).fit();
}
marker StickMarker(int n=1, int div=1,
real size=0, real space=0,
real angle=0, real hoffset=0,
dotmark dotmark=NoDotMark(), pen p=currentpen)
{
return marker(stickpicture(n,size,space,angle,hoffset,p),dirmarkroutine(div,dotmark));
}
draw(p0--pF,StickMarker(1,2,size=6,angle=-45,DotMark,red));
shipout(bbox(xmargin=2mm,invisible));