3d数学基础-向量相关操作-用C++实现
来源:互联网 发布:2000年人口普查数据 编辑:程序博客网 时间:2024/04/24 22:29
//计算向量的模,负向量,零向量,标量与向量的乘法,标准化向量,向量的加法和减法 ,距离公式,点乘,叉乘
#include <iostream.h>
#include <math.h>
class Vector3
{
private:
double x, y, z; //在数学上的表示 [x,y,z] , 这里的我们定义为成员变量
public:
Vector3(){}
Vector3(const Vector3& a) : x(a.x), y(a.y), z(a.z){}
Vector3(double a, double b, double c) : x(a), y(b), z(c){}
void zero() //设置为零向量
{
x = y = z = 0;
}
Vector3 operator-() const //负向量
{
return Vector3(-x, -y, -z);
}
Vector3 operator*(float a) const //标量必须在右边
{
return Vector3(x*a, y*a, z*a);
}
Vector3 operator*=(float a) //标量必须在右边
{
x*=a; y*=a; z*=a;
return *this;
}
Vector3 operator/(float a) const //标量必须在右边
{
float oneOverA = 1.0f/a; //计算机中的除法速度比较慢
return Vector3(x*oneOverA, y*oneOverA, z*oneOverA); //目的是速度快一点
}
Vector3 operator/=(float a) //标量必须在右边
{
float oneOverA = 1.0f/a;
x*=oneOverA; y*=oneOverA; z*=oneOverA;
return *this;
}
//向量的加法,两个向量相加
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+=(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;
}
//向量的标准化操作,单位向量
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;
}
//叉乘
friend Vector3 crossProduct(const Vector3& a, const Vector3& b);
friend void print_v(Vector3 v);
friend double vectorMag(const Vector3& a);
friend Vector3 operator*(float k, const Vector3& v); //定义标量的左乘
friend float distance(const Vector3& a, const Vector3& b); //两点之间的距离
};
double vectorMag(const Vector3& a) //计算模
{
return sqrt(a.x*a.x + a.y*a.y + a.z*a.z);
}
void print_v(Vector3 v)
{
cout<<"["<<v.x<<", "<<v.y<<", "<<v.z<<"]"<<endl;
}
Vector3 operator*(float k, const Vector3& v)
{
return Vector3(k*v.x, k*v.y, k*v.z);
}
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);
//以上代码可以用一句代替
return vectorMag(a-b);
}
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
);
}
int main()
{
cout<<"hello, vector"<<endl;
/*Vector3 v1(10, 20, 30);
print_v(v1);
Vector3 v2=v1;
print_v(v2);
Vector3 v3 = -v1;
print_v(v3);
v2.zero();
print_v(v2);
Vector3 v4(5,-4,7);
cout<<vectorMag(v4)<<endl; //计算大小,模,长度
//向量与标量相乘
Vector3 v5(1,2,3);
Vector3 v6 = v5*(2);
print_v(v6);
//向量与标量相除
Vector3 v1(2,4,6);
Vector3 v2 = v1/2;
print_v(v2);
//向量与标量相乘另一个方式
Vector3 v5(1,2,3);
Vector3 v6 = (v5*=2);
print_v(v6);
//向量与标量相除另一个方式
Vector3 v1(2,4,6);
Vector3 v2 = (v1/=2);
print_v(v2);
//标量的左乘
Vector3 v5(1,2,3);
Vector3 v6 = (2)*v5;
print_v(v6);
//向量的标准化,单位向量, 我们把最后一个数设为0,就变成了2D的了
Vector3 v5(12,-5, 0);
v5.normalize();
print_v(v5);
//向量的加法
Vector3 a(1,2,3);
Vector3 b(1,2,3);
Vector3 c = a+b;
print_v(c);
Vector3 d(1,1,1);
d += a;
print_v(d);
//向量的减法
Vector3 a(3,3,3);
Vector3 b(2,2,2);
Vector3 c;
c = a-b;
print_v(c);
a -= c;
print_v(a);
//两点之间的距离
Vector3 a(3,3,0); //2D
Vector3 b(2,2,0); //2D
float d = distance(a, b);
cout<<d<<endl;
//点乘
Vector3 a(3,-2,7);
Vector3 b(0,4,-1);
float dp = a*b;
cout<<dp<<endl;
//计算两个向量的夹角
Vector3 a(3,-2,7);
Vector3 b(0,4,-1);
float dp = a*b;
double arc = acos(dp/(vectorMag(a)*vectorMag(b)))*180/3.1415;
cout<<arc<<endl; //117.522度
//叉乘
Vector3 a(1,3,4);
Vector3 b(2,-5,8);
Vector3 dp = crossProduct(a,b);
print_v(dp);
*/
return 0;
}
#include <iostream.h>
#include <math.h>
class Vector3
{
private:
double x, y, z; //在数学上的表示 [x,y,z] , 这里的我们定义为成员变量
public:
Vector3(){}
Vector3(const Vector3& a) : x(a.x), y(a.y), z(a.z){}
Vector3(double a, double b, double c) : x(a), y(b), z(c){}
void zero() //设置为零向量
{
x = y = z = 0;
}
Vector3 operator-() const //负向量
{
return Vector3(-x, -y, -z);
}
Vector3 operator*(float a) const //标量必须在右边
{
return Vector3(x*a, y*a, z*a);
}
Vector3 operator*=(float a) //标量必须在右边
{
x*=a; y*=a; z*=a;
return *this;
}
Vector3 operator/(float a) const //标量必须在右边
{
float oneOverA = 1.0f/a; //计算机中的除法速度比较慢
return Vector3(x*oneOverA, y*oneOverA, z*oneOverA); //目的是速度快一点
}
Vector3 operator/=(float a) //标量必须在右边
{
float oneOverA = 1.0f/a;
x*=oneOverA; y*=oneOverA; z*=oneOverA;
return *this;
}
//向量的加法,两个向量相加
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+=(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;
}
//向量的标准化操作,单位向量
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;
}
//叉乘
friend Vector3 crossProduct(const Vector3& a, const Vector3& b);
friend void print_v(Vector3 v);
friend double vectorMag(const Vector3& a);
friend Vector3 operator*(float k, const Vector3& v); //定义标量的左乘
friend float distance(const Vector3& a, const Vector3& b); //两点之间的距离
};
double vectorMag(const Vector3& a) //计算模
{
return sqrt(a.x*a.x + a.y*a.y + a.z*a.z);
}
void print_v(Vector3 v)
{
cout<<"["<<v.x<<", "<<v.y<<", "<<v.z<<"]"<<endl;
}
Vector3 operator*(float k, const Vector3& v)
{
return Vector3(k*v.x, k*v.y, k*v.z);
}
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);
//以上代码可以用一句代替
return vectorMag(a-b);
}
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
);
}
int main()
{
cout<<"hello, vector"<<endl;
/*Vector3 v1(10, 20, 30);
print_v(v1);
Vector3 v2=v1;
print_v(v2);
Vector3 v3 = -v1;
print_v(v3);
v2.zero();
print_v(v2);
Vector3 v4(5,-4,7);
cout<<vectorMag(v4)<<endl; //计算大小,模,长度
//向量与标量相乘
Vector3 v5(1,2,3);
Vector3 v6 = v5*(2);
print_v(v6);
//向量与标量相除
Vector3 v1(2,4,6);
Vector3 v2 = v1/2;
print_v(v2);
//向量与标量相乘另一个方式
Vector3 v5(1,2,3);
Vector3 v6 = (v5*=2);
print_v(v6);
//向量与标量相除另一个方式
Vector3 v1(2,4,6);
Vector3 v2 = (v1/=2);
print_v(v2);
//标量的左乘
Vector3 v5(1,2,3);
Vector3 v6 = (2)*v5;
print_v(v6);
//向量的标准化,单位向量, 我们把最后一个数设为0,就变成了2D的了
Vector3 v5(12,-5, 0);
v5.normalize();
print_v(v5);
//向量的加法
Vector3 a(1,2,3);
Vector3 b(1,2,3);
Vector3 c = a+b;
print_v(c);
Vector3 d(1,1,1);
d += a;
print_v(d);
//向量的减法
Vector3 a(3,3,3);
Vector3 b(2,2,2);
Vector3 c;
c = a-b;
print_v(c);
a -= c;
print_v(a);
//两点之间的距离
Vector3 a(3,3,0); //2D
Vector3 b(2,2,0); //2D
float d = distance(a, b);
cout<<d<<endl;
//点乘
Vector3 a(3,-2,7);
Vector3 b(0,4,-1);
float dp = a*b;
cout<<dp<<endl;
//计算两个向量的夹角
Vector3 a(3,-2,7);
Vector3 b(0,4,-1);
float dp = a*b;
double arc = acos(dp/(vectorMag(a)*vectorMag(b)))*180/3.1415;
cout<<arc<<endl; //117.522度
//叉乘
Vector3 a(1,3,4);
Vector3 b(2,-5,8);
Vector3 dp = crossProduct(a,b);
print_v(dp);
*/
return 0;
}
0 0
- 3d数学基础-向量相关操作-用C++实现
- 3d数学基础:常用向量相关运算
- 3d数学基础-向量
- 3D数学基础--向量
- 3D数学基础 - 坐标系、向量、矩阵
- 3D数学基础 - 坐标系、向量、矩阵
- 3D游戏引擎数学基础3--向量(下篇)
- 3D程序开发数学基础之向量
- [Unity3D学习]3D数学基础之向量
- [Unity3D学习]3D数学基础之向量
- [Unity3D学习]3D数学基础之向量
- 3D游戏引擎数学基础2--向量(上篇)
- 3d数学基础-计算行列式-用C++代码实现
- 3D数学基础:图形与游戏开发(第6章3D向量类)笔记
- 【数学】3D数学基础
- 3D数学基础
- 3D数学基础
- 3D数学基础
- NVSRAM:不再需要电池的非易失性存储方案
- Winform控件之分组类控件
- 计算几何-UESTC 484 Division
- 类handler
- 九度oj 1349 数字在排序数组中出现的次数
- 3d数学基础-向量相关操作-用C++实现
- 为 checkbox 添加事件,使选中和非选中时改变其他几个checkbox的可选状态
- 浅谈root原理以及已知漏洞的分析
- cordova webview的使用
- 管理软件的痛处
- 【c#第五次作业】测试 Html2Article 并添加保存功能
- select/poll/epoll之间的区别总结(个人理解)
- 【Linux操作系统】Red Hat中的文件
- 阿庆SQL智能查询分析器,使用delphi开发的一个数据库查询分析管理工具.分享给大家