Retour

Source : penta.mp

penta.mp
% 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); 
 
 
 
 
penta.mp (figure 1)
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