三、向量的加减乘除法

来源:互联网 发布:linux镜像文件iso下载 编辑:程序博客网 时间:2024/06/11 20:07

向量的运算

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

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 0