% affectation de z.N par les coordonnées (x,y) et labelisation par "N" dans % la position pos def position(suffix pos)= if str pos="n" : top elseif str pos="s" :bot elseif str pos="o" :lft elseif str pos="e" :rt elseif str pos="se" :lrt elseif str pos="so" :llft elseif str pos="ne" :urt elseif str pos="no" :ulft fi enddef; % affectation de z.N par l'affixe (a,b) et labelisation par "N" dans la % position pos vardef coord@#(expr a,b) text pos = z@#=u*(a,b); dotlabel.position(pos)( str @#,z@#); enddef; % affectation de z.N par l'affixe a et labelisation par "N" dans la % position pos vardef affixe@#(expr a) text pos = z@#=a; if str pos<>"": label.position(pos)( str @#,z@#) fi enddef; % affixe du milieu de deux points vardef mil@# (suffix A,B ) text pos=affixe.@#(0.5[z.A,z.B]) pos enddef; % dessin d'un segment vardef seg(suffix A,B) suffix coul = draw z.A--z.B if str coul<>"" : withcolor coul fi; enddef; % distance AB en unités ( u fixé au cm en pincipe) vardef dist(suffix A,B ) = abs(z.A-z.B)/u enddef; % arc de cercle centre, rayon en unité (u = 1 cm en pricipe ?), % départ, arrivée vardef cercle@#(suffix C)( expr r)( suffix d,f) suffix co = numeric de, fin, lo ; if str d="" : de=0 else : de=d fi; if str f="" : fin=360 else : fin=f fi; if fin-de<0 : lo=360+fin-de else : lo=fin-de fi; Ce@#=(subpath(0, lo*length(fullcircle)/360) of fullcircle) scaled (2*r*u) rotated de shifted z.C; draw Ce@# withcolor if str co ="" : noir else :co fi; enddef; % point particulier sur arc de cercle vardef point_arc(expr cercle,position) = point (arctime ((position/360)*arclength cercle) of cercle) of cercle enddef; % rotation autour de c et d'angle a vardef rotation@#(suffix C,a,X) text m = affixe.@#(z.X shifted -z.C rotated a shifted z.C) m enddef; % projection othogonale de A sur (BC) vardef projh@#(suffix A,B,C) text m = pair pr; pr=whatever[z.A+(z.B-z.C)rotated 90,z.A]=whatever[z.C,z.B]; affixe.@#(pr)m enddef; % symétrique par rapport à un axe vardef syma@#(suffix A,B,C) text m = pair pr; pr=whatever[z.C+(z.A-z.B)rotated 90,z.C]=whatever[z.A,z.B]; affixe.@#(2[z.C,pr]) m enddef; % symétrique par rapport à un point vardef symc@#(suffix A,C) text m = affixe.@#(2[z.C,z.A]) m enddef; % mediatrice vardef mediatrice@#( suffix A, B ,lA,lB,coul, nb) = pair m[] ,n[] ,p[]; m@#:=0.5[A,B]; %milieu su segment AB n@#:=lA*unitvector(A-B) rotated 90 shifted m@#; % m[i] est un 1er point de la % médiatrice en retour p@#:=lB*unitvector( B-A) rotated 90 shifted m@#;% n[i] est un autre point de % la médiatrice en retour draw n@#--p@# withcolor coul; trait(m@#--A,nb,coul);trait(m@#--B,nb,coul); angle_droit(A,m@#,n@#,2mm ); enddef; % appel du marquage n fois avec la couleur c et angle 60 vardef trait(suffix A,B, n ,c) suffix co = color coul; save m ; pair m ; if str co <>"" : seg(A,B)co fi ; if str c="" : coul=rouge else : coul=c fi; for i:= -(n-1)/2 upto (n-1)/2 : m=taille_marque*(unitvector(z.A-z.B) rotated 60) ; draw (-m--m) shifted 0.5(i*taille_marque*unitvector(z.A-z.B)+z.A+z.B) withcolor coul; endfor; enddef; % marquage en son milieu par un rond de couleur c et rayon taille_marque vardef rond(suffix A,B,c) suffix cl = path pa; pa=z.A--z.B; color coul; if str cl <>"" : seg(A,B)cl fi ; if str c="" : coul=rouge else : coul=c fi; draw fullcircle scaled taille_marque shifted (0.5*(z.A+z.B)) withcolor coul; enddef; % marquage 2 fois avec la couleur c et angle 45 et -45 vardef croix(suffix A,B ,c ) suffix co = color coul; save m ; pair m ; if str co<>"" : seg(A,B)co fi ; if str c="" : coul=rouge else : coul=c fi; m=taille_marque*unitvector(z.A-z.B); draw (-m--m) rotated -45 shifted (0.5*(z.A+z.B)) withcolor coul; draw (-m--m) rotated 45 shifted (0.5*(z.A+z.B)) withcolor coul; enddef; % marquage de l'angle orienté abc n fois avec un des rayons 3mm,4mm,5mm,..etc % et de couleur co % sens=-1 -->flèche rétrograde % sens= 0 --> aucune pointe de flèche % sens=1 -->flèche normale def marque_angle(expr a,b,c,nb,co,sens)= begingroup save i,s,p ; path p; pickup pencircle scaled 0.25bp; p= (unitvector(a-b)scaled rayon_angle){(a-b)rotated 90} ..{(c-b)rotated 90}(unitvector(c-b) scaled rayon_angle); if sens=0 : for i:= 1 upto nb : draw p scaled (1+0.25i) shifted b withcolor rouge; endfor elseif sens=1 : for i:= 1 upto nb : drawarrow p scaled (1+0.25i) shifted b withcolor co ; endfor else : for i:= 1 upto nb : drawarrow reverse p scaled (1+0.25i) shifted b withcolor co ; endfor fi; endgroup enddef; % milieu d'un chemin pacouru à vitesse uniforme def milieu(expr p)=if path p : point (0.5*arclength p ) of p else : .5(llcorner a + urcorner a) fi enddef; % marquage de l'angle droit abc def angle_droit(suffix A,B,t) suffix coul = draw ((1,0)--(1,1)--(0,1)) zscaled (t* unitvector(z.A-z.B) ) shifted z.B if str coul<>"" :withcolor coul else : withcolor rouge fi; enddef; % mes constantes defaultfont:="cmmi8"; path Ce[] ,Tr[] ,Cb[]; numeric u,taille_marque,rayon_angle; taille_marque=1mm; rayon_angle=6mm; u=1cm; c:=57.29578; % conversion d'un radian en degrés pair i ; i=(0,1);z0=(0,0); color rouge,vert,bleu,jaune,noir,blanc,orange,rose,violet,ciel,orangevif; rouge=(1,0,0); bleu=(0,0,1); noir=(0,0,0); blanc=(1,1,1); orange=(1, 0.5, 0); violet=(0.9, 0.1, 0.9); rose=(1,0.7,0.7); ciel=0.9*(0.25,1,1); orangevif=(1,0.25,0.1); vert=(1,1,1)-violet; jaune= (0.9,0.9,0.2); beginfig(1) ; % O d'affixe z0 centre du cercle principal coord.O(0,0)no; cercle1(O)(6)()(); %diamète AB o=0;% angle de la rotation de centre O appliquée au pentagone affixe.A(point_arc(Ce1,o))e; symc.B(O,A)o; seg(A,B) bleu; %diamètre CD perpendiculaire à AB rotation.C(O,90,A)n; symc.D(O,C)s; seg(C,D) bleu; angle_droit( D,O,4mm) ; %milieu de OC mil.E(O,C) se; trait(O,E,2,);trait(E,C,2,); %cercle de cente E pasant par O cercle2(E)(dist(E,O))()()vert; %droite (BI) z.F=1.5[z.B,z.E]; draw z.B--z.F withcolor bleu; %point d'intesection du cercle Ce1 et de la droite (BI) affixe.H(Ce2 intersectionpoint (z.E--z.F))o; affixe.J(Ce2 intersectionpoint (z.E--z.B))n; %arc de cercle de centre B passant pa H et J o1=-45+o ; e1=45+o; o2=-85+o;e2=85+o; cercle3(B)(dist(H,B))(o1)(e1)violet; cercle4(B)(dist(J,B))(o2)(e2)violet; %intersection de ces arcs de cercle avec le cercle Ce1 affixe.P(Ce1 intersectionpoint Ce3) ne; syma.Q(A,O,P)se ; affixe.M(Ce1 intersectionpoint Ce4) n; syma.N(A,O,M) s; %tracé du pentagone régulier croix(A,P, )rouge ; croix(P,M, )rouge ; croix(M,N, )rouge ; croix(N,Q, )rouge ; croix(Q,A, )rouge; endfig; end