3d数学基础-向量相关操作-用C++实现

来源:互联网 发布:2000年人口普查数据 编辑:程序博客网 时间:2024/04/24 22:29
//计算向量的模,负向量,零向量,标量与向量的乘法,标准化向量,向量的加法和减法 ,距离公式,点乘,叉乘
#include <iostream.h>
#include <math.h>


class Vector3
{
private:
double x, y, z;  //在数学上的表示 [x,y,z] , 这里的我们定义为成员变量
public:
Vector3(){}
Vector3(const Vector3& a) : x(a.x), y(a.y), z(a.z){}
    Vector3(double a, double b, double c) : x(a), y(b), z(c){}
void zero()  //设置为零向量
{
x = y = z = 0;
}
Vector3 operator-() const  //负向量
{
return Vector3(-x, -y, -z);
}
Vector3 operator*(float a) const    //标量必须在右边
{
return Vector3(x*a, y*a, z*a);
}
Vector3 operator*=(float a)   //标量必须在右边
{
x*=a; y*=a; z*=a;
return *this;
}
Vector3 operator/(float a) const   //标量必须在右边
{
float oneOverA = 1.0f/a;  //计算机中的除法速度比较慢
return Vector3(x*oneOverA, y*oneOverA, z*oneOverA);  //目的是速度快一点
}
Vector3 operator/=(float a)     //标量必须在右边
{
float oneOverA = 1.0f/a;
x*=oneOverA; y*=oneOverA; z*=oneOverA;
return *this;
}
//向量的加法,两个向量相加
Vector3 operator+(const Vector3& a) const
{
return Vector3(x+a.x, y+a.y, z+a.z);
}
//向量的减法,两个向量相减
Vector3 operator-(const Vector3& a) const
{
return Vector3(x-a.x, y-a.y, z-a.z);
}
    //向量的加法,另一种方式
Vector3 operator+=(const Vector3& a)   
{
x+=a.x; y+=a.y; z+=a.z;
return *this;
}
//向量的减法,另一种方式
Vector3 operator-=(const Vector3& a)   
{
x-=a.x; y-=a.y; z-=a.z;
return *this;
}
//向量的标准化操作,单位向量
void normalize()
{
float magSq = x*x + y*y + z*z;
if(magSq>0.0f)
{
float oneOverMag = 1.0f/sqrt(magSq);
x *= oneOverMag;
y *= oneOverMag;
z *= oneOverMag;
}
}


//点乘
float operator*(const Vector3& a) const
{
return x*a.x + y*a.y + z*a.z;
}


//叉乘
friend Vector3 crossProduct(const Vector3& a, const Vector3& b);


friend void print_v(Vector3 v);
friend double vectorMag(const Vector3& a); 
    friend Vector3 operator*(float k, const Vector3& v);  //定义标量的左乘
friend float distance(const Vector3& a, const Vector3& b);   //两点之间的距离
};


double vectorMag(const Vector3& a)  //计算模
{
return sqrt(a.x*a.x + a.y*a.y + a.z*a.z);
}


void print_v(Vector3 v)
{
cout<<"["<<v.x<<", "<<v.y<<", "<<v.z<<"]"<<endl;
}
Vector3 operator*(float k, const Vector3& v)
{
return Vector3(k*v.x, k*v.y, k*v.z);
}
float distance(const Vector3& a, const Vector3& b)
{
//float dx = a.x - b.x;
//float dy = a.y - b.y;
//float dz = a.z - b.z;
//return sqrt(dx*dx + dy*dy + dz*dz);


//以上代码可以用一句代替
return vectorMag(a-b);
}
Vector3 crossProduct(const Vector3& a, const Vector3& b)
{
return Vector3
(
  a.y*b.z - a.z*b.y,
      a.z*b.x - a.x*b.z,
  a.x*b.y - a.y*b.x
);
}
int main()
{
cout<<"hello, vector"<<endl;
/*Vector3 v1(10, 20, 30);
    print_v(v1);


Vector3 v2=v1;
print_v(v2);


Vector3 v3 = -v1;
print_v(v3);


v2.zero();
print_v(v2);


Vector3 v4(5,-4,7);
cout<<vectorMag(v4)<<endl;    //计算大小,模,长度
   
     //向量与标量相乘
Vector3 v5(1,2,3);     
Vector3 v6 = v5*(2);
print_v(v6);



//向量与标量相除
Vector3 v1(2,4,6);
Vector3 v2 = v1/2;
print_v(v2);



//向量与标量相乘另一个方式
Vector3 v5(1,2,3);  
Vector3 v6 = (v5*=2);
print_v(v6);



//向量与标量相除另一个方式
Vector3 v1(2,4,6);
Vector3 v2 = (v1/=2);
print_v(v2);



//标量的左乘
Vector3 v5(1,2,3);     
Vector3 v6 = (2)*v5;
print_v(v6);



    //向量的标准化,单位向量,  我们把最后一个数设为0,就变成了2D的了
Vector3 v5(12,-5, 0);   
    v5.normalize();
print_v(v5);



//向量的加法
Vector3 a(1,2,3);
Vector3 b(1,2,3);
Vector3 c = a+b;
print_v(c);
Vector3 d(1,1,1);
d += a;
print_v(d);



//向量的减法
Vector3 a(3,3,3);
Vector3 b(2,2,2);
Vector3 c;
c = a-b;
print_v(c);
a -= c;
print_v(a);



//两点之间的距离
Vector3 a(3,3,0);  //2D
Vector3 b(2,2,0);   //2D
float d = distance(a, b);
    cout<<d<<endl;
    


//点乘
Vector3 a(3,-2,7);  
Vector3 b(0,4,-1);   
float dp = a*b;
cout<<dp<<endl;



//计算两个向量的夹角
Vector3 a(3,-2,7);  
Vector3 b(0,4,-1); 
float dp = a*b;
double arc = acos(dp/(vectorMag(a)*vectorMag(b)))*180/3.1415;
cout<<arc<<endl;    //117.522度



    //叉乘
Vector3 a(1,3,4);  
Vector3 b(2,-5,8);   
Vector3 dp = crossProduct(a,b);
print_v(dp);
*/
return 0;
}



0 0