C++实现一个Vector3空间向量类
2013-11-23 15:05
507 查看
Vector2,3,4类在DirectX中都有现成的可以调用,不过要实现其中的功能其实也不难,也都是一些简单的数学知识罢了。
本文用C++实现一个简单的Vector3类的功能,暂时有的功能是:
1 + - * /算术运算
2 向量的数量积,又叫:点乘
3 向量的向量积,又叫:叉乘
4 向量单位化(normalization)
测试主程序:
运算结果:
本文用C++实现一个简单的Vector3类的功能,暂时有的功能是:
1 + - * /算术运算
2 向量的数量积,又叫:点乘
3 向量的向量积,又叫:叉乘
4 向量单位化(normalization)
//Vecotr3.h #pragma once extern 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++开发中一个解决方案里,两个项目的相互引用,相互依赖的实现方法(解决方法)
- 【c++总结-类】一个例子知道类的创建,对象,函数实现,构造函数,析构函数
- 一个无聊男人的疯狂《数据结构与算法分析-C++描述》学习笔记 用C++/lua/python/bash的四重实现(3) 最大子序列和问题
- C++ 虚拟函数vs 回调函数 像有虚拟方法表一样有一个虚拟变量表就可以实现类级回调函数了
- 采用C++的ACE库实现的一个通用的C/S架构通信程序(最终版)
- C++实现一个简单图书借阅流程
- 用C++实现一个不能被继承的类
- 实现了一个 native层读写音频数据时用到的一个 音频数据缓冲区(线程安全的)(c++)
- 一个跨平台的c++日志模块实现
- 一个简单的二叉搜索树(C++实现)
- 算法题 用C或C++实现void reverse(char* str)函数,即反转一个null结尾的字符串
- 【C++】通过模板实现一个通用的冒泡排序
- 【C++】用拷贝函数实现一个复数类(complex)
- 【c++】实现一个复数类
- (大卫的阅读笔记)More Effective C++ Item 附2:一个auto_ptr的实现实例
- c++实现一个比较两个string类型的版本号的小demo
- [面试] - 在单链表末尾添加一个节点 C++ 实现
- Hypertable一个 C++ 的Bigtable开源实现
- C++ 声明并实现一个日期类(运算符重载)
- 『C/C++』一个用C/C++分别实现接口与实现相分离的设计原则的例子