%=============================================== %% PfC-Geometrie %% christophe.poulain@melusine.eu.org %%=============================================== %------------------------------------------------ % Appel fichier %------------------------------------------------ %input PfC-Constantes; %------------------------------------------------ % La figure (debut et fin) JMS/CP %------------------------------------------------ path feuillet; numeric _tfig,_nfig; _tfig:=5cm; _nfig:=0; pair coinbg,coinbd,coinhd,coinhg; string typetrace; typetrace="normal"; def feuille(expr xa,ya,xb,yb) = feuillet := (xa,ya)--(xa,yb)--(xb,yb)--(xb,ya)--cycle; coinbg := (xa,ya); coinbd := (xb,ya); coinhd := (xb,yb); coinhg := (xa,yb); %modifie le 29.09.04 z.so=(xpart(coinbg/1cm),ypart(coinbg/1cm)); z.ne=(xpart(coinhd/1cm),ypart(coinhd/1cm)); %fin modification extra_endfig := "clip currentpicture to feuillet;" & extra_endfig; enddef; def Figure(expr xa,ya,xb,yb) = feuille(xa,ya,xb,yb); _tfig:= if (xb-xa)>(yb-ya): xb-xa else: yb-ya fi; _tfig:=2*_tfig; enddef; %%----------------------------------------------- %% Les marques (JMS) %%----------------------------------------------- string marque_p; marque_p := "non"; marque_r := 20; marque_a := 20; marque_s := 5; marque_ang := 10; m_c := 10 ;%Pour la croix du marquage des points %------------------------------------------------ % Les tables %------------------------------------------------ numeric _tn; _tn:=0; pair _t[]; color _T[]; %%----------------------------------------------- %% Procedures d'affichage %%----------------------------------------------- def MarquePoint(expr p)= if typetrace="3D": %JMS if marque_p = "plein": fill fullcircle scaled (marque_r/5) shifted Projette(p); elseif marque_p = "creux": fill fullcircle scaled (marque_r/5) shifted (Projette(p)) withcolor white; draw fullcircle scaled (marque_r/5) shifted (Projette(p)); %fin JMS elseif marque_p = "croix": draw (Projette(p) shifted (-u/10,u/10))--(Projette(p) shifted (u/10,-u/10)); draw (Projette(p) shifted (-u/10,-u/10))--(Projette(p) shifted (u/10,u/10)); elseif marque_p = "tiretv": draw (Projette(p) shifted (0,u/10))--(Projette(p) shifted(0,-u/10)); elseif marque_p = "tireth": draw (Projette(p) shifted (u/10,0))--(Projette(p) shifted(-u/10,0)); fi; else: if marque_p = "plein": fill fullcircle scaled (marque_r/5) shifted p; elseif marque_p = "creux": fill fullcircle scaled (marque_r/5) shifted p withcolor white; draw fullcircle scaled (marque_r/5) shifted p; elseif marque_p = "croix": draw (p shifted (-u/m_c,u/m_c))--(p shifted (u/m_c,-u/m_c)); draw (p shifted (-u/m_c,-u/m_c))--(p shifted (u/m_c,u/m_c)); elseif marque_p = "tiretv": draw (p shifted (0,u/10))--(p shifted(0,-u/10)); elseif marque_p = "tireth": draw (p shifted (u/10,0))--(p shifted(-u/10,0)); fi; fi; enddef; vardef pointe(text t) = for p_ = t: if (pair p_) or (color p_): MarquePoint(p_); fi endfor; enddef; %------------------------------------------------ % Points %------------------------------------------------ %JMS vardef iso(text t) = save s,n; numeric n; if typetrace="3D": color s; s := (0,0,0) ; n := 0; for p_ = t: s := s + p_; n := n + 1 ; endfor; else: pair s; s := (0,0) ; n := 0; for p_ = t: s := s + p_; n := n + 1 ; endfor; fi; if n>0: (1/n)*s fi enddef; vardef milieu(expr AA,BB)= save $; pair $; if typetrace="mainlevee": $=point((length segment(AA,BB))*(1/2+(-1+uniformdeviate(2))/10)) of segment(AA,BB) else: $=iso(AA,BB) fi; $ enddef; vardef CentreCercleC(expr a, b ,c) = save o; pair o; o - .5[a,b] = whatever * (b-a) rotated 90; o - .5[b,c] = whatever * (c-b) rotated 90; o enddef; vardef Orthocentre(expr a, b, c) = save h; pair h; h - a = whatever * (c-b) rotated 90; h - b = whatever * (a-c) rotated 90; h enddef; vardef CentreCercleI(expr aa,bb,cc)= save $,a,c; pair $; numeric a,c; a=(angle(aa-cc)-angle(bb-cc))/2; c=(angle(cc-bb)-angle(aa-bb))/2; ($-cc) rotated a shifted cc=whatever[aa,cc]; ($-bb) rotated c shifted bb=whatever[bb,cc]; $ enddef; %------------------------------------------------ % Cercles %------------------------------------------------ %Cercle connaissant le centre A et le rayon q vardef cercle(expr aa, q)=fullcircle scaled (2*q) shifted aa enddef; %Cercle de centre A et passant par B vardef cerclepoint(expr aa,bb)=fullcircle scaled (2*abs(aa-bb)) shifted aa enddef; %Cercle connaissant le diametre [AB] vardef cercledia(expr aa,bb)=cercles(iso(aa,bb),bb) %fullcircle scaled (2*abs(1/2[aa,bb]-bb)) shifted (1/2[aa,bb]) enddef; %Cercles complets vardef cercles(text t)= save Cer; save n; n:=0; for p_=t: if pair p_: n:=n+1; _t[n]:=p_; fi if numeric p_: rayon:=p_; fi; if color p_: n:=n+1; _T[n]:=p_; fi; endfor; if typetrace="3D":%centre aa passant par bb dans le plan (ccddee) généralement aa=cc path Cer; color ptcer[]; for k=0 step 5 until 360 : ptcer[k div 5]-_T[1]=Distance(_T[1],_T[2])*((_T[4]-_T[3])*cosd(k)/Distance(_T[3],_T[4])+(_T[5]-_T[3])*sind(k)/Distance(_T[3],_T[5])); endfor; Cer=Projette(ptcer0) for k=0 step 5 until 360 : ..Projette(ptcer[k div 5]) endfor ..cycle; else: path Cer; if n=1 : Cer=fullcircle scaled (2*rayon) shifted _t[1]; elseif n=2 : Cer=fullcircle scaled (2*abs(_t[1]-_t[2])) shifted _t[1]; elseif n=3 : Cer=cercles(CentreCercleC(_t[1],_t[2],_t[3]),_t[1]); fi fi Cer enddef; %Point particulier sur le cercle vardef pointarc(expr cercla,angle)= point(arctime((angle/360)*arclength cercla) of cercla) of cercla enddef; %Arc de cercle AB de centre 0(dans le sens direct) : les points A et B doivent etre sur le cercle. vardef arccercle(expr aa,bb,oo)= path tempo; path arc; tempo=fullcircle scaled (2*abs(aa-oo)) shifted oo; if (angle(aa-oo)=0) or (angle(aa-oo)>0) : if (angle(bb-oo)=0) or (angle(bb-oo)>0): if (angle(aa-oo)0): arc=subpath(length tempo+angle(aa-oo)*(length tempo)/360,length tempo+angle(bb-oo)*(length tempo)/360) of tempo; elseif (angle(bb-oo)<0): if (angle(aa-oo)=angle(bb-oo)) or (angle(aa-oo)(-1,-1): draw support shifted (ecart*j*(u,0)); fi endfor; ); clip $ to chemin; drawoptions(); $ enddef; vardef Hachurage(expr Chemin, Angle, Ecart, Trace)= %Avec écart constant quel que soit l'angle d'inclinaison. save $; picture $; if Trace=0: drawoptions(); elseif Trace=1: drawoptions(dashed evenly); elseif Trace=2: drawoptions(dashed dashpattern(on12bp off6bp on3bp off6bp)); elseif Trace=3: drawoptions(dashed withdots); fi; path support; support=(u*(-50,0)--u*(50,0)) rotated Angle; $ = image( for j=-200 upto 200: if (support shifted (Ecart*j*u*(cosd(90-Angle),-sind(90-Angle)))) intersectiontimes Chemin<>(-1,-1): draw support shifted (Ecart*j*u*(cosd(90-Angle),-sind(90-Angle)));%));%(cosd(Angle),sind(Angle))); fi endfor; ); clip $ to Chemin; drawoptions(); $ enddef; %fleche pour coter un segment [AB] (Jacques Marot) vardef cotation(expr aa,bb,ecart,decalage,cote)= pair m[] ; save $; picture $; m3=unitvector(bb-aa) rotated 90; m1=aa+ecart*m3; m2=bb+ecart*m3; $=image( pickup pencircle scaled 0.2bp; drawdblarrow m1--m2 ; draw aa--m1 dashed evenly; draw bb--m2 dashed evenly; label(cote rotated angle(m2-m1),(m1+m2)/2+decalage*m3); ); $ enddef; vardef appelation(expr aa,bb,decalage,cote)= save $; pair m[],AA,BB; if color aa: AA=Projette(aa); else: AA=aa; fi; if color bb: BB=Projette(bb); else: BB=bb; fi; m3=unitvector(BB-AA) rotated 90; picture $; $=image( label(cote rotated angle(BB-AA),(BB+AA)/2+decalage*m3); ); $ enddef; vardef cotationmil(expr aa,bb,ecart,decalage,cote)= %Christophe pair m[],AA,BB; save $; picture cot; if color aa: AA=Projette(aa) else: AA=aa fi; if color bb: BB=Projette(bb) else: BB=bb fi; m3=unitvector(BB-AA) rotated 90; m1=AA+ecart*m3; m2=BB+ecart*m3; cot=image( pickup pencircle scaled 0.2bp; drawarrow (1/2[m1,m2]+decalage*unitvector(m1-m2))--m1; drawarrow (1/2[m1,m2]-decalage*unitvector(m1-m2))--m2; draw AA--m1 dashed evenly; draw BB--m2 dashed evenly; label(cote rotated angle(m2-m1),(m1+m2)/2); ); cot enddef; vardef cotationarc(expr aaa,bbb,decal,ecart,sens,texte)=%pour le texte sens=1 ou -1 save ty; picture ty; pair mnp,ctr; mnp=iso(aaa,bbb)+decal*unitvector(rotation(bbb,iso(aaa,bbb),90)-iso(aaa,bbb)); ctr=CentreCercleC(aaa,bbb,mnp); path cts[]; cts0=arccercle(bbb,aaa,ctr); cts1=arccercle(bbb,cts0 intersectionpoint perpendiculaire(aaa,bbb,iso(aaa,bbb)),ctr); cts2=arccercle(cts0 intersectionpoint perpendiculaire(aaa,bbb,iso(aaa,bbb)),aaa,ctr); ty=image( trace subpath(0,arctime(arclength cts1*(1-(ecart/10))) of cts1) of cts1 dashed evenly; trace subpath(0,arctime(arclength cts2*(1-(ecart/10))) of reverse(cts2)) of reverse(cts2) dashed evenly; if sens=1: label(texte rotated (angle(bbb-aaa)),mnp); else: label(texte rotated (angle(bbb-aaa)+180),mnp); fi; ); ty enddef; %%%%%%%%%% %francisation %%%%%%%%% def trace expr o = if path o: draw o else: draw o fi enddef; def remplis expr o = if path o: fill o else: fill o fi enddef; %3D - basé sur donymodule color Sommet[]; color Co[]; Co0=jaune; Co1=violet; Co2=orange; Co3=ciel; Co4=vert; Co5=bleu; Co6=rouge; string pointilles; string typerepre; typerepre:="proj"; %generalite vardef Projette(expr X)= pair $; Xobs := -redpart(X)*Aux1 + greenpart(X)*Aux3; Yobs := -redpart(X)*Aux5 - greenpart(X)*Aux6 + bluepart(X)*Aux4; if typerepre="proj": Zobs := -redpart(X)*Aux7 - greenpart(X)*Aux8 - bluepart(X)*Aux2 + Rho; XProj := DE*Xobs/Zobs; YProj := DE*Yobs/Zobs; elseif typerepre="persp": XProj := DE*Xobs; YProj := DE*Yobs; fi; $=(XProj,YProj); $ enddef; vardef Initialisation(expr r,t,p,d)= Rho:=r; Theta:=t; Phi:=p; DE:=d; Aux1:=sind(Theta); Aux2:=sind(Phi); Aux3:=cosd(Theta); Aux4:=cosd(Phi); Aux5:=Aux3*Aux2; Aux6:=Aux1*Aux2; Aux7:=Aux3*Aux4; Aux8:=Aux1*Aux4; pointilles:="oui"; enddef; %vues cachees vardef Face(text t)= j:=0; for p_=t : if numeric p_: a[j]:=p_; j:=j+1; fi; endfor; for k=1 upto (j-1): Fc[a0*100+(k-1)]:=a[k]; endfor; enddef; vardef Oeil=(Rho*Aux7,Rho*Aux8,Rho*Aux2) enddef; vardef Vision(expr num)= save bb; color bb; bb=(redpart(Oeil-Sommet[num]),greenpart(Oeil-Sommet[num]),bluepart(Oeil-Sommet[num])); bb enddef; vardef Normal(expr vecun,vecde,vectr)= save aa; color aa; P1:=redpart(vecde-vecun); P2:=greenpart(vecde-vecun); P3:=bluepart(vecde-vecun); Q1:=redpart(vectr-vecun); Q2:=greenpart(vectr-vecun); Q3:=bluepart(vectr-vecun); aa=(P2*Q3-Q2*P3,P3*Q1-Q3*P1,P1*Q2-Q1*P2); aa enddef; vardef ProduitScalaire(expr wec,mor)= redpart(wec)*redpart(mor)+greenpart(wec)*greenpart(mor)+bluepart(wec)*bluepart(mor) enddef; vardef Distance(expr aa,bb)=%Entre deux points sqrt((redpart(bb)-redpart(aa))*(redpart(bb)-redpart(aa))+(greenpart(bb)-greenpart(aa))*(greenpart(bb)-greenpart(aa))+(bluepart(bb)-bluepart(aa))*(bluepart(bb)-bluepart(aa))) enddef; vardef Module(expr aa)=%module d'un vecteur sqrt((redpart(aa))**2+(greenpart(aa))**2+(bluepart(aa)**2)) enddef; color CoulTrace; CoulTrace=black; vardef DessineObjet= for l=1 upto NF: color cc,dd; dd=Vision(Fc[l*100+1]); cc=Normal(Sommet[Fc[l*100+1]],Sommet[Fc[l*100+2]],Sommet[Fc[l*100+3]]); if (ProduitScalaire(dd,cc)<0): if pointilles="oui": drawoptions(dashed dashpattern(on3pt off6pt) withcolor CoulTrace); trace for k=1 upto Fc[100*l]: Projette(Sommet[Fc[100*l+k]])-- endfor cycle; fi; else: trace for k=1 upto Fc[100*l]: Projette(Sommet[Fc[100*l+k]])-- endfor cycle withcolor CoulTrace; fi; drawoptions(); endfor; enddef; %%Transformations %Translations vardef TranslateSommets(expr v)= for k=1 upto NbS: Sommet[k]:=Sommet[k]+v; endfor; enddef; vardef SymetriePlanZ(expr vv)= for k=1 upto NbS: w:=vv-bluepart(Sommet[k]); Sommet[k]:=(redpart(Sommet[k]),greenpart(Sommet[k]),w); endfor; enddef; vardef IntersectionDroite(expr aa,bb,cc,dd)= save tt; color tt; tt=whatever[aa,bb]; tt=whatever[cc,dd]; tt enddef; %%denis Roegel---------- vardef Intersectionplandroite(expr aa,bb,cc,dd,ee)= save int; boolean int; color gg,caaa[]; caaa3=Normal(aa,bb,cc)/Module(Normal(aa,bb,cc)); caaa1=aa-dd; caaa2=ee-dd; if ProduitScalaire(caaa2,caaa3)<>0: caaa4=caaa2*(ProduitScalaire(caaa1,caaa3)/ProduitScalaire(caaa2,caaa3)); int:=true; else: % the line is parallel to the plane int:=false; fi; int enddef; vardef IntersectionPlanDroite(expr aa,bb,cc,dd,ee)=%plan (aa,bb,cc) droite(dd,ee) if Intersectionplandroite(aa,bb,cc,dd,ee): gg=dd+caaa4; fi; gg enddef; vardef ProjectionsurPlan(expr aa,bb,cc,dd)=%Projection du point aa sur le plan (bbccdd) save di,vc; color va,vb,vc; va=Normal(bb,cc,dd)/Module(Normal(bb,cc,dd)); vb=aa-bb; di=-ProduitScalaire(vb,va); va:=di*va; vb:=vb+va; vc=bb+vb; vc enddef; vardef Intersectionplanplan(expr AA,BB,CC,DD,EE,FF)=%besoin pour la suite color trial[]; path INTer; if Intersectionplandroite(DD,EE,FF,AA,BB): trial1=IntersectionPlanDroite(DD,EE,FF,AA,BB); else:% there is no intersection or the intersection is the line trial1=IntersectionPlanDroite(DD,EE,FF,AA,1/2[BB,CC]); fi; if Intersectionplandroite(DD,EE,FF,AA,CC): trial2=IntersectionPlanDroite(DD,EE,FF,AA,CC); else:% there is no intersection or the intersection is the line trial2=IntersectionPlanDroite(DD,EE,FF,CC,1/2[BB,AA]);%modif de cp fi; %INTer=segment(10[trial1,trial2],10[trial2,trial1]); INTer=droite(trial1,trial2); INTer enddef; vardef IntersectionPlanPlan(expr aa,bb,cc,dd,ee,ff)= %a verifier save da,db,dc,int,INTER; boolean int; path INTER; da=Module(aa-ProjectionsurPlan(aa,dd,ee,ff)); %show da; db=Module(bb-ProjectionsurPlan(bb,dd,ee,ff)); %show db; dc=Module(cc-ProjectionsurPlan(cc,dd,ee,ff)); %show dc; if (da=db) and (db=dc): % the two planes are parallel int:=false; else: int:=true; if (da=db): INTER=droite(aa,bb); elseif (db=dc): INTER=droite(bb,cc); elseif (dc=da): INTER=droite(cc,aa); elseif (da>=db) and (da>=dc): INTER=Intersectionplanplan(aa,bb,cc,dd,ee,ff); elseif (db>=da) and (db>=dc): INTER=Intersectionplanplan(bb,cc,aa,dd,ee,ff); elseif (dc>=da) and (dc>=db): INTER=Intersectionplanplan(cc,aa,bb,dd,ee,ff); fi; fi; INTER enddef; %%--------------------- %Cube numeric arete; arete=1; vardef Cube(text t)= picture cub; cub=image( NbS:=8; Sommet1:=(arete,0,0); Sommet2:=(arete,arete,0); Sommet3:=(0,arete,0); Sommet4:=(0,0,0); Sommet5:=(0,0,arete); Sommet6:=(arete,0,arete); Sommet7:=(arete,arete,arete); Sommet8:=(0,arete,arete); %%Faces NF:=6; Fc[100]:=4;Fc[101]:=1;Fc[102]:=4;Fc[103]:=3;Fc[104]:=2; Fc[200]:=4;Fc[201]:=4;Fc[202]:=5;Fc[203]:=8;Fc[204]:=3; Fc[300]:=4;Fc[301]:=1;Fc[302]:=6;Fc[303]:=5;Fc[304]:=4; Fc[400]:=4;Fc[401]:=5;Fc[402]:=6;Fc[403]:=7;Fc[404]:=8; Fc[500]:=4;Fc[501]:=2;Fc[502]:=3;Fc[503]:=8;Fc[504]:=7; Fc[600]:=4;Fc[601]:=1;Fc[602]:=2;Fc[603]:=7;Fc[604]:=6; DessineObjet; k:=1; for p_=t: if color p_: p_=Sommet[k]; k:=k+1; fi endfor; ); cub enddef; vardef cube= typetrace:="3D"; typerepre:="persp"; Initialisation(1500,30,20,100); picture cub; cub=image( NbS:=8; Sommet1:=(arete,0,0); Sommet2:=(arete,arete,0); Sommet3:=(0,arete,0); Sommet4:=(0,0,0); Sommet5:=(0,0,arete); Sommet6:=(arete,0,arete); Sommet7:=(arete,arete,arete); Sommet8:=(0,arete,arete); %%Faces NF:=6; Fc[100]:=4;Fc[101]:=1;Fc[102]:=4;Fc[103]:=3;Fc[104]:=2; Fc[200]:=4;Fc[201]:=4;Fc[202]:=5;Fc[203]:=8;Fc[204]:=3; Fc[300]:=4;Fc[301]:=1;Fc[302]:=6;Fc[303]:=5;Fc[304]:=4; Fc[400]:=4;Fc[401]:=5;Fc[402]:=6;Fc[403]:=7;Fc[404]:=8; Fc[500]:=4;Fc[501]:=2;Fc[502]:=3;Fc[503]:=8;Fc[504]:=7; Fc[600]:=4;Fc[601]:=1;Fc[602]:=2;Fc[603]:=7;Fc[604]:=6; DessineObjet; ); cub enddef; %Cube vardef Paveh(text t)= picture paveh; paveh=image( NbS:=8; Sommet1:=(0.75,0,0); Sommet2:=(0.75,1.5,0); Sommet3:=(0,1.5,0); Sommet4:=(0,0,0); Sommet5:=(0,0,1); Sommet6:=(0.75,0,1); Sommet7:=(0.75,1.5,1); Sommet8:=(0,1.5,1); %%Faces NF:=6; Fc[100]:=4;Fc[101]:=1;Fc[102]:=4;Fc[103]:=3;Fc[104]:=2; Fc[200]:=4;Fc[201]:=4;Fc[202]:=5;Fc[203]:=8;Fc[204]:=3; Fc[300]:=4;Fc[301]:=1;Fc[302]:=6;Fc[303]:=5;Fc[304]:=4; Fc[400]:=4;Fc[401]:=5;Fc[402]:=6;Fc[403]:=7;Fc[404]:=8; Fc[500]:=4;Fc[501]:=2;Fc[502]:=3;Fc[503]:=8;Fc[504]:=7; Fc[600]:=4;Fc[601]:=1;Fc[602]:=2;Fc[603]:=7;Fc[604]:=6; DessineObjet; k:=1; for p_=t: if color p_: p_=Sommet[k]; k:=k+1; fi endfor; ); paveh enddef; %Cube vardef Pavev(text t)= picture pavev; pavev=image( NbS:=8; Sommet1:=(1,0,0); Sommet2:=(1,0.75,0); Sommet3:=(0,0.75,0); Sommet4:=(0,0,0); Sommet5:=(0,0,1.5); Sommet6:=(1,0,1.5); Sommet7:=(1,0.75,1.5); Sommet8:=(0,0.75,1.5); %%Faces NF:=6; Fc[100]:=4;Fc[101]:=1;Fc[102]:=4;Fc[103]:=3;Fc[104]:=2; Fc[200]:=4;Fc[201]:=4;Fc[202]:=5;Fc[203]:=8;Fc[204]:=3; Fc[300]:=4;Fc[301]:=1;Fc[302]:=6;Fc[303]:=5;Fc[304]:=4; Fc[400]:=4;Fc[401]:=5;Fc[402]:=6;Fc[403]:=7;Fc[404]:=8; Fc[500]:=4;Fc[501]:=2;Fc[502]:=3;Fc[503]:=8;Fc[504]:=7; Fc[600]:=4;Fc[601]:=1;Fc[602]:=2;Fc[603]:=7;Fc[604]:=6; DessineObjet; k:=1; for p_=t: if color p_: p_=Sommet[k]; k:=k+1; fi endfor; ); pavev enddef; vardef Pave(text t)(expr aa,bb,cc)= picture pave; pave=image( NbS:=8; Sommet1:=(aa,0,0); Sommet2:=(aa,bb,0); Sommet3:=(0,bb,0); Sommet4:=(0,0,0); Sommet5:=(0,0,cc); Sommet6:=(aa,0,cc); Sommet7:=(aa,bb,cc); Sommet8:=(0,bb,cc); %%Faces NF:=6; Fc[100]:=4;Fc[101]:=4;Fc[102]:=3;Fc[103]:=2;Fc[104]:=1; Fc[200]:=4;Fc[201]:=4;Fc[202]:=5;Fc[203]:=8;Fc[204]:=3; Fc[300]:=4;Fc[301]:=4;Fc[302]:=1;Fc[303]:=6;Fc[304]:=5; Fc[400]:=4;Fc[401]:=5;Fc[402]:=6;Fc[403]:=7;Fc[404]:=8; Fc[500]:=4;Fc[501]:=2;Fc[502]:=3;Fc[503]:=8;Fc[504]:=7; Fc[600]:=4;Fc[601]:=1;Fc[602]:=2;Fc[603]:=7;Fc[604]:=6; DessineObjet; k:=1; for p_=t: if color p_: p_=Sommet[k]; k:=k+1; fi endfor; ); pave enddef; vardef pave(expr aa,bb,cc)= typetrace:="3D"; typerepre:="persp"; Initialisation(1500,30,20,100); picture PAVE; PAVE=image( NbS:=8; Sommet1:=(aa,0,0); Sommet2:=(aa,bb,0); Sommet3:=(0,bb,0); Sommet4:=(0,0,0); Sommet5:=(0,0,cc); Sommet6:=(aa,0,cc); Sommet7:=(aa,bb,cc); Sommet8:=(0,bb,cc); %%Faces NF:=6; Fc[100]:=4;Fc[101]:=4;Fc[102]:=3;Fc[103]:=2;Fc[104]:=1; Fc[200]:=4;Fc[201]:=4;Fc[202]:=5;Fc[203]:=8;Fc[204]:=3; Fc[300]:=4;Fc[301]:=4;Fc[302]:=1;Fc[303]:=6;Fc[304]:=5; Fc[400]:=4;Fc[401]:=5;Fc[402]:=6;Fc[403]:=7;Fc[404]:=8; Fc[500]:=4;Fc[501]:=2;Fc[502]:=3;Fc[503]:=8;Fc[504]:=7; Fc[600]:=4;Fc[601]:=1;Fc[602]:=2;Fc[603]:=7;Fc[604]:=6; DessineObjet; ); PAVE enddef; vardef Tetraedrer(text t)= picture tetrar; tetrar=image( %Sommets NbS:=4; Sommet1:=(0,0,1); Sommet2:=(-0.4714045,-0.8164965,-1/3); Sommet3:=(0.942809,0,-1/3); Sommet4:=(-0.4714045,0.8164965,-1/3); %Faces NF:=4; Fc[100]:=3;Fc[101]:=1;Fc[102]:=2;Fc[103]:=3; Fc[200]:=3;Fc[201]:=1;Fc[202]:=3;Fc[203]:=4; Fc[300]:=3;Fc[301]:=1;Fc[302]:=4;Fc[303]:=2; Fc[400]:=3;Fc[401]:=2;Fc[402]:=4;Fc[403]:=3; DessineObjet; k:=1; for p_=t: if color p_: p_=Sommet[k]; k:=k+1; fi endfor; ); tetrar enddef; %Outils numeric echelleequerre; echelleequerre=2; vardef equerre(expr dte,drte,perpe,sens)= save picequerre; picture picequerre; pair ww,t[]; path intermede; pair perpen,ptt,pttt; perpen:=projection(perpe,dte,drte); %if sens=1 : ptt:=longueurequerre*(drte-dte) rotated 90 shifted perpen; %else : % ptt:=longueurequerre*(drte-dte) rotated (-90) shifted perpen; %fi; ww=unitvector(drte-dte); intermede=ptt--(10[ptt,(perpen rotatedabout(ptt,if sens=1: 30 else:-30 fi))]); pttt=intermede intersectionpoint (10[dte,drte]--10[drte,dte]); picequerre=image( draw perpen--ptt--pttt--cycle; draw codeperp(ptt,perpen,pttt,5); ); picequerre enddef; vardef regle(expr depart,arrivee,rr)= save picregle; picture picregle,grad[],gradu[],final; pair t[]; path reduit; t1000=depart shifted (5*unitvector(depart-arrivee)); t1003=arrivee shifted (20*unitvector(arrivee-depart)); t1004=(unitvector(arrivee-depart) rotated (-90)) shifted t1000; t1001=t1000 shifted (50*(t1004-t1000)); t1002=t1001 shifted (t1003-t1000); reduit=t1000--t1001--t1002..(t1002 shifted(5*unitvector(t1001-t1002)+1/4(t1003-t1002)))..(t1002 shifted(5*unitvector(t1002-t1001)+2/4(t1003-t1002)))..(t1002 shifted(5*unitvector(t1001-t1002)+3/4(t1003-t1002)))..t1003--cycle; gradu1=image( for k=0 upto 59: for j=1 upto 4: t[5*k+j]=depart shifted (1mm*(5*k+j)*unitvector(arrivee-depart)); t[400+5*k+j]=t[5*k+j] shifted (2*(t1004-t1000)); draw t[5*k+j]--t[400+5*k+j]; endfor; endfor ); gradu2=image( for k=0 upto 29: t[5*(2*k+1)]=depart shifted (1mm*5*(2*k+1)*unitvector(arrivee-depart)); t[400+5*(2*k+1)]=t[5*(2*k+1)] shifted (5*(t1004-t1000)); draw t[5*(2*k+1)]--t[400+5*(2*k+1)]; endfor ); gradu3=image( for k=0 upto 30: t[10*k]=depart shifted(1mm*10*k*unitvector(arrivee-depart)); t[400+10*k]=t[10*k] shifted (10*(t1004-t1000)); draw t[10*k]--t[400+10*k]; endfor ); for j=0 upto 30: grad[j]=image( label.bot(TEX(""&decimal(j)&""),t[400+10*j]); %affixe[j](t[400+10*j])s; currentpicture:=currentpicture rotatedabout(t[400+10*j],90+angle(t[400+10*j]-t[10*j])); ); endfor final=image( for k=0 upto 30: draw grad[k]; endfor for k=1 upto 3: draw gradu[k]; endfor clip currentpicture to reduit; draw reduit; ); if rr=-1: picregle=image( draw final rotatedabout(1/2[depart,arrivee],180); ); else: picregle=image( draw final; ); fi picregle enddef; vardef crayon(expr depart,arrive,ptplace,nbechelle)= save piccray; picture piccray,crayolat; pair w[]; w0=(0,0); w1=(1,2)*u/2; w2=(-1,2)*u/2; w3=(0,2)*u/2; w4=(0,7)*u/2; path ccc,ccd; ccc=cercles(w0,abs(w3-w2)); ccd=ccc yscaled 0.25 shifted w3; crayolat=image( draw subpath((length ccd)/2,length ccd) of ccd; draw ccd shifted (w4-w3); draw w2--w0--w1; draw w1--((1,7)*u/2); draw w2--((-1,7)*u/2); ); crayolat:=crayolat scaled nbechelle; piccray=(crayolat rotated(angle(arrive-depart)-30)) shifted ptplace; piccray enddef; boolean Simple; Simple=false; vardef rapporteur(expr centre,segment,rr)= save raps; picture raps; raps=image( Simple:=true; trace rapporteurdouble(centre,segment,rr); Simple:=false; ); raps enddef; vardef rapporteurdouble(expr centre,segment,rr)= save rap,cc,cd,v,w,t,ww,vv; picture rap; path cc,cd; pair a[],b[],v,w,t,ww,vv,rap[],rapp[]; cc=cercle(centre,0.75*abs(centre-segment)); t=cc intersectionpoint (centre--segment); w=t-2*unitvector(segment-centre);v=symetrie(w,t); ww=t-5*unitvector(segment-centre);vv=symetrie(ww,t); a0=(ww-centre) shifted centre; b0=(vv-centre) shifted centre; for i=0 upto 35 : for j=1 upto 4 : a[5*i+j]=(w-centre) rotated (rr*(5*i+j)) shifted centre; b[5*i+j]=(v-centre) rotated (rr*(5*i+j)) shifted centre; endfor; a[5*(i+1)]=(ww-centre) rotated (rr*(5*(i+1))) shifted centre; b[5*(i+1)]=(vv-centre) rotated (rr*(5*(i+1))) shifted centre; endfor picture nomb[],nombre[]; if rr=1: for j=0 upto 18: nombre[10*j]=image( label.bot(TEX("\fontsize{4}{4}\selectfont"&decimal(10*j)&""),a[10*j]); currentpicture:=currentpicture rotatedabout(a[10*j],angle(a[10*j]-centre)-90); ); endfor for j=0 upto 18: nombre[10*j+1]=image( % affixe.[180-10*j](b[10*j])n; label.top(TEX("\fontsize{4}{4}\selectfont"&decimal(180-10*j)&""),b[10*j]); currentpicture:=currentpicture rotatedabout(b[10*j],angle(b[10*j]-centre)-90); ); endfor else: for j=0 upto 18: nombre[10*j]=image( label.bot(TEX("\fontsize{4}{4}\selectfont"&decimal(180-10*j)&""),a[10*j]); currentpicture:=currentpicture rotatedabout(a[10*j],angle(a[10*j]-centre)-90); ); endfor for j=18 downto 0: nombre[10*j+1]=image( % affixe.[10*j](b[10*j])n; label.top(TEX("\fontsize{4}{4}\selectfont"&decimal(10*j)&""),b[10*j]); currentpicture:=currentpicture rotatedabout(b[10*j],angle(b[10*j]-centre)-90); ); endfor fi rap=image( for i=0 upto 18 : draw nombre[10*i+1]; if Simple=false: draw nombre[10*i]; fi; endfor; path cerc; cerc=subpath((angle(segment-centre)*(length cc))/360,((length cc)/2)+(angle(segment-centre)*(length cc))/360) of cc; if rr=-1: draw cerc reflectedabout(segment,centre); else: draw cerc; fi draw a0--b0 withpen pencircle scaled 1.25bp; for i=0 upto 35 : for j=1 upto 4 : draw a[5*i+j]--b[5*i+j]; endfor; endfor; for i=1 step 2 until 35: draw a[5*i]--b[5*i]; endfor; for i=1 upto 18: draw a[10*i]--b[10i] withpen pencircle scaled 1.25; endfor; draw a0--a180; path cent; cent=cercle(centre,0.05*u); fill cent withcolor if unknown fillrap: 0.9white else: fillrap fi; ); rap enddef; vardef compas(expr centre,extre,n)= save piccompas; picture piccompas; pair r,s,t,a,b,c,d,e,f; if (abs(centre-extre)<10*u): r=((extre-1/2[centre,extre]) rotated (n*90)) shifted (1/2[centre,extre]); else: r=0.25[1/2[centre,extre],((extre-1/2[centre,extre]) rotated (n*90)) shifted (1/2[centre,extre])]; fi s=(1+50/abs(centre-extre))[1/2[centre,extre],r]; t=10*unitvector(extre-centre) rotated (n*90); a=centre shifted t; b=s shifted (5*unitvector(centre-extre)+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; piccompas=image( fill comp withcolor black; draw centre--a withpen pencircle scaled 1.5bp; draw f--extre withpen pencircle scaled 1.5bp withcolor 0.25[red,blue]; ); piccompas enddef; endinput;