三、向量的加减乘除法

向量的运算

  • 零向量
  • 负向量
  • 向量大小、长度、模
  • 标量与向量的乘法
  • 标准化向量
  • 向量的加法和减法
  • 距离公式
  • 向量点乘
  • 向量投影
  • 向量叉乘

C++语言

  1. 标量与向量的乘法除法

    放大一个向量的长度(乘以一个标量)
    缩放一个向量的长度(除以一个标量)

    标量与向量的乘法
  2. 标准化向量

    长度为1,方向不变的向量,单位向量

    公式:
    这里写图片描述

    例如标准化一个2D向量:


    这里写图片描述

  3. 向量的加法和减法
    公式(符号变换即可):
    这里写图片描述

距离公式:
这里写图片描述

贴上代码:

// Vector.h
#ifndef _VECTOR3_H_INCLUDED_
#define _VECTOR3_H_INCLUDED_
#include <math.h>

class Vector3 {

public:
    float x;
    float y;
    float 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) {}

    void zero() {
        x = y = z = 0.0f;
    }
    Vector3 operator -() const { return Vector3(-x, -y, -z); }
    //  向量的乘法,放大一个向量
    Vector3 operator *(Vector3 &v)  const { return Vector3(x*v.x, y*v.y, z*v.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, y, z)*oneOverA; }
    Vector3 operator /=(float a) { x /= a; y /= a; z /= a; return *this; }
    //  向量的加法
    Vector3 operator +(const Vector3 &v) const { return Vector3(x + v.x, y + v.y, z + v.z); }
    Vector3 operator +=(const Vector3 &v) { return Vector3(x += v.x, y += v.y, z += v.z); }
    //  向量的减法法
    Vector3 operator -(const Vector3 &v) const { return Vector3(x - v.x, y - v.y, z - v.z); }
    Vector3 operator -=(const Vector3 &v) { return Vector3(x -= v.x, y -= v.y, z -= v.z); }
    //  标准化一个向量
    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;
        }
    }
};
//  求模
inline float vectorMag(const Vector3 &a) {
    return sqrt(a.x*a.x + a.y*a.y + a.z*a.z);
}

//  左乘
inline Vector3 operator *(float le_v, const Vector3 &v) {
    return Vector3(le_v * v.x, le_v * v.y, le_v * v.z);
}
//  两点距离
inline float Distance(const Vector3 &a, const Vector3 &b) {
    return vectorMag(a - b);
}
#endif

下一章是向量的叉乘和点乘。

  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值