//***************************************************************************** // name macroputto // Fichier : macroputto.inc // Date : janvier 2001 // M.O.P.S creation // //***************************************************************************** // ayant expérimenté des résultats erronés dans certains cas de acos(-1) j'ai créé cette macro // deplus #macro myacos(valeur) #switch (valeur) #case (-1) #local result=pi; #break #case (1) #local result=0; #break #else #local result=acos(valeur); #end result #end //***************************************************************************** #macro pair(valeur) #if (int(valeur/2)=valeur/2) #local result=true; #else #local result=false; #end result #end //***************************************************************************** #macro sn(valeur) #local signe=1; #if (valeur<0) #local signe=-1; #end signe #end //***************************************************************************** #macro ang_u1u2(u1,u2,norm) #local result=0; # if (vlength(u1)*vlength(u2)!=0) #local m_base=vnormalize(vcross(norm,u1)); #local result=degrees(acos(vdot(u1,u2)/(vlength(u1)*vlength(u2)))); #if (vdot(m_base,u2)<0) #local result=360-result; #end #end #if (vlength(u1-u2)=0) #local result=0; #end result #end //***************************************************************************** #macro putto(ptA,ptB,nm1,nwA,nwB,nm2,opt) // ptA, ptB : starting position // nm1 : normal vector , 0 if not usefull ( object of revolution ) // nwA, nwB, nm2 : final position // opt = 0 : uniform scaling // opt = 1 : scaling along vector(ptB-ptA) // opt = 2 no scaling #local m_oldv=ptB-ptA; #local m_newv=nwB-nwA; #local m_alp1=ang_u1u2(x,,z); #local m_temp=vaxis_rotate(m_oldv,z,-m_alp1); #local m_tpnm1=vaxis_rotate(nm1,z,-m_alp1); #local m_alp2=ang_u1u2(x,m_temp,y); #local m_temp=vaxis_rotate(m_temp,y,-m_alp2); #local m_tpnm1=vaxis_rotate(m_tpnm1,y,-m_alp2); #local m_bet1=ang_u1u2(x,,z); #local m_temp=vaxis_rotate(m_newv,z,-m_bet1); #local m_tpnm2=vaxis_rotate(nm2,z,-m_bet1); #local m_bet2=ang_u1u2(x,m_temp,y); #local m_tpnm2=vaxis_rotate(m_tpnm2,y,-m_bet2); #local m_omg=ang_u1u2(m_tpnm1,m_tpnm2,x); #local m_ft=1; #if (vlength(m_oldv)*vlength(m_newv)!=0) #local m_ft=vlength(m_newv)/vlength(m_oldv); #end #switch (opt) #case (1) #local m_fact=; #break #case (0) #local m_fact=m_ft*<1,1,1>; #break #else #local m_fact=<1,1,1>; #end #local result=transform { translate -ptA rotate -m_alp1*z rotate -m_alp2*y scale m_fact rotate m_omg*x rotate m_bet2*y rotate m_bet1*z translate nwA } result #end //***************************************************************************** #macro arc(alp,r_major,r_minor) #local arc_alp2=mod(alp,90); #local arc_dim=(r_major+r_minor+0.1); #local arc_cache=difference { box { <0,-(r_minor+0.1),arc_dim> } box { <0,-(r_minor+0.2),arc_dim*(sqrt(2)+0.1)> rotate -arc_alp2*y} } #switch (alp) #case (90) #local arc_cache=object{box { <0,-(r_minor+0.1),arc_dim> }} #break #case (180) #local arc_cache=object{box {<-arc_dim,r_minor+0.1,0> }} #break #case (270) #local arc_cache=union { box {<-arc_dim,r_minor+0.1,0> } box {<-arc_dim,r_minor+0.1,0> <0,-(r_minor+0.1),-arc_dim> }} #break #case (360) #local arc_cache=object{box {<-arc_dim,r_minor+0.1,-arc_dim> }} #break #case (0) #local arc_cache=object{box {<-arc_dim,r_minor+0.1,-arc_dim> }} #break #range (90,180) #local arc_cache=union { object { arc_cache rotate -90*y} box { <0,-(r_minor+0.1),arc_dim> }} #break #range (180,270) #local arc_cache=union { object { arc_cache rotate -180*y} box {<-arc_dim,r_minor+0.1,0> }} #break #range (270,360) #local arc_cache=union { object { arc_cache rotate -270*y} box {<-arc_dim,r_minor+0.1,0> } box {<-arc_dim,r_minor+0.1,0> <0,-(r_minor+0.1),-arc_dim> }} #break #end #if (alp!=0) #local result =intersection { torus { r_major , r_minor } object { arc_cache } } #else #local result=disc { r_major*x , z,r_minor } #end result #end #macro arcvect(centre,u1,u2,nm,ray) #if (vlength(u1)!=0) #local result=object { arc((ang_u1u2(u1,u2,nm)),1,ray/vlength(u1)) transform putto(0,1*x,-y,centre,centre+u1,nm,0) } #else #local result=sphere{ centre, ray } #end result #end