Code : Tout sélectionner
import geometry;
usepackage("fourier");
usepackage("amsmath");
unitsize(1cm);
void grille(int xmin, int xmax, int ymin ,int ymax){
for(int k=ymin; k<=ymax; ++k)
draw((xmin,k)--(xmax,k),.4bp+gray);
for(int k=xmin; k<=xmax; ++k)
draw((k,ymin)--(k,ymax),.4bp+gray);
draw((xmin,0)--(xmax,0),1pt+black);
draw((0,ymin)--(0,ymax),1pt+black);
}
void rapporteur(real scale=1, point pO=(0,0), real a=0){
defaultpen(fontsize(12pt*scale)); // Stylo par défaut
real r=3.5*scale; // rayon du demi-cercle intérieur
real l=2.5*scale; // largeur du rapporteur
real p=l/10*scale; // largeur des petites graduations
real g=2p; // largeur des grandes graduations
transform t=rotate(a,pO);
point pA=t*shift(r,0)*pO;
line droiteregle=t*line(0,pO.y-l);
circle cercleint = circle(pO,r),
cercleext = circle(pO,r+l);
point[] R=intersectionpoints(droiteregle,cercleext);
path chint=arc(cercleint,pA,rotate(180,pO)*pA)--cycle,
chext1=arc(cercleext,R[1],R[0])--cycle,
chext2=arc(cercleext,R[0],R[1])--cycle;
if(a>=0 && a<=180){
filldraw(chint^^chext1,paleblue+white+evenodd,0.5bp+black);}
else {filldraw(chint^^chext2,paleblue+white+evenodd,0.5bp+black);}
for(int k=0; k<180; ++k){//graduation au 1/10 des 2 cercles
draw(t*(r*dir(k)+pO--(r+p)*dir(k)+pO)^^t*((r+l-p)*dir(k)+pO--(r+l)*dir(k)+pO),0.25bp+black);
}
for(int k=0; k<36; ++k){//graduation au 1/5 des 2 cercles
draw(t*(r*dir(5*k)+pO--(r+0.75g)*dir(5*k)+pO)^^t*((r+l-0.75g)*dir(5*k)+pO--(r+l)*dir(5*k)+pO),
0.4bp+black);
}
for(int k=0; k<=18; ++k) {//graduations de 10 en 10 des 2 cercles
path ta = t*(r*dir(10k)+pO--(r+g)*dir(10k)+pO);
path tb = t*((r+l)*dir(10k)+pO--(r+l-g)*dir(10k)+pO);
draw(ta^^tb,0.4bp+black);
label(t*rotate(10k-90)*format("%i",10*k),t*((r+g)*dir(10k)+pO),dir(ta));
label(t*rotate(10k-90)*format("%i",180-10*k),t*((r+l-g)*dir(10k)+pO),dir(tb));
}
int xmax=5;
for(int x=0; x<10*xmax; ++x){//graduation au 1/10 de la règle
draw(t*((-x/10,-l)+pO--(-x/10,p-l)+pO)^^t*((x/10,-l)+pO--(x/10,p-l)+pO),0.25bp+black);
}
for(int x=0; x<=xmax; ++x) {//graduations de la règle
path ta = t*((-x,-l)+pO--(-x,g-l)+pO);
path tb = t*((x,-l)+pO--(x,g-l)+pO);
draw(ta^^tb,0.4bp+black);
label(t*format("%i",-x),t*((-x,g-l)+pO),dir(ta));
label(t*format("%i",x),t*((x,g-l)+pO),dir(tb));
}
}
grille(-8,6,-7,7);
rapporteur(pO=(0,0),a=65);