向量类操作

本文介绍了一个三维向量类的实现细节,包括各种运算符重载、向量运算如点积、叉积等,并提供了向量长度计算及规范化的方法。
#include <cmath>

class Vector3
{
public :
    float x,y,z;
    Vector3(){}
    Vector3(const Vector3 & a): x(a.x),y(a.y),z(a.z){}
    Vector3(float nx,float ny,float nz): x(nx) ,y(ny),z(nz){}
    Vector3 &operator=(const Vector3 &a)
    {
        x=a.x,y=a.y,z=a.z;
        return *this;
    }
    bool operator ==(const Vector3 &a)const
    {
        return x==a.x&&y==a.y&&z==a.z;
    }
    bool operator !=(const Vector3 &a) const
    {
        return x!=a.x||y!=a.y||z!=a.z;
    }

    void zero(){x=y=z=0.0f;}
    Vector3 operator -() const {return Vector3 (-x,-y,-z);}
    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 *(float a) const
    {
        return Vector3(x*a,y*a,z*a);
    }
    Vector3 operator /(float a)const
    {
        float oneOverA=1.0f/a;
        return Vector3(x*oneOverA,y*oneOverA,z*oneOverA);
    }
    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;
    }
    Vector3 &operator *=(float a)
    {
        x*=a,y*=a,z*=a;
        return *this;
    }
    Vector3 &operator /=(float a)
    {
        float oneOverA=1.0f/a;
        x*=oneOverA ,y*=oneOverA, z*=oneOverA;
        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;
    }
};
///向量模
inline float vectorMag(const Vector3 &a)
{
    return sqrt(a.x*a.x+a.y*a.y+a.z*a.z);
}
///叉乘
inline 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
    };
}
///标量左×
inline Vector3 operator *(float k,const Vector3 &v)
{
    return Vector3 (k*v.x ,k*v.y, k*v.z);
}
inline 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);
}
///全局零向量
extern const Vector3 kZeroVector;



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值