• C++编写的Vector3类


    信心满满的带了作品去顽石面试,结果在第二个环节被问到了3D数学,果断坑了,领教了一遍Unity3D只是工具,3D数学、图形算法才王道的思想。人家说的在理,也感觉自己太浮躁了,从现在开始一点一点的学回来!下面是一个最基础了Vector3类,其中基本包含了向量常用的方法,也是“3D数学基础 图形与游戏开发”这本书6.2章节的一个例子,感觉很不错,手打了一遍,多加了点注释。另外这个例子里有2个bug,(在159、176这两行)我个人暂时解决不了,有心人可以copy到vs里看一看

      1 #include<math.h>
      2 
      3 /*
      4  * 3D向量类
      5  */
      6 class Vector3
      7 {
      8 public:
      9     //定义 x,y,z轴
     10     float x, y, z;
     11     
     12     //默认构造函数,不执行任何操作
     13     Vector3() {}
     14 
     15     //复制构造函数
     16     Vector3(const Vector3 &a) : x(a.x), y(a.y), z(a.z) {}
     17 
     18     //初始化构造函数
     19     Vector3(float nx, float ny, float nz) : x(nx), y(ny), z(nz) {}
     20 
     21     //标准对象操作
     22     Vector3 &operator = (const Vector3 &a)
     23     {
     24         x = a.x;
     25         y = a.y;
     26         z = a.z;
     27         return *this;
     28     }
     29 
     30     //置为零向量
     31     void zero() 
     32     { 
     33         x = y = z = 0.0f;    
     34     }
     35 
     36     //重载“==”操作符
     37     bool operator ==(const Vector3 &a) const
     38     {
     39         return x == a.x && y == a.y && z == a.z;
     40     }
     41 
     42     //重载“!=”操作符
     43     bool operator !=(const Vector3 &a) const
     44     {
     45         return x != a.x || y != a.y || z != a.z;
     46     }
     47 
     48     //重载一元“-”运算符
     49     Vector3 operator -() const
     50     {
     51         return Vector3(-x, -y, -z);    
     52     }
     53 
     54     //重载二元“+”运算符
     55     Vector3 operator +(const Vector3 &a) const
     56     {
     57         return Vector3(x + a.x, y + a.y, z + a.z);
     58     }
     59 
     60     //重载二元“-”运算符
     61     Vector3 operator -(const Vector3 &a) const
     62     {
     63         return Vector3(x - a.z, y - a.y, z - a.z);
     64     }
     65 
     66     //与标量的乘法
     67     Vector3 operator *(float a) const
     68     {
     69         return Vector3(x * a, y * a, z * a);
     70     }
     71 
     72     //与标量的除法(不对除0进行检查)
     73     Vector3 operator /(float a) const
     74     {
     75         //获得倒数
     76         float reciprocalA = 1.0f / a;
     77         return Vector3(x * reciprocalA, y * reciprocalA, z * reciprocalA);
     78     }
     79 
     80     //重载简加运算符
     81     Vector3 &operator +=(const Vector3 &a)
     82     {
     83         x += a.x;
     84         y += a.y;
     85         z += a.z;
     86         return *this;
     87     }
     88 
     89     //重载简减运算符
     90     Vector3 &operator -=(const Vector3 &a)
     91     {
     92         x -= a.x;
     93         y -= a.y;
     94         z -= a.z;
     95         return *this;
     96     }
     97 
     98     //重载简乘运算符
     99     Vector3 &operator *=(const Vector3 &a)
    100     {
    101         x *= a.x;
    102         y *= a.y;
    103         z *= a.z;
    104         return *this;
    105     }
    106 
    107     //重载简乘运算符
    108     Vector3 &operator /=(const Vector3 &a)
    109     {
    110         x /= a.x;
    111         y /= a.y;
    112         z /= a.z;
    113         return *this;
    114     }
    115 
    116     //向量标准化(在没有改变本质关系的前提下,把向量的长度标准化为1)
    117     void normalize()
    118     {
    119         float magSq = x * x + y * y + z * z;
    120         //除零检查
    121         if(magSq > 0.0f)
    122         {
    123             //向量长度的倒数
    124             float magOver = 1.0f / sqrt(magSq);
    125             x *= magOver;
    126             y *= magOver;
    127             z *= magOver;
    128         }
    129     }
    130 
    131     //向量点乘,重载标准的乘法运算符
    132     float operator *(const Vector3 &a) const
    133     {
    134         return x * a.x + y * a.y + z * a.z;
    135     }
    136 
    137     /*
    138      * 非成员函数
    139      */
    140 
    141     //向量求模
    142     inline float vectorMag(const Vector3 &a)
    143     {
    144         return sqrt(a.x * a.x + a.y * a.y + a.z * a.z);
    145     }
    146 
    147     //向量叉乘
    148     inline Vector3 crossProduct(const Vector3 &a, const Vector3 &b)
    149     {
    150         return Vector3
    151         (
    152             a.x * b.y - a.y * b.x,
    153             a.y * b.z - a.z * b.y,
    154             a.z * b.x - a.x * b.z
    155         );
    156     }
    157 
    158     //标量左乘
    159     inline Vector3 operator *(float k, const Vector3 &v)
    160     {
    161         return Vector3(k * v.x, k * v.y, k * v.z);
    162     }
    163 
    164     //计算2点之间的距离
    165     inline float distance(const Vector3 &a, const Vector3 &b)
    166     {
    167         //得到向量
    168         float dx = a.x - b.x;
    169         float dy = a.y - b.y;
    170         float dz = a.z - b.z;
    171         //返回向量的大小
    172         return sqrt(dx * dx + dy * dy + dz * dz); 
    173     }
    174 
    175     //全局零向量
    176     extern const Vector3 kZeroVector;
    177 };
    Vector3
  • 相关阅读:
    在定义SharePoint列表的SPD数据视图的时候需要注意的问题
    如何自定义改变SharePoint 中列表Web部件中所有行某列中的固定值为图片或其它HTML代码
    [C#3] 1扩展方法
    特效编辑器开发手记2——cocos2dx粒子系统的plist文件 深圳
    让人死去活来的cocos2dx安卓开发环境搭建(windows+eclipse+ndk 不用cygwin)【上图】 深圳
    《疾风》开发手记:NxOgre最新版本的搭建20111020 深圳
    Linux 操作系统下CPU多核心的绑定 深圳
    巧用Unix时间戳 深圳
    AS3加载AS2的swf文件报错 深圳
    GLUT函数说明(转载) 深圳
  • 原文地址:https://www.cnblogs.com/coqn/p/3D.html
Copyright © 2020-2023  润新知