C++实现一个Vector3空间向量类
来源:互联网 发布:css优化 编辑:程序博客网 时间:2024/05/20 13:18
Vector2,3,4类在DirectX中都有现成的可以调用,不过要实现其中的功能其实也不难,也都是一些简单的数学知识罢了。
本文用C++实现一个简单的Vector3类的功能,暂时有的功能是:
1 + - * /算术运算
2 向量的数量积,又叫:点乘
3 向量的向量积,又叫:叉乘
4 向量单位化(normalization)
//Vecotr3.h#pragma onceextern const double uZero;class Vector3{float x, y, z;public:Vector3():x(0), y(0), z(0){}Vector3(float x1, float y1, float z1):x(x1), y(y1), z(z1){}Vector3(const Vector3 &v);~Vector3();void operator=(const Vector3 &v);Vector3 operator+(const Vector3 &v);Vector3 operator-(const Vector3 &v);Vector3 operator/(const Vector3 &v);Vector3 operator*(const Vector3 &v);Vector3 operator+(float f);Vector3 operator-(float f);Vector3 operator/(float f);Vector3 operator*(float f);float dot(const Vector3 &v);float length();void normalize();Vector3 crossProduct(const Vector3 &v);void printVec3();};
//Vector3.cpp#include"Plane.h"#include<iostream>const double uZero = 1e-6;//复制构造函数,必须为常量引用参数,否则编译不通过Vector3::Vector3(const Vector3 &v):x(v.x), y(v.y), z(v.z){}Vector3::~Vector3(){}void Vector3::operator=(const Vector3 &v){x = v.x;y = v.y;z = v.z;}Vector3 Vector3::operator+(const Vector3 &v){return Vector3(x+v.x, y+v.y, z+v.z);}Vector3 Vector3::operator-(const Vector3 &v){return Vector3(x-v.x, y-v.y, z-v.z);}Vector3 Vector3::operator/(const Vector3 &v){if (fabsf(v.x) <= uZero || fabsf(v.y) <= uZero || fabsf(v.z) <= uZero){std::cerr<<"Over flow!\n";return *this;}return Vector3(x/v.x, y/v.y, z/v.z);}Vector3 Vector3::operator*(const Vector3 &v){return Vector3(x*v.x, y*v.y, z*v.z);}Vector3 Vector3::operator+(float f){return Vector3(x+f, y+f, z+f);}Vector3 Vector3::operator-(float f){return Vector3(x-f, y-f, z-f);}Vector3 Vector3::operator/(float f){if (fabsf(f) < uZero){std::cerr<<"Over flow!\n";return *this;}return Vector3(x/f, y/f, z/f);}Vector3 Vector3::operator*(float f){return Vector3(x*f, y*f, z*f);}float Vector3::dot(const Vector3 &v){return x*v.x + y*v.y + z*v.z;}float Vector3::length(){return sqrtf(dot(*this));}void Vector3::normalize(){float len = length();if (len < uZero) len = 1;len = 1/len;x *= len;y *= len;z *= len;}/*Cross Product叉乘公式aXb = | i, j, k | | a.x a.y a.z| | b.x b.y b.z| = (a.y*b.z -a.z*b.y)i + (a.z*b.x - a.x*b.z)j + (a.x*b.y - a.y*b.x)k */Vector3 Vector3::crossProduct(const Vector3 &v){return Vector3(y * v.z - z * v.y,z * v.x - x * v.z,x * v.y - y * v.x);}void Vector3::printVec3(){std::cout<<"("<<x<<", "<<y<<", "<<z<<")"<<std::endl;}
测试主程序:
#include<iostream>#include<vector>#include"Vector3.h"using namespace std;int main() {Vector3 v31;Vector3 v32(2.0f,3.0f,4.0f);Vector3 v33(v32 - 1.0f);cout<<"We have original Vector3s:\n";v31.printVec3();v32.printVec3();v33.printVec3();cout<<"v32 crossproduct v33 is:\n";Vector3 v3233 = v32.crossProduct(v33);v3233.printVec3();cout<<"Now we normalize them:\n";v31.normalize();v32.normalize();v33.normalize();v3233.normalize();v31.printVec3();v32.printVec3();v33.printVec3();v3233.printVec3();system("pause");return 0;}
运算结果:
- C++实现一个Vector3空间向量类
- 空间向量类Vector3的C++实现
- Unity3d-向量Vector3
- Vector3 三维向量
- Vector3——简单的3D向量类
- 向量空间模型文档相似度计算实现(C#)
- 训练一个词向量空间
- Vector3类
- vsm向量空间模型实现
- vsm向量空间模型实现
- Ogre中的向量Vector3的成员方法
- Ogre中的向量Vector3的成员方法
- Ogre中的向量Vector3的成员方法
- Ogre中的向量Vector3的成员方法
- Unity Manual之Vector3 三维向量
- 向量空间
- 39、C++定义一个类,实现向量的加减运算
- Vector3 类简介
- struts 框架总结
- 男人最有效的10种运动
- ubuntu DNW安装
- 【优生优育:女性避孕失败的6个征兆】
- java spring Coding To Interfaces 圆类
- C++实现一个Vector3空间向量类
- 浙工ACM1738
- HDU 2852 KiKi's K-Number 树状数组
- SQL Server 2008 R2 安装出错:Could not open key
- go 语言环境变量配置
- VS2010配置DarkGDK
- UVA 10561 Treblecross(组合游戏_SG定理的应用)
- fafu 1076 - 游戏
- (8)算法设计