参考资料:1、 [美] 邓恩(Dunn F.)著. 3D数学基础——图形设计与开发. 史银雪,陈洪,王荣静 译 清华大学出版社 p57-65
2、http://www.2cto.com/kf/201311/260139.html

编程环境 QT4.8.4 + VS2010

本文用 C++实现一个简单的Vector3类的功能,已经实现的功能有:
1、重载赋值运算符“=”
2、重载“==”和“!=”操作符
3、置为零向量
4、重载一元运算符“-”
5、重载二元预算法“+”“-”
6、标量的乘除法
7、重载自反运算符
8、向量单位化
9、向量的数量积,又叫:点乘
10、向量的向量积,又加:叉乘
11、计算两点间的距离
12、打印向量

程序清单
1、vector3.h

#ifndef VECTOR3_H
#define VECTOR3_Hclass Vector3
{
public:float x, y, z;//构造函数//默认构造函数,初始一个零向量Vector3();//复制构造函数Vector3(const Vector3 &a);//带参数的构造函数,用三个值完成初始化Vector3(float nx, float ny, float nz);//析构函数~Vector3();//标准对象操作//重载赋值运算符,并返回引用,以实现左值。Vector3& operator=(const Vector3 &a);//重载"=="操作符bool operator==(const Vector3 &a) const ;//重载"!="操作符bool operator!=(const Vector3 &a) const ;//向量运算//置为零向量void Zero();//重载一元"-"运算符Vector3 operator-()const;//重载二元"+"和"-"运算符Vector3 operator+(const Vector3 &a) const;  Vector3 operator-(const Vector3 &a) const;  //标量的乘、除法Vector3 operator*(float a) const;Vector3 operator/(float a) const;  //重载自反运算符Vector3& operator+=(const Vector3 &a);Vector3& operator-=(const Vector3 &a);Vector3& operator*=(float a);Vector3& operator/=(float a);//向量标准化void Normalize();//向量点乘,重载标准的乘法运算符float operator*(const Vector3 &a) const;//求向量模float VectorMag(const Vector3 &a);//计算两向量的叉乘Vector3 CrossProduct(const Vector3 &a,const Vector3 &b);//计算两点间的距离float Distance (const Vector3 &a,const Vector3 &b);//打印向量void Vector3::PrintVector3();};#endif // VECTOR3_H

2、vector3.cpp

#include <iostream>
#include <qmath.h>
#include "vector3.h"//默认构造函数,初始一个零向量
Vector3::Vector3(){x=0;y=0;z=0;
}
//复制构造函数
Vector3::Vector3(const Vector3 &a){x=a.x;y=a.y;z=a.z;
}
//带参数的构造函数,用三个值完成初始化
Vector3::Vector3(float nx, float ny, float nz){x=nx;y=ny;z=nz;
}
//析构函数
Vector3::~Vector3(){};//标准对象操作
//重载赋值运算符,并返回引用,以实现左值。
Vector3& Vector3::operator=(const Vector3 &a){x =a.x;y =a.y;z =a.z;return *this;
}//重载"=="操作符
bool Vector3::operator==(const Vector3 &a) const{return x==a.x && y==a.y && z==a.z;
}//重载"!="操作符
bool Vector3::operator!=(const Vector3 &a) const{return x!=a.x || y!=a.y || z!=a.z;
}//置为零向量
void Vector3::Zero(){x = y = z = 0.0f;
}
//重载一元"-"运算符
Vector3 Vector3::operator-()const
{return Vector3(-x,-y,-z);
}//重载二元"+"和"-"运算符
Vector3 Vector3::operator+(const Vector3 &a) const{return Vector3(x+a.x,y+a.y,z+a.z);
}
Vector3 Vector3::operator-(const Vector3 &a) const{return Vector3(x-a.x,y-a.y,z-a.z);
}//标量的乘、除法
Vector3 Vector3::operator*(float a) const{return Vector3(x*a,y*a,z*a);}
Vector3 Vector3::operator/(float a) const{float oneOverA = 1.0f /a;//注意这里不对"除零"进行处理return Vector3(x*oneOverA,y*oneOverA,z*oneOverA);
}//重载自反运算符
Vector3& Vector3::operator +=(const Vector3 &a){x+=a.x;y+=a.y;z+=a.z;return *this;
}Vector3& Vector3::operator -=(const Vector3 &a){x-=a.x;y-=a.y;z-=a.z;return *this;
}
Vector3& Vector3::operator *=(float a){x *= a;y *= a;z *= a;return *this;
}
Vector3& Vector3::operator /=(float a){float oneOverA =1.0f/a;x *= oneOverA;y *= oneOverA;z *= oneOverA;return *this;
}//向量标准化
void Vector3::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;}
}//向量点乘,重载标准的乘法运算符
float Vector3::operator *(const Vector3 &a) const{return x*a.x + y*a.y +z *a.z;
}
void Vector3::PrintVector3(){
    std::cout <<"("<<x<<","<<y<<","<<z<<")"<<std::endl;}
//求向量模
float Vector3::VectorMag(const Vector3 &a){return sqrt(a.x * a.x + a.y * a.y + a.z * a.z);
}/*
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 &a,const Vector3 &b){return Vector3(a.y * b.z - a.z * b.y,a.z * b.x - a.x * b.z,a.x * b.y - a.y * b.x);
}//计算两点间的距离
 float Vector3::Distance (const Vector3 &a,const Vector3 &b){float dx = a.x - b.x;float dy = a.y - b.y;float dz = a.z - b.z;return sqrt(dx * dx + dy * dy + dz * dz);
}

3、测试文件 main.cpp

#include <QtCore/QCoreApplication>
#include "vector3.h"
#include <iostream>
int main(int argc, char *argv[])
{QCoreApplication a(argc, argv);//测试构造函数Vector3 v1;Vector3 v2(3.0f,4.0f,5.0f);Vector3 v3(v2);//测试赋值运算符Vector3 v4 =v3;//打印v1.PrintVector3();v2.PrintVector3();v3.PrintVector3();v4.PrintVector3();//测试布尔运算 ==if (v1 ==v3){std::cout<<"v1=v3"<<std::endl;}else{std::cout<<"v1!=v3"<<std::endl;}if (v2 == v3){std::cout<<"v2=v3"<<std::endl;}else{std::cout<<"v2!=v3"<<std::endl;}//测试布尔运算 !=if (v1 !=v3){std::cout<<"v1!=v3"<<std::endl;}else{std::cout<<"v1=v3"<<std::endl;}if (v2 != v3){std::cout<<"v2!=v3"<<std::endl;}else{std::cout<<"v2=v3"<<std::endl;}//测试置为零向量v2.Zero();v1.PrintVector3();v2.PrintVector3();v3.PrintVector3();v4.PrintVector3();//测试一元"-"运算符Vector3 v5=-v3;v5.PrintVector3();//测试二元预算符Vector3 v_x(2.0f,3.0f,4.0f);Vector3 v_y(3.0f,3.0f,4.0f);Vector3 v_add = v_x+v_y;Vector3 v_sub = v_x-v_y;v_add.PrintVector3();v_sub.PrintVector3();//求模float mag = v2.VectorMag(v2);std::cout <<mag<<std::endl;//单位化v2.Normalize();v2.PrintVector3();return a.exec();
}

二、运行结果

说明:本程序是在QT4.8.4 +VS2010中实现,如果转到其他编程环境,请自行修改。

源程序下载:http://download.csdn.net/detail/gongchao1212/8675321

Vector3——简单的3D向量类相关推荐

  1. python设计一个三维向量类_一个简单的三维向量类

    最近在看<3D数学基础:图形与游戏开发>.该书第六章实现了一个简单三维向量类.我看了一下代码,发现有些地方是错的,于是做了一些小修改.该三维向量类实现了一些常用的向量运算,如点乘.叉乘等. ...

  2. 一个简单的三维向量类

    作者:朱金灿 来源:http://blog.csdn.net/clever101/ 最近在看<3D数学基础:图形与游戏开发>.该书第六章实现了一个简单三维向量类.我看了一下代码,发现有些地 ...

  3. 3D数学 自定义三维向量类进行运算

    3D数学 自定义向量类进行运算 设计一个3维向量类,可以实现如下运算: 零向量 负向量 向量大小.长度.模 标量与向量的乘除法 单位向量 向量的加法和减法 距离公式 向量点乘 向量叉乘 由于原理很简单 ...

  4. SceneKit:简单的3D游戏场景搭建

    SceneKit是Apple用来开发休闲3D游戏的框架,不同于底层的OpenGL库,你仅仅需要很少的代码就可以快速看到实际的3D场景效果.下面简单的聊聊搭建一个3D游戏场景需要做的事情. 首先你必须用 ...

  5. 《3D数学基础》实践1 向量类代码分析

    理解数学,理解代码! 大家好,我是老G! 今天为大家带来<3D数学基础>系列视频. 主要讲解:游戏开发中用到的3D数学知识,包括:定义,定理,推论. 也包括他们的推导过程,以及应用举例. ...

  6. 了解3D世界的黑魔法 - 纯Java构造一个简单的3D渲染引擎

    前言 当今用于游戏和多媒体的3D渲染引擎在数学和编程的复杂性上足以令大多数人望而生畏,从编程接口的OpenGL再到逼真到令人叹为观止的UE5(虚幻五)引擎,后者单单引擎本身(不含调试)的大小就达到了将 ...

  7. 【C++进阶】利用重载二元运算符改进平面向量类Vec2D

    先前回顾 在[C++进阶] 遵循TDD原则,实现平面向量类(Vec2D)中我们初步实现了Vec2D内容,现在做出一定的改进: 实现Vec2D的一半二元算数运算符重载 1. + - (两个Vec2D对象 ...

  8. 大型3d射击类游戏源码【突击风暴】,中文版本,可私服

    <突击风暴>(英文名称:Sudden Attack)是由韩国GAMEHI公司制作,盛大游戏运营的第一人称射击类网络游戏.<突击风暴>于2011年6月9日开服,2012年12月3 ...

  9. 【python学习】自定义三维向量类 加减乘除查看值和长度

    <中学生可以这样学Python>P166 自定义三维向量类 ##自定义三维向量类 class Vector3:#构造方法,初始化,定义向量坐标def __init__(self,x,y,z ...

最新文章

  1. 图解用Scientific Toolworks Understand分析Microsoft DirectX SDK (June 2010)自带D3D示例
  2. python判断ip地址是否合法_python实现判断一个字符串是否是合法IP地址的示例
  3. ASP.NET MVC 2.0
  4. C++ 类型转换 :C语言的类型转换、C++的四种强制类型转换、explicit
  5. 一文带你学会 UML 统一建模语言
  6. 谁说.NET不适合搞大数据、机器学习和人工智能
  7. dedecms怎么改php版本_PHP程序员进阶之路
  8. synchronized的实现原理用法详解
  9. 课程学习评价系统设计与实现
  10. linux红帽子镜像下载,红帽Red Hat Linux相关产品iso镜像下载
  11. vulhub漏洞复现十七_GhostScript
  12. 高德地图使用心得,百度地图使用心得
  13. 项目需求管理-用户体验的五大层次
  14. 考研数学,备考3大要点需注意
  15. PyQt5_Demo5
  16. 插槽+生命周期+过滤器
  17. 花间一壶酒,独酌无相亲。—第四天
  18. 嵌入式系统,嵌入式系统定义和使用,嵌入式系统和桌面通用系统的区别,嵌入式系统结构组成,嵌入式软件组成
  19. 特斯拉召回超43万辆电动车,我们如何避免软件问题的召回?
  20. Garden Planner for Mac(景观设计软件)

热门文章

  1. 旅游景点大排名C++、Pascal题解
  2. C++实现的银行账户管理系统
  3. IO操作和DMA、RDMA
  4. 半夏半暖半流年,半秋半冷半生缘
  5. 豆豆趣事[2016年11月]
  6. 【蓝桥杯选拔赛真题38】python目标值判断 青少年组蓝桥杯python 选拔赛STEMA比赛真题解析
  7. 服务器间实现文件共享
  8. ELK搜索学习笔记--Day1
  9. 人人都是可以套用的高保真原型模版
  10. Visio 学习笔记 —— 链接线的默认样式