Code : Tout sélectionner
unitsize(1cm);
import math;
import geometry;
real r=4;
real aAOE=60;
pair pO=(0,0);
dot(Label("$O$",align=NW),pO);
path cO=circle(pO,r);
draw(cO);
pair pA=rotate(40,pO)*(-r,0);
dot(Label("$A$",align=SW),pA);
pair pF=rotate(aAOE,pO)*pA;
dot(Label("$F$",align=S),pF);
pair pB=rotate(aAOE,pO)*pF;
dot(Label("$B$",align=SE),pB);
pair pE=intersectionpoint(pO--pF,pA--pB);
dot(Label("$E$",align=1.2*SE+0.3*E),pE);
draw(Label("4",align=NW),pO--pA);
draw(pA--pB^^pO--pB);
draw(Label("2",align=SW),pO--pE);
draw(pE--pF);
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(pO--pF,StickMarker(1,2,size=6,angle=-45,DotMark,red));
draw(pA--pB,StickMarker(2,2,size=6,angle=-45,DotMark,red));
perpendicular(pE,SE,pE--pA,blue);
shipout(bbox(xmargin=2mm,invisible));