第六章3D接口类
这本书的第六章主要写了一个工具类,用作之前所描述的概念中向量的计算还有一些运算符的重载,是用C++写的。
因经验等原因.我对代码设计方面还不是很了解,也没有系统学习过C++,,总之先贴出本书章节中的C++代码。
#include<math.h>
class Vector3 {
public:
float x, y, z;
//构造函数
//默认构造函数,不执行任何操作
Vector3() {}
//复制构造函数
Vector3(const Vector3 &a) : x(a.x), y(a.y), z(a.z){}
//带参数的构造函数,用三个值完成初始化
Vector3(float nx, float ny, float nz) :x(nx), y(ny), z(nz){}
//标准对象操作
//坚持C语言的习惯,重载赋值运算符,并返回引用,以实现左值。
Vector3 &operator = (const Vector3 &a){
x = a.x; y = a.y; z = a.z;
return *this;
}
// 重载 "" == "" 操作符
bool operator == (const Vector3 &a) const{
return x == a.x && y == a.y && z == a.z;
}
bool operator != (const Vector3 &a) const{
return x != a.x || y != a.y || z != a.z;
}
//向量运算
//置为零向量
void zero() { x = y = z = 0.0f; };
//重载一元"-"运算符
Vector3 operator - () const { return Vector3(-x, -y, -z); };
//重载二元 "+" 和 "-" 运算符
Vector3 operator + (const Vector3 &a) const {
return Vector3(x + a.x, y + a.y, z + a.z);
}
Vector3 operator - (const Vector3 &a) const {
return Vector3(x - a.x, y - a.y, z - a.z);
}
//与标量的乘、除法
Vector3 operator *(float a) const{
return Vector3(x * a, y * a, z * a);
}
Vector3 operator /(float a) const{
float oneOverA = 1.0f / a; //注意:这里不对"除零"进行检查
return Vector3(x * oneOverA, y * oneOverA, z *oneOverA);
}
//重载自反运算符
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;
}
//向量标准化
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;
}
}
//向量点乘,重载标准的乘法运算符
float operator * (const Vector3 &a) const {
return x * a.x + y * a.y + z * a.z;
}
};
//
//非成员变量
//
//求向量模
inline float vectorMag(const Vector3 &a){
return sqrt(a.x * a.x + a.y * a.y + a.z * a.z);
}
//向量叉乘
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
};
}
//实现标量左值
inline Vector3 operator *(float k, const Vector3 &v){
return Vector3(k*v.x, k*v.y, k*v.z);
}
//计算两次间的距离
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);
}
//全局变量
//提供一个全局零向量
extern const Vector3 kZeroVector;
float vectorMag(const Vector3 &a);
感谢vs的类图功能,让我省去了画类图的时间。
下面本人由于Unity的关系对于C#还是比较熟悉的,想把这段 改成C#形式后用。
class Vector3D
{
public float x, y, z;
//构造函数
//默认构造函数,不执行任何操作
Vector3D() { }
//复制构造函数
Vector3D(Vector3D a)
{
this.x = a.x;
this.y = a.y;
this.z = a.z;
}
//带参数的构造函数,用三个值完成初始化
Vector3D(float nx, float ny, float nz)
{
this.x = nx;
this.y = ny;
this.z = nz;
}
//标准对象操作
//坚持C语言的习惯,重载赋值运算符,并返回引用,以实现左值。
//!---C#不支持重载“=“运算符---!//
// 重载 "" == "" 操作符
public static bool operator ==(Vector3D a, Vector3D b)
{
return b.x == a.x && b.y == a.y && b.z == a.z;
}
// 重载 "" != "" 操作符
public static bool operator !=(Vector3D a, Vector3D b)
{
return b.x != a.x || b.y != a.y || b.z != a.z;
}
//向量运算
//置为零向量
void zero() { x = y = z = 0.0f; }
//重载一元"-"运算符
Vector3D operator +(Vector3D a, Vector3D b)
{
return new Vector3D(a.x + b.x, a.y + a.y, a.z + b.z);
}
Vector3D operator -(Vector3D a, Vector3D b)
{
return new Vector3D(b.x - a.x, b.y - a.y, b.z - a.z);
}
//与标量的乘、除法
Vector3D operator *(float a, Vector3D b)
{
return new Vector3D(b.x * a, b.y * a, b.z * a);
}
Vector3D operator /(float a, Vector3D b)
{
float oneOverA = 1.0f / a; //注意:这里不对"除零"进行检查
return new Vector3D(b.x * oneOverA, b.y * oneOverA, b.z * oneOverA);
}
//C#不能显示重载*=,+=,-=,、=自反运算符,已经嵌入在了一元运算符之中
向量标准化
void normalize()
{
float magSq = x * x + y * y + z * z;
if (magSq > 0.0f)
{ //检查除零
float oneOverMag = (float)(1.0f / System.Math.Sqrt(magSq));
x *= oneOverMag;
y *= oneOverMag;
z *= oneOverMag;
}
}
//向量点乘,重载标准的乘法运算符
float operator *(Vector3D a, Vector3D b)
{
return b.x * a.x + b.y * a.y + b.z * a.z;
}
public const Vector3D kZeroVector = new Vector3D();
}