最近在看《3D数学基础:图形与游戏开发》。该书第六章实现了一个简单三维向量类。我看了一下代码,发现有些地方是错的,于是做了一些小修改。该三维向量类实现了一些常用的向量运算,如点乘、叉乘等。对此不熟悉的同学可以参考相关线性代数教材。现把源码贴上:

#include

//@brief 浮点数比较宏,采用VC的浮点数单精度FLT_EPSILON

#define FLOAT_EQ(x,v) (((v - FLT_EPSILON) < x) && (x

namespace TD_Math

{

class Vector3

{

public:

float x;

float y;

float z;

//@brief 默认构造函数,不执行任何操作

Vector3()

{

zero();// 默认为零向量

}

//@brief 复制构造函数

Vector3(const Vector3 &a):x(a.x),y(a.y),z(a.z){}

//@brief 带参数的构造函数,用三个值完成初始化

Vector3(float fx,float fy,float fz):x(fx),y(fy),z(fz){}

//@brief 重载复制运算符,并返回引用,以实现左值

Vector3& operator = (const Vector3 &a)

{

x = a.x;

y = a.y;

z = a.z;

}

//@brief 重载“==”操作符

bool operator ==(const Vector3 &a)const

{ return (FLOAT_EQ(x,a.x)&&FLOAT_EQ(y,a.y)&&FLOAT_EQ(z,a.z)); }

//@brief 重载“!=”运算符

bool operator !=(const Vector3 &a)const

{

return ((!FLOAT_EQ(x,a.x))||(!FLOAT_EQ(y,a.y))||(!FLOAT_EQ(z,a.z)));

}

//@brief 置为零向量

void zero(){x = y = z = 0.0f;}

//@brief 重载“-”运算符

Vector3 operator - () const {return Vector3(-x,-y,-z);}

//@brief 重载二元“+”运算符

Vector3 operator +(const Vector3 &a) const

{

return Vector3(x+a.x,y+a.y,z+a.z);

}

//@brief 重载二元“-”运算符

Vector3 operator -(const Vector3 &a)const

{

return Vector3(x-a.x,y-a.y,z-a.z);

}

//@brief 与标量的乘法

Vector3 operator *(float a)const

{

return Vector3(x*a,y*a,z*a);

}

//@brief 与标量的除法

Vector3 operator /(float a)const

{

float oneOverA = 1.0f/a; // 注意:这里不对“除零”进行检查

return Vector3(x*oneOverA,y*oneOverA,z*oneOverA);

}

//@brief 重载自反运算符

Vector3& operator +=(const Vector3 &a)

{

x += a.x;

y += a.y;

z += a.z;

return *this;

}

Vector3& operator -=(const Vector3 &a)

{

x -= a.x;

y -= a.y;

z -= a.z;

return *this;

}

Vector3& operator *=(float a)

{

x*=a;

y*=a;

z*=a;

return *this;

}

Vector3& operator /=(float a)

{

float oneOverA = 1.0f/a;

x*=oneOverA;

y*=oneOverA;

z*=oneOverA;

return *this;

}

//@brief 向量标准化

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;

}

}

//@brief 向量点乘

float operator *(const Vector3 &a)const

{

return (x*a.x+y*a.y+z*a.z);

}

};

// 非成员函数

//@brief 求向量模

inline float vectorMag(const Vector3 &a)

{

return sqrt(a.x*a.x+a.y*a.y+a.z*a.z);

}

//@brief 计算两向量的叉乘

inline 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

);

}

//@brief 实现标量左乘

inline Vector3 operator *(float k,const Vector3 &v)

{

return Vector3(k*v.x,k*v.y,k*v.z);

}

//@brief 计算两点间距离

inline float 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);

}

//@brief 提供一个全局零向量

extern const Vector3 kZeroVector;

}

参考文献:

1. 3D数学基础:图形与游戏开发,作者: 邓恩,译者: 陈洪 / 史银雪 / 王荣静

