📄 vector.cpp
字号:
#include "vector.h"
double PI=4*atan(1.0);
//////////////////////////////////////////////////////////////////////
//
// 坐标转化和矢量运算
//
//////////////////////////////////////////////////////////////////////
/*doublexyzVector RTPtoXYZ(doubleVector r); //将球坐标转化为直角坐标
doublexyzVector XYZadd(doublexyzVector x,doublexyzVector y); //两矢量相加
doublexyzVector XYZsub(doubleVector rise,doubleVector end); //两矢量相减
doublexyzVector XYZmult(double c,doublexyzVector); //矢量乘常数
double dotmult(doubleVector X,doubleVector Y); //矢量点乘
double XYZdotmult(doublexyzVector x,doublexyzVector y); //直角坐标系矢量点乘
double MO(doublexyzVector x); //矢量的模
double area(doubleVector A,doubleVector B,doubleVector C); //三角形的面积
void printdoubleVector(doubleVector r); //显示点的球坐标系的参量
void printdoublexyzVector(doublexyzVector r); //显示点的直角坐标系的参量*/
//将球坐标转化为直角坐标
doubleVector Vectorset(double r,double thinc,double phinc)
{
doubleVector Vectorset;
Vectorset.R=r;
Vectorset.thinc=thinc;
Vectorset.phinc=phinc;
return Vectorset;
}
doublexyzVector RTPtoXYZ(doubleVector r)
{
doublexyzVector RTPtoXYZ;
double sinth;
sinth = sin(r.thinc);
RTPtoXYZ.x = r.R*sinth*cos(r.phinc);
RTPtoXYZ.y = r.R*sinth*sin(r.phinc);
RTPtoXYZ.z = r.R*cos(r.thinc);
return RTPtoXYZ;
}
doubleVector XYZtoRTP(doublexyzVector p)
{
doubleVector Z;
double x,y,z,r,PHINC,temp;
x=p.x;
y=p.y;
z=p.z;
r=sqrt(x*x+y*y+z*z);
Z.R=r;
Z.thinc=acos(z/r);
temp=asin(x/sqrt(x*x+y*y));
if(y>=0)
{
if(x>0)
PHINC=temp;
else
PHINC=PI+temp;
}
else
{
if(x>0)
PHINC=PI+temp;
else
PHINC=2*PI+temp;
}
Z.phinc=PHINC;
return Z;
}
//两矢量相加
doublexyzVector XYZadd(doublexyzVector x,doublexyzVector y)
{
doublexyzVector XYZadd;
XYZadd.x = y.x + x.x;
XYZadd.y = y.y + x.y;
XYZadd.z = y.z + x.z;
return XYZadd;
}
//两矢量相减
doublexyzVector XYZsub(doublexyzVector x,doublexyzVector y)
{
doublexyzVector XYZsub;
XYZsub.x = y.x - x.x;
XYZsub.y = y.y - x.y;
XYZsub.z = y.z - x.z;
// cout<<"x "<<XYZsub.x<<" y "<<XYZsub.y<<" z "<<XYZsub.z<<endl;
return XYZsub;
}
//两矢量相减
doublexyzVector RTPsub(doubleVector rise,doubleVector end)
{
doublexyzVector XYZsub;
doublexyzVector x;
doublexyzVector y;
x=RTPtoXYZ(rise);
y=RTPtoXYZ(end);
XYZsub.x = y.x - x.x;
XYZsub.y = y.y - x.y;
XYZsub.z = y.z - x.z;
// cout<<"x "<<XYZsub.x<<" y "<<XYZsub.y<<" z "<<XYZsub.z<<endl;
return XYZsub;
}
//矢量乘常数
doublexyzVector XYZmult(double c,doublexyzVector X)
{
doublexyzVector XYZmult;
XYZmult=X;
XYZmult.x *=c;
XYZmult.y *=c;
XYZmult.z *=c;
return XYZmult;
}
//矢量杈乘
doublexyzVector XYZVMult(doublexyzVector X,doublexyzVector Y)
{
doublexyzVector XYZVMult;
XYZVMult.x =X.y*Y.z -X.z*Y.y;
XYZVMult.y =X.z*Y.x -X.x*Y.z;
XYZVMult.z =X.x*Y.y -X.y*Y.x;
return XYZVMult;
}
//求直角坐标系中某矢量的单位矢量
doublexyzVector Enxyz(doublexyzVector X)
{
doublexyzVector Enxyz;
double mo;
Enxyz=X;
mo=sqrt(pow(Enxyz.x,2) + pow(Enxyz.y,2) + pow(Enxyz.z,2));
Enxyz.x /=mo;
Enxyz.y /=mo;
Enxyz.z /=mo;
return Enxyz;
}
//求球坐标系中某矢量的单位矢量
doubleVector En(doubleVector X)
{
doubleVector En;
En.R =1;
return En;
}
//球坐标系矢量点乘
double dotmult(doubleVector X,doubleVector Y)
{
double dotmult;
doublexyzVector x;
doublexyzVector y;
x=RTPtoXYZ(X);
y=RTPtoXYZ(Y);
dotmult= x.x*y.x + x.y*y.y + x.z*y.z;
return dotmult;
}
//直角坐标系矢量点乘
double XYZdotmult(doublexyzVector x,doublexyzVector y)
{
double XYZdotmult;
XYZdotmult= x.x*y.x + x.y*y.y + x.z*y.z;
return XYZdotmult;
}
//矢量的模
double MO(doublexyzVector x)
{
double MO;
MO=sqrt(pow(x.x,2) + pow(x.y,2) + pow(x.z,2));
return MO;
}
//三角形的面积
double area(doubleVector A,doubleVector B,doubleVector C)
{
double a,b,c;
double p,s;
a=MO(RTPsub(B,C));
b=MO(RTPsub(C,A));
c=MO(RTPsub(A,B));
//cout<<"a "<<a<<" b "<<b<<" c "<<c<<endl;
p=0.5*(a+b+c);
s=sqrt((p-a)*(p-b)*(p-c)*p);
return s;
}
//显示点的球坐标系的参量
void printdoubleVector(doubleVector r)
{
cout<<"R = "<<r.R<<" thinc = "<<180*r.thinc/PI<<" phinc = "<<180*r.phinc/PI<<endl;
}
//显示点的直角坐标系的参量
void printdoublexyzVector(doublexyzVector r)
{
cout<<"X = "<<r.x<<" Y = "<<r.y<<" Z = "<<r.z<<" 模 "<<MO(r)<<endl;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -