理解向量运算的向量类实现

时间:2017-05-05 14:10:34

标签: c++ class vector

我试图学习一些关于c ++类的知识,并决定遵循关于在c ++中实现向量数学的教程here。在大多数情况下,它的评论非常好,但这里有一行代码,我没有遵循,当我自己实现时,我的IDE(Xcode)抱怨它。在完成头文件的设置之后,作者向我们展示了这个向量类的构造函数:

CVector::CVector (float xi,float yi,float zi){ // Constructor
    x=xi;
    y=yi;
    z=zi;
    w=1.0f; // normalize the vector
}

首先:为什么' w'没有被传递给构造函数?我的想法是抱怨使用未声明的标识符' w' "

第二:有人通过规范化向量来了解他的意思吗?由于符号,我假设他正在为所有其他值指定浮点精度(即x,y和z将具有1个小数位)。是对的吗?如果我想要更高的精度,我会设置w = 1.000f; ?

2 个答案:

答案 0 :(得分:2)

在头文件中定义了

w。什么作者没有解释,假设每个人都知道它,你需要创建头文件 - 声明部分代码和实现文件,它将包含带有该头文件名称的指令#include。

#ifndef _CVECTOR_ // Check if C Vector is defined 
#define _CVECTOR_ // the next time CVector will be define
#define ZEROVECTOR CVector()
class  CVector    
{       // Private 
 float x,y,z,w; // Order list of 4 elements |x|y|z|w|

为什么需要w以及为什么用1初始化?这不是关于C ++,而是关于矢量数学,线性代数。

这并不是矢量的归一化。在3d运算中用于确定矢量是方向还是位置的第四个分量(所谓的半径矢量)。如果w = 1,则它是位置,变换矩阵中的偏移矢量将影响它。如果w = 0,则变换矩阵只能旋转矢量。如果w不是0或1,那么它就等于统一的空间尺度,但很少使用那种方式。

向量的归一化使其范数等于1,同时保持方向。但是对于4分量3d矢量范数,将仅归一化3个第一分量,留下w = 1或0。

该教程使用非常原始和旧版本的C ++,看起来它基于我的书,它有用90年代版本的C ++编写的类。 作者从实际用例中得到了这个,没有解释。这样的教程是两倍的坏。由于这是类的唯一构造函数,该类表示3D空间中的点,而不是向量。

C ++不能通过实例和死记硬背来学习,它不是一种脚本语言,你应该逐步学习理论和语法,然后你就不会有这样的问题。

答案 1 :(得分:1)

我认为变量x,y,z,w应该在你的CVector类定义的私有部分创建,但如果教程教你这样,请按照另一个教程,原因是这段代码并没有教你正确的c ++。

我假设标题上的类定义如下所示:

class CVector {
public:
    CVector(float xi, float yi, float zi);
private:
    float x;
    float y;
    float z;
    float w;
}

你的实现应该是这样的:

CVector::CVector(float xi, float yi, float zi) 
: x(xi), y(yi), z(zi), w(1.0f) {
}

此初始化样式比您使用的样式更快,更完整的解释here

使用1.0f初始化w的原因超出了我的范围,因为它看起来像是教程选择的常量。