% 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
|