python设计一个三维向量类_一个简单的三维向量类相关推荐

  1. C# - 类_使用新成员隐藏基类成员

    1 using System; 2 3 namespace 类_使用新成员隐藏基类成员 4 { 5 // 基类 : Animal 6 public class Animal 7 { 8 // 基类的普 ...

  2. python笔试题奥特曼打怪兽_一个python面试笔试题

    init 和 new 的作用和返回值?详细描述一下类的创建过程?如何捕获类的属性定义顺序? __new__在创建实例对象的时候调用,返回实例对象的内存地址,传递给__init__方法,就是self的值 ...

  3. php简单的mysql类_一个简单的php mysql操作类

    本文分享一个简单的php.mysql操作类,很简单,主要是数据的连接.查询等.有需要的朋友参考下吧. 分享一段php.mysql操作类的代码,供初学的朋友参考. 一个简单的类使用php和mysql数据 ...

  4. python从地址提取省市区实例_一个用于提取简体中文字符串中省,市和区并能够进行映射,检验和简单绘图的python模块...

    简介 一个用于提取简体中文字符串中省,市和区并能够进行映射,检验和简单绘图的python模块. 举个例子: ["徐汇区虹漕路461号58号楼5楼", "泉州市洛江区万安塘 ...

  5. 线性代数 向量长度_用户定义长度的向量| 使用Python的线性代数

    线性代数 向量长度 Prerequisite: Defining a vector 先决条件: 定义向量 Linear algebra is the branch of mathematics con ...

  6. matlab求两向量夹角_高中数学《平面向量的数量积》说课稿

    高中数学<平面向量的数量积>说课稿 作为一位无私奉献的人民教师,有必要进行细致的说课稿准备工作,借助说课稿可以让教学工作更科学化.那么写说课稿需要注意哪些问题呢?以下是小编为大家收集的高中 ...

  7. singleton 类_在Java中对Singleton类进行双重检查锁定

    singleton 类 Singleton类在Java开发人员中非常常见,但是它给初级开发人员带来了许多挑战. 他们面临的主要挑战之一是如何使Singleton保持为Singleton? 也就是说,无 ...

  8. python设计贪吃蛇游戏论文_用Python写一个贪吃蛇AI,让程序自己玩游戏

    前言 这两天在网上看到一张让人涨姿势的图片,图片中展示的是贪吃蛇游戏, 估计大部分人都玩过.但如果仅仅是贪吃蛇游戏,那么它就没有什么让人涨姿势的地方了. 问题的关键在于,图片中的贪吃蛇真的很贪吃XD, ...

  9. python算法工程师需要学什么_一个优秀的算法工程师必须具备哪些素质?

    导言 怎样成为一名优秀的算法工程师?这是很多从事人工智能学术研究和产品研发的同学都关心的一个问题.面对市场对人才的大量需求与供给的严重不足,以及高薪水的诱惑,越来越多的人开始学习这个方向的技术,或者打 ...

最新文章

  1. linux下详解shell中/dev/null 21
  2. bzoj4819 [Sdoi2017]新生舞会 分数规划(实数二分)+网络流检验
  3. 项目vue2.0仿外卖APP(五)
  4. 精选| 2019年3月R新包推荐
  5. jquery html dom方式创建新html元素
  6. 基于html的旅游网站-北京
  7. 幼儿课外活动游戏_幼儿园户外活动游戏有哪些
  8. 分而治之(Work Breakdown Structure, WBS)
  9. ae正在发生崩溃_本专业人才懂的梗 “pr未响应 ae正在发生崩溃”
  10. Leetcode_1482.制作m束花所需的最少天数
  11. web防火墙和waf防火墙的区别
  12. 挺带劲!这款开源数据库迁移工具超牛逼
  13. 股票入门基础知识1:什么是股票和股份?
  14. 对比市面淘宝短视频工具/软件,分析淘宝短视频未来趋势
  15. 水滴 Java开发(一面)42min
  16. Windows 10 下载(1)
  17. RHEL 6.5----SCSI存储
  18. android源码编译失败,编译android源码遇到错误及其解决方法
  19. PDF编辑技巧之添加页码和编辑文字
  20. 神马笔记 版本2.11.0——歌词笔记

热门文章

  1. 怎么查服务器域名 mac系统,苹果6s肿么查看服务器域名
  2. 安卓模拟ibeacon_【首发】联接真实与虚拟世界:Estimote Beacons Developer Kit 低功耗蓝牙开发套件...
  3. 字节跳动岗位薪酬体系曝光,看完感叹:不服不行,想高薪还得是学这个。。。。
  4. 2020-2021年度第二届全国大学生算法设计与编程挑战赛题解(冬季赛)
  5. 为什么Excel表格只有部分单元格可编辑?
  6. mp3音频转换,合并方法?-QVE音频剪辑
  7. 骑士游历问题【JAVA板】代码详细流
  8. pip install 安装的问题
  9. 计算机磁盘管理分盘可以撤销吗,电脑磁盘出现随便分盘不合理,怎么样重新分盘...
  10. 四五百蓝牙耳机哪个好?500元以内音质最好的蓝牙耳机