C++ Exercises(一)

一个3D向量类

//  Vertex3D.h: interface for the Vertex3D class.
//
///////////////////////////////////////////////////////////////////// /
class  Vertex3D  
{
// 3维向量类
private :
    
double  x,y,z;
public :
    Vertex3D();
    Vertex3D(
double  tx, double  ty, double  tz);
    Vertex3D(
const  Vertex3D &  vt); // 拷贝构造函数

    Vertex3D
&   operator   =  ( const  Vertex3D  & vt); // 重载赋值运算符

    
bool   operator   ==  ( const  Vertex3D  & vt) const ; // 重载"=="运算符
     bool   operator   !=  ( const  Vertex3D  & vt) const ; // 重载"!="运算符

    Vertex3D 
operator   - () const ; // 负向量
    Vertex3D  operator   -  ( const  Vertex3D  & vt) const ; // 向量减法
    Vertex3D  operator   +  ( const  Vertex3D  & vt) const ; // 向量加法
    Vertex3D  operator   *  ( double  fac) const ; // 与标量相乘
    Vertex3D  operator   /  ( double  fac) const ; // 与标量相除
    Vertex3D &   operator   +=  ( const  Vertex3D  & vt);
    Vertex3D
&   operator   -=  ( const  Vertex3D  & vt);
    Vertex3D
&   operator   *=  ( double  fac); // 与标量相乘
    Vertex3D &   operator   /=  ( double  fac); // 与标量相除
     double   operator   *  ( const  Vertex3D  & vt) const ; // 向量点乘


    
void  reset();
    
void  normalize(); // 向量单位化
     double  VertexLength() const ; // 向量模
     virtual   ~ Vertex3D();

    friend Vertex3D crossProduct(
const  Vertex3D  & a, const  Vertex3D  & b);
    friend 
double  Distance( const  Vertex3D  & a, const  Vertex3D  & b);
};


//  Vertex3D.cpp: implementation of the Vertex3D class.
//
///////////////////////////////////////////////////////////////////// /

#include 
" Vertex3D.h "
#include 
< math.h >

///////////////////////////////////////////////////////////////////// /
//  Construction/Destruction
///////////////////////////////////////////////////////////////////// /

Vertex3D::Vertex3D()
{
    
this -> =   0.0f ;
    
this -> =   0.0f ;
    
this -> =   0.0f ;
}

Vertex3D::Vertex3D(
double  tx, double  ty, double  tz)
{
    
this -> =  tx;
    
this -> =  ty;
    
this -> =  tz;
}
Vertex3D::Vertex3D(
const  Vertex3D  & vt)
{
    
this -> =  vt.x;
    
this -> =  vt.y;
    
this -> =  vt.z;
}

Vertex3D
&  Vertex3D:: operator   =  ( const  Vertex3D &  vt)
{
    
this -> =  vt.x;
    
this -> =  vt.y;
    
this -> =  vt.z;
    
return   * this ;
}

bool  Vertex3D:: operator   ==  ( const  Vertex3D &  vt) const
{
// 判断向量是否相等
     return   this -> x == vt.x && this -> y == vt.y && this -> z == vt.z;
}

bool  Vertex3D:: operator   !=  ( const  Vertex3D &  vt) const
{
    
return   this -> x != vt.x && this -> y != vt.y && this -> z != vt.z;
}

Vertex3D Vertex3D::
operator   -  () const
{
// 负向量
     return  Vertex3D( - x, - y, - z);
}

Vertex3D Vertex3D::
operator   -  ( const  Vertex3D &  vt) const
{
// 向量减法
     return  Vertex3D(x - vt.x,y - vt.y,z - vt.z);
}

Vertex3D Vertex3D::
operator   +  ( const  Vertex3D &  vt) const
{
// 向量加法
     return  Vertex3D(x + vt.x,y + vt.y,z + vt.z);
}

Vertex3D Vertex3D::
operator   *  ( double  fac) const
{
// 与标量乘法
     return  Vertex3D(x * fac,y * fac,z * fac);
}

Vertex3D Vertex3D::
operator   /  ( double  fac) const
{
// 与标量相除
     return  Vertex3D(x / fac,y / fac,z / fac);
}

Vertex3D
&  Vertex3D:: operator   +=  ( const  Vertex3D  & vt)
{
    
this -> +=  vt.x;
    
this -> +=  vt.y;
    
this -> +=  vt.z;
    
return   * this ;
}

Vertex3D
&  Vertex3D:: operator   -=  ( const  Vertex3D  & vt)
{
    
this -> -=  vt.x;
    
this -> -=  vt.y;
    
this -> -=  vt.z;
    
return   * this ;
}

Vertex3D
&  Vertex3D:: operator   *=  ( double  fac)
{
    
this -> *=  fac;
    
this -> *=  fac;
    
this -> *=  fac;
    
return   * this ;
}

Vertex3D
&  Vertex3D:: operator   /=  ( double  fac)
{
    
this -> /=  fac;
    
this -> /=  fac;
    
this -> /=  fac;
    
return   * this ;
}

void  Vertex3D::reset()
{
// 置为零向量 
     this -> =   0.0f ;
    
this -> =   0.0f ;
    
this -> =   0.0f ;
}

double  Vertex3D::VertexLength() const
{
// 向量长度
     double  tmp  =  x * x + y * y + z * z;
    
return  sqrt(tmp);
}

void  Vertex3D::normalize()
{
// 向量单位化
     double  len  =   this -> VertexLength(); // 获取向量长度
     if (len > 0.0f )
    {
        
double  tmp  =   1.0f / len;
        
this -> *=  tmp;
        
this -> *=  tmp;
        
this -> *=  tmp;
    }
}

double  Vertex3D:: operator   *  ( const  Vertex3D  & vt) const
{
// 向量点乘
     return  x * vt.x + y * vt.y + z * vt.z;
}


Vertex3D::
~ Vertex3D()
{

}

Vertex3D crossProduct(
const  Vertex3D  & a, const  Vertex3D  & b)
{
// 向量叉乘
     return  Vertex3D(a.y * b.z  -  a.z * b.y,a.z * b.x  -  a.x * b.z,a.x * b.y  -  a.y * b.x);
}

double  Distance( const  Vertex3D  & a, const  Vertex3D  & b)
{
// 向量距离
     double  dx  =  a.x  -  b.x,dy  =  a.y  -  b.y,dz  =  a.z  -  b.z;
    
return  sqrt(dx * dx + dy * dy + dz * dz);
}

你可能感兴趣的:(C++)