/**/ /// // tpoint4.h // Sunny:2007-2-7 // Author:cheungmine-cheungmine@gmail.com // Copyrightbycheungmine /**/ /// #ifndef_tpoint4_h_ #define _tpoint4_h_ #include " geomdef.h " #include " tpoint3.h " template < typenameT > struct GEOM_EXPt_point4 ... {union...{struct...{Tx,y,z,w;//3realcomponentsofthevector};Tv[4];//Arrayaccessusefulinloops};//Defaultconstructor,definedfortemplateclassest_point4()...{}//Constructapointwith3giveninputst_point4(T_x,T_y,T_z,T_w=1.f):x(_x),y(_y),z(_z),w(_w)...{}t_point4(constt_point4&in):x(in.x),y(in.y),z(in.z),w(in.w)...{}t_point4(constt_point3<T>&in):x(in.x),y(in.y),z(in.z),w(1.f)...{}//Reassignapointwithoutmakingatemporarystructurevoidassign(T_x,T_y,T_z,T_w)...{x=_x;y=_y;z=_z;w=_w;}//Negateavectorvoidneg()...{x=-x;y=-y;z=-z;w=-w;}//ReturnthemagnitudeofapointTmag()...{return(T)sqrt(x*x+y*y+z*z+w*w);}//Normalizesavector(makesit'slength1)voidnorm()...{Tinv=1/mag();x*=inv;y*=inv;z*=inv;w*=inv;}} ; // Addstwopointstogether:ret=a+b template < typenameT > inline const t_point4 < T > operator + ( const t_point4 < T >& a, const t_point4 < T >& b) ... {returnt_point4<T>(a.x+b.x,a.y+b.y,a.z+b.z,a.w+b.w);} ; // Subtractstopoints:ret=a-b template < typenameT > inline const t_point4 < T > operator - ( const t_point4 < T >& a, const t_point4 < T >& b) ... {returnt_point4<T>(a.x-b.x,a.y-b.y,a.z-b.z,a.w-b.w);} ; // Scalesavectorbyascalar:ret=a*s template < typenameT > inline const t_point4 < T > operator * ( const t_point4 < T >& a, const T & s) ... {returnt_point4<T>(a.x*s,a.y*s,a.z*s,a.w*s);} ; // Scalesavectorbyascalar:ret=s*a template < typenameT > inline const t_point4 < T > operator * ( const T & s, const t_point4 < T >& a) ... {returnt_point4<T>(s*a.x,s*a.y,s*a.z,s*a.w);} ; // Dividesavectorbyascalar:ret=a/s template < typenameT > inline const t_point4 < T > operator / ( const t_point4 < T > & a, const T & s) ... {returnt_point4<T>(a.x/s,a.y/s,a.z/s,a.w/s);} ; // VectorEquality,epsilonusedduetonumericalimprecision template < typenameT > inline bool operator == ( const t_point4 < T >& a, const t_point4 < T >& b) ... {if(fabs(a.x-b.x)<EPSILON&&fabs(a.y-b.y)<EPSILON&&fabs(a.z-b.z)<EPSILON&&fabs(a.w-b.w)<EPSILON)returntrue;returnfalse;} ; // Performsavectordotproduct:ret=adotb template < typenameT > inlineT operator * ( const t_point4 < T >& a, const t_point4 < T >& b) ... {return(T)(a.x*b.x+a.y*b.y+a.z*b.z+a.w*b.w);} #endif // _tpoint4_h_