%=============================================== %% 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 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; %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; %%%%%%%%%% %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; endinput;