向量的运算
- 零向量
- 负向量
- 向量大小、长度、模
- 标量与向量的乘法
- 标准化向量
- 向量的加法和减法
- 距离公式
- 向量点乘
- 向量投影
- 向量叉乘
C++语言
- 标量与向量的乘法除法
放大一个向量的长度(乘以一个标量)
缩放一个向量的长度(除以一个标量)
标准化向量
长度为1,方向不变的向量,单位向量
公式:
例如标准化一个2D向量:
向量的加法和减法
公式(符号变换即可):
距离公式:
贴上代码:
// 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
下一章是向量的叉乘和点乘。