向量(vector) a ⃗ = [ x , y , z ] \vec a=[x,y,z] a=[x,y,z]应用较广,比如节点的坐标 x ⃗ = [ x , y , z ] \vec x=[x,y,z] x=[x,y,z]、面的面积矢量 S ⃗ f = [ S f x , S f y , S f z ] \vec{S}_f=[Sf_x,Sf_y,Sf_z] Sf=[Sfx,Sfy,Sfz],面空间速度矢量 u ⃗ = [ u , v , w ] \vec u=[u,v,w] u=[u,v,w]等,都离不开它。同时,向量还有点乘、叉乘、求模(也称为幅值或二范数)的运算,以及向量与向量或标量的加减操作、向量与标量的乘除运算等。那么,咱们可以用C++定义一个向量类myVector,其包含三个成员变量 x , y , z x,y,z x,y,z,可通过三个分量来构造,也可通过另一个myVector对象来构造,重载操作符+、-、*、/来完成相关运算,重载赋值符=,重载输出流<<来实现输出,定义友元函数dotProduct、crossProduct、norm来计算点乘、叉乘、求模……
注意:这里的myVector和C++里自带的库文件vector不同,这里只是含3个分量的空间矢量,而C++中的vector则更类似于一维变长度数组。
矢量类 myVector的框架如下:
成员变量
- 矢量在x方向的三个分量
- 矢量在y方向的三个分量
- 矢量在z方向的三个分量
成员函数
- 构造函数1,由三个分量构造,缺省值为0
- 构造函数2,由另一个矢量构造,即,拷贝构造
- 析构函数,由于没有指针和动态释放空间,所以啥也不用做
- print函数,输出(x, y, z)
- 提取x,y,z分量的getX,getY,getZ函数
- 设置x,y,z分量的setX,setY,setZ函数
- 同时设置x,y,z分量的setVal函数,缺省值是0
- 赋值函数=,两个矢量间的赋值,即,拷贝赋值
- 操作符+:矢量+矢量,矢量+标量
- 操作符-:矢量-矢量,矢量-标量
- 操作符+=:矢量+=矢量,矢量+=标量
- 操作符-=:矢量-=矢量,矢量-=标量
- 操作符* :矢量 * 标量,标量 * 矢量
- 操作符/ :矢量 / 标量
- 操作符 *=:矢量 *= 标量
- 操作符 /=:矢量 /= 标量
- 点乘dotProduct:,完成两向量的点积
- 叉乘crossProduct:,完成两向量的叉积
- 输出流 <<:输出向量
- 幅值norm:计算向量幅值/二范数/模
- 单位化unit:向量除以其幅值
写好的程序如下:
myVector.h头文件
// 2020-06-09
// class myVector
// definition and functions of a vector [x, y, z]
// can be used for points, velocity, etc. in CFD
#ifndef myVector_H
#