input geometriesyr16 input mp-solid vardef ObjetConeSimple[](expr fn,umin,umax,zbas,orign)= scantokens("vardef Famille(expr u)="&fn&" enddef;"); scantokens("color "&substring(0,4) of orign&"; "&orign&";"); apj:=0; upas:=(umax-umin)/nb;vpas:=abs(zbas)/subh; %On crée les facettes et on calcule la profondeur en Z. for k=0 upto (nb-1): for l=0 upto (subh-1): apj:=apj+1; tcpt.@[apj]:=apj; OTFc.@[apj].nb:=4; OTFc.@[apj][1]:=Image(Famille(umin+(k+1)*upas)+(l*vpas)*(orig-Famille(umin+(k+1)*upas))); OTFc.@[apj][4]:=Image(Famille(umin+k*upas)+(l*vpas)*(orig-Famille(umin+k*upas))); OTFc.@[apj][3]:=Image(Famille(umin+k*upas)+((l+1)*vpas)*(orig-Famille(umin+k*upas))); OTFc.@[apj][2]:=Image(Famille(umin+(k+1)*upas)+((l+1)*vpas)*(orig-Famille(umin+(k+1)*upas))); OTFc.@[apj].iso:=(OTFc.@[apj][1]+OTFc.@[apj][2]+OTFc.@[apj][3]+OTFc.@[apj][4])/4; ALT.@[apj]:=-Zpart(GCoord(OTFc.@[apj].iso)); if ProduitScalaire(Oeil-OTFc.@[apj].iso,Normal(OTFc.@[apj].iso,OTFc.@[apj][1],OTFc.@[apj][2]))>=0: Vue.@[apj]:=true;coul.@[apj]:=outcolor; else: Vue.@[apj]:=false;coul.@[apj]:=incolor; fi; endfor; endfor; apj.@:=apj; enddef; vardef AffichageObjetS[]= save _affi; picture _affi; color Fc[][];color cou[]; tapj:=0; for k=1 upto apj.@: tapj:=tapj+1; cpt[tapj]:=tapj; cou[tapj]:=coul.@[k]; Fc[tapj].nb:=OTFc.@[k].nb; for l=1 upto Fc[tapj].nb: Fc[tapj][l]:=OTFc.@[k][l]; endfor; Fc[tapj].iso:=OTFc.@[k].iso; ALT[tapj]:=ALT.@[k]; Vue[tapj]:=Vue.@[k]; endfor; QS(1,tapj); if Ferme.@: for k=1 upto tapj: if Vue[cpt[k]]=true: fill for l=1 upto Fc[cpt[k]].nb: Projette(Fc[cpt[k]][l])-- endfor cycle withcolor if arcenciel=true: lumin(cpt[k])*Hsvtorgb(((cpt[k]/tapj)*360,satu,lum)) else: lumin(cpt[k])*outcolor fi; %draw for l=1 upto Fc[cpt[k]].nb: % Projette(Fc[cpt[k]][l])-- %endfor %cycle withpen pencircle scaled0.25bp; fi; endfor; else: for k=1 upto tapj:%apj downto 1: fill for l=1 upto Fc[cpt[k]].nb: Projette(Fc[cpt[k]][l])-- endfor cycle withcolor if Vue[cpt[k]]: if arcenciel: lumin(cpt[k])*Hsvtorgb(((cpt[k]/tapj)*360,satu,lum)) else:lumin(cpt[k])*cou[cpt[k]] fi else: abs(lumin(cpt[k]))*cou[cpt[k]] fi; %draw for l=1 upto Fc[cpt[k]].nb: % Projette(Fc[cpt[k]][l])-- % endfor % cycle withpen pencircle scaled0.25bp; endfor; fi; enddef; vardef Cercles(text t)= save Cer; save n; n:=0; for p_=t: if color p_: n:=n+1; _T[n]:=p_; fi; endfor; 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; Cer enddef; figureespace(-10u,-10u,10u,10u); Initialisation(1500,-20,15,50); nb:=36; subh:=10; incolor:=vert; outcolor:=gris; Ferme1:=true; Objetcone1("r=1","h=3"); %r:=1; %ObjetConeSimple1("(r*cos(u),r*sin(u),-1)",0,pi,-1,"orig=(0,0,2)"); %AffichageObjetS1; %ObjetCone1("(r*cos(u),r*sin(u),0)",0,pi,-1,"orig=(0,0,2)"); traits:=false; AffichageObjet1; color O,S,A,M; O=(0,0,0); S-O=(0,0,3); A-O=(cosd(60),-sind(60),0); M-O=(1,0,0); path cc; cc=Cercles(O,M,O,M,(0,1,0)); draw cc; %draw subpath(0,length cc/2) of cc dashed evenly; %draw subpath(length cc/2,length cc) of cc; draw chemin(A,O,S) dashed evenly; draw chemin(A,S); %draw chemin(M,S,2[M,O]); %nomme.bot(O); %nomme.llft(A); %nomme.top(S); dotlabel.top(btex S etex,Projette(S)); dotlabel.rt(btex O etex,Projette(O)); dotlabel.llft(btex A etex,Projette(A)); finespace; end