vardef linkpdf@#(expr s,z,pdf,c) =%Sert à mettre des liens entre fichiers PDF
picture p;
p := thelabel@#(s,z);
special "[ /Rect [ " & decimal xpart llcorner p & " " &
decimal ypart llcorner p & " " &
decimal xpart urcorner p & " " &
decimal ypart urcorner p & " ] " &
"/Border [ 0 0 0 ] " &
"/Action /GoToR /File (" & pdf & ") " &
"/Subtype /Link /ANN pdfmark";
draw p withcolor c;
enddef;
def projete(expr p,q,r)=
begingroup
save $;
pair $;
$=whatever[q,r];
($-p) rotated 90 shifted q=whatever[q,r];
$
endgroup
enddef;
def orthocentre(expr p,q,r )=%(sommet-côté opposé)
begingroup
save $;
pair $;
($-p) rotated 90=whatever*(r-q);
($-q) rotated 90=whatever*(p-r);
$
endgroup
enddef;
def milieu(expr p,q)=
begingroup
save $;
pair $;
$=1/2[p,q];
$
endgroup
enddef;
def gravite(expr p,q,r)=%3 sommets
begingroup
save $;
pair $;
$=2/3[p,milieu(q,r)];
$
endgroup
enddef;
def inscrit(expr p,q,r)=%Sommets
begingroup
save $,a,c;
pair $;
numeric a,c;
a=(angle(p-r)-angle(q-r))/2;
c=(angle(r-q)-angle(p-q))/2;
($-r) rotated a shifted r=whatever[p,r];
($-q) rotated c shifted q=whatever[q,r];
$
endgroup
enddef;
def circonscrit(expr p,q,r)=
begingroup
save $;
pair $;
($-1/2[p,q]) rotated 90 shifted p=whatever[p,q];
($-1/2[q,r]) rotated 90 shifted q=whatever[q,r];
$
endgroup
enddef;
def cercle(expr p,q)=%centre-rayon
begingroup
save $;
path $;
$=fullcircle scaled (2*q) shifted p;
$
endgroup
enddef;
vardef droite(expr a,b,n)=%Points-"longueur"
save $;
path $;
$=n[b,a]--n[a,b];
$
enddef;
def demidroite(expr a,b,n)=%points [ab) - "longueur"
begingroup
save $;
path $;
$=a--n[a,b];
$
endgroup
enddef;
def symc(expr p,q)=%point-centre
begingroup
save $;
pair $;
$=2[p,q];
$
endgroup
enddef;
def syma(expr p,q,r)=%point-droite
begingroup
save $;
pair $;
$=symc(p,projete(p,q,r));
$
endgroup
enddef;
def codeang(expr p,q,r,n)=%point-sommet-point(sens direct)-rayon du codage
begingroup
save $,codage,b,c,seg,sege;
picture $;
$=currentpicture;
path codage,seg,sege;%cercle pour le codage
pair b,c;
codage=cercle(q,(2*n));
seg=p--q;
sege=r--q;
numeric d,e;
b=codage intersectionpoint seg;
c=codage intersectionpoint sege;
d=angle(b-q)*((length codage)/360);
e=((length codage)/360)*angle(c-q);
if ((d>0) and (e>0)):
draw subpath(d,e) of codage;
fi
if ((d>0) and (e<0)):
draw subpath(d,(length codage)+e) of codage;
fi
if ((d<0) and (e>0)):
draw subpath((length codage)+d,(length codage)+e) of codage;
fi
if ((d<0) and (e<0)):
draw subpath((length codage)+d,(length codage)+e) of codage;
fi
if e=0 :
if d>0 :
draw subpath(0,d) of codage;
else:
draw subpath(d,0) of codage;
fi;
fi
if d=0 :
if e>0 :
draw subpath(0,e) of codage;
else:
draw subpath(e,0) of codage;
fi;
fi
$
endgroup
enddef;
def para(expr p,q,r,n)=%pt-droite-longueur droite
begingroup
save $;
path $;
$=droite(q,r,n) shifted (p-q);
$
endgroup
enddef;
def codemil(expr p,q,n) =%extrêmités-angle de codage
begingroup
save $,a,b,c,d;
path $;
pair a,b,c,d;
a=milieu(p,q);
b=(a+2*unitvector(q-p))-(a-2*unitvector(q-p));
c=b rotated n shifted a;
d=symc(c,a);
$=c--d;
$
endgroup
enddef;
def codesegments(expr p,q,r,s,n)=%extrémités des segments
begingroup
save $,v,w;
picture $;
$=currentpicture;
if n=5 :
draw fullcircle scaled 0.1cm shifted milieu(p,q);
draw fullcircle scaled 0.1cm shifted milieu(r,s);
fi
if n=4 :
pair v,w;
v=milieu(p,q);
w=milieu(r,s);
draw codemil(p,q,60);
draw codemil(p,q,120);
draw codemil(r,s,60);
draw codemil(r,s,120);
fi;
if n=3 :
draw codemil(p,q,60);
draw codemil(p,q,60) shifted (2*unitvector(p-q));
draw codemil(p,q,60) shifted (2*unitvector(q-p));
draw codemil(r,s,60);
draw codemil(r,s,60) shifted (2*unitvector(r-s));
draw codemil(r,s,60) shifted (2*unitvector(s-r));
fi;
if n=2 :
draw codemil(p,q,60) shifted unitvector(p-q);
draw codemil(p,q,60) shifted unitvector(q-p);
draw codemil(r,s,60) shifted unitvector(r-s);
draw codemil(r,s,60) shifted unitvector(s-r);
fi;
if n=1 :
draw codemil(p,q,60);
draw codemil(r,s,60);
fi;
$
endgroup
enddef;
def mediatrice(expr p,q,n,m,o)=%extrémités-longueur-codage-options
begingroup
save $,d;
picture $;
pair d;
if o=0 :
drawoptions(dashed evenly);
fi
d=milieu(p,q);
$=currentpicture;
draw perp(d,p,q,n);
draw codesegments(p,d,d,q,m);
$
endgroup
enddef;
def segment(expr p,q) =%extrêmité
begingroup
save $,b,c,d;
picture $;
pair b,c,d;
b=3*unitvector(q-p);
c=b rotated 90 shifted p;
d=symc(c,p);
$=currentpicture;
draw p--q;
draw c--d;
draw (c--d) shifted (q-p);
$
endgroup
enddef;
vardef codeperp(expr a,b,c) =
(b+5*unitvector(a-b))--(b+5*unitvector(a-b)+5*unitvector(c-b))--(b+5*unitvector(c-b))
enddef;
vardef per(expr p,q,r,n)=
save $,cc,ce,cd,cf;
path $;
pair cc,ce;
path cd,cf;
cc=(r-q) rotated 90 shifted q;
ce=cc shifted (p-q);
$=droite(ce,p,n);
$
enddef;
vardef perp(expr p,q,r,n)=%point-droite-longueur de la perpendiculaire.
save $,cc,ce,cd,cf;
picture $;
pair cc,ce;
path cd,cf;
$=currentpicture;
cc=(r-q) rotated 90 shifted q;
ce=cc shifted (p-q);
cd=droite(ce,p,n);
draw cd;
cf=droite(q,r,10);
draw codeperp(ce,cf intersectionpoint cd,r);
$
enddef;
def triangl(expr p,q,r)=%3 mesures (+ grande en 1er)
begingroup
save $,a,b,c,cc,cd,lcc,lcd;
picture $;
pair a,b,c;
path cc,cd;
numeric lcc,lcd;
$=currentpicture;
a=(2*unit,2*unit);
b=a shifted (p*unit,0);
cc=cercle(a,q*unit);
cd=cercle(b,r*unit);
c=cc intersectionpoint cd;
draw a--c--b;
draw segment(a,b);
lcc=(angle(c-a))*(length cc)/360;
lcd=(angle(c-b))*(length cd)/360;
draw subpath(0.8*lcc,1.2*lcc) of cc;
draw subpath(0.8*lcd,1.2*lcd) of cd;
$
endgroup
enddef;
def triangle(expr p,q,r)=%longueur(+grande)-angle-longueur à partir du sommet de l'angle.
begingroup
save $,a,b,c,d,cc,cd,lcc;
picture $;
pair a,b,c,d;
path cc,cd;
numeric lcc;
$=currentpicture;
a=(2*unit,2*unit);
b=a shifted (p*unit,0);
draw segment(a,b);
cc=cercle(a,r*unit);
d=b rotated q shifted a;
cd=demidroite(a,d);
draw cd dashed evenly;
c=cd intersectionpoint cc;
draw a--c--b;
lcc=(angle(c-a))*(length cc)/360;
draw subpath(0.8*lcc,1.2*lcc) of cc;
draw codeang(c,a,b,1);
$
endgroup
enddef;
def triangles(expr p,q,r)=%longueur-angle-angle
begingroup
save $,a,b,c,d,e,cc,cd;
picture $;
pair a,b,c,d,e;
path cc,cd;
$=currentpicture;
a=(2*unit,2*unit);
b=a shifted (p*unit,0);
draw segment(a,b);
d=b rotated q shifted a;
e=a rotated (180-angle(a)-r) shifted b;
cc=demidroite(a,d);
cd=demidroite(b,e);
draw cc dashed evenly;
draw cd dashed evenly;
c=cd intersectionpoint cc;
draw codeang(c,b,a,1);
draw a--c--b;
draw codeang(c,a,b,1.5);
draw codeang(c,a,b,2);
$
endgroup
enddef;
def rapporteur(expr p,q)=%segment sur lequel placer le rapporteur (centre du rapporteur en premier)
begingroup;
save $,cc,cd,v,w,t,ww,vv;
picture $;
path cc,cd;
pair a[],b[],v,w,t,ww,vv;
cc=cercle(p,3u);
cd=p--q;
t=cc intersectionpoint cd;
w=t-2*unitvector(q-p);v=symc(w,t);
ww=t-5*unitvector(q-p);vv=symc(ww,t);
for i=0 upto 35 :
for j=1 upto 4 :
a[5*i+j]=(w-p) rotated (-5*i-j) shifted p;
b[5*i+j]=(v-p) rotated (-5*i-j) shifted p;
endfor;
a[5*(i+1)]=(ww-p) rotated (-5*(i+1)) shifted p;
b[5*(i+1)]=(vv-p) rotated (-5*(i+1)) shifted p;
endfor
$=currentpicture;
draw subpath(((length cc)/2)+(angle(p-q)*(length cc))/360,(angle(p-q)*(length cc))/360) of cc;
for i=0 upto 35 :
for j=1 upto 4 :
draw a[5*i+j]--b[5*i+j];
endfor;
draw a[5*(i+1)]--b[5*(i+1)] withpen pencircle scaled 1.25bp;
endfor
$
endgroup;
enddef;
def ekerd(expr q,r,s,t,n)=%droite(q,r)-position sur la droite (point)-sens-"hauteur" de l'équerre
begingroup;
save $,pt,ptt,pttt,eqer,w;
picture $;
pair ptt,pttt,eqer,w;
$=currentpicture;
if t=1 :
ptt=n*(r-q) rotated 90 shifted s;
else :
ptt=n*(r-q) rotated (-90) shifted s;
fi;
w=unitvector(r-q);
pttt=s shifted (50*w);
draw s--ptt--pttt--cycle dashed evenly;draw codeperp(ptt,s,pttt) dashed evenly;
$
endgroup;
enddef;
def ekerf(expr q,r,s,t,n)=%droite(q,r)-position sur la droite (point)-sens-"hauteur" de l'équerre
begingroup;
save $,pt,ptt,pttt,eqer,w;
picture $;
pair ptt,pttt,eqer,w;
$=currentpicture;
if t=1 :
ptt=n*(r-q) rotated 90 shifted s;
else :
ptt=n*(r-q) rotated (-90) shifted s;
fi;
w=unitvector(r-q);
pttt=s shifted (50*w);
draw s--ptt--pttt--cycle;draw codeperp(ptt,s,pttt);
$
endgroup;
enddef;
def regle(expr q,r,s,t)=%droite(p,q)-position-longueur de regle
begingroup;
save $,qt,qtt,qts,qtts,w,ww;
picture $;
pair qt,qtt,qts,qtts,w,ww;
$=currentpicture;
qt=t[r,q];
qtt=t[q,r];
if s=1:
w=((qtt-qt) rotated 90) shifted qt;
ww=unitvector(w-qt);
qts=qt shifted (30*ww);
qtts=qts shifted (qtt-qt);
else:
w=((qtt-qt) rotated (-90)) shifted qt;
ww=unitvector(w-qt);
qts=qt shifted (30*ww);
qtts=qts shifted (qtt-qt);
fi;
draw qt--qts--qtts--qtt--cycle;
$
endgroup;
enddef;
vardef hachure(expr angle,n)=%angle d'hachure-espace
save $;
picture $;
pair hach[];
path premiere;
hach0=(0,0);hach1=(1cm,0);
hach2=hach1 rotated angle;
premiere=200[hach0,hach2]--200[hach2,hach0];
draw premiere;
for i=1 upto 100 :
draw premiere shifted (n*i*hach1);
draw premiere shifted (n*(-i)*hach1);
endfor
$=currentpicture;
$
enddef;
def rectangle(expr p,q,n,m)=%2 pts formant la longueur- largeur - sens de rotation (1 +,-1 -)
begingroup;
save $,r,s,t;
picture $;
pair r,s,t;
t=(p-q) rotated (m*90) shifted q;
r=(n/abs(p-q))[q,t];
s=r shifted (p-q);
draw p--q--r--s--cycle;
draw codeperp(p,q,r);
draw codeperp(q,r,s);
draw codeperp(r,s,p);
$=currentpicture;
$
endgroup;
enddef;
def carre(expr p,q,n,m)=%2points - sens direct ou indirect-nƒ du codage
begingroup;
save $,r,s;
picture $;
pair r,s;
r=(p-q) rotated (n*90) shifted q;
s=r shifted (p-q);
draw p--q--r--s--cycle;
draw codeperp(p,q,r);
draw codeperp(q,r,s);
draw codeperp(r,s,p);
draw codesegments(p,q,q,r,m);
draw codesegments(r,s,s,p,m);
$=currentpicture;
$
endgroup;
enddef;
def compas(expr p,q,n)=%Centre-extrémités-sens
begingroup;
picture $;
pair r,s,t,a,b,c,d,e,f;
if (abs(p-q)<10*u):
r=((q-milieu(p,q)) rotated (n*90)) shifted milieu(p,q);
else:
r=0.25[milieu(p,q),((q-milieu(p,q)) rotated (n*90)) shifted milieu(p,q)];
fi
s=(1+50/abs(p-q))[milieu(p,q),r];
t=10*unitvector(q-p) rotated (n*90);
a=p shifted t;
b=s shifted (5*unitvector(p-q)+10*unitvector(s-r));
c=b shifted (30*unitvector(s-r));
d=c reflectedabout(r,s);
e=b reflectedabout(r,s);
f=a reflectedabout(r,s);
path comp;
comp=a--b--c--d--e--f--s--a--cycle;
fill comp withcolor black;
draw p--a withpen pencircle scaled 1.5bp;
draw f--q withpen pencircle scaled 1.5bp withcolor 0.25[red,blue];
$=currentpicture;
$
endgroup;
enddef;
def circulaire(expr centre,rayon,n)=%nombre de valeurs
begingroup;
save $,cc,camembert,lcc;
picture $;
numeric cumule[],lcc[];
path camembert[],cc;
cumule0=0;
for vue=1 upto n:
cumule[vue]=cumule[vue-1]+effectif[vue];
endfor
cc=cercle(centre,rayon);
for vue=1 upto n:
camembert[vue]=centre--(point((cumule[vue-1]/cumule[n])*length cc) of cc)--(subpath((cumule[vue-1]/cumule[n])*length cc,(cumule[vue]/cumule[n])*length cc) of cc)--cycle;
fill camembert[vue] withcolor (vue/n)[red,blue];
draw camembert[vue];
endfor
$=currentpicture;
$
endgroup;
enddef;
endinput
|