我试图学习一些关于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; ?
答案 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的原因超出了我的范围,因为它看起来像是教程选择的常量。