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