使用C++标准库-复数实现二维笛卡尔坐标系的坐标变换

二维笛卡尔坐标系旋转问题可以描述如下:有两套笛卡尔坐标系,分别是XOYX'O'Y'X'O'Y'相对于XOY坐标系进行了平移(x_shift, y_shift)和旋转angle(弧度)变换,一个点在XOY坐标系中的坐标为:(x, y),计算该点在X'O'Y'坐标系中的坐标:(x_prime, y_prime),并计算转化时间。

对于笛卡尔坐标系的转换,通过C++标准库<cmath>中的三角函数可以实现平移和旋转,现提供一种方法-使用C++中复数模板模板complex<>实现。核心思想是将笛卡尔坐标系转换为极坐标系,然后调用模板算法很容易就能实现,废话少说,核心代码:

typedefstruct_DC_COORD {

    double x;

    double y;

}ST_DC_COORD, *PST_DC_COORD;

typedefstruct_RT_DC_COORD {

    double x_shift;

    double y_shift;

    double angle;

}ST_RT_DC_COORD,*PST_RT_DC_COORD;

CoordTf(ST_RT_DC_COORD coordRt, ST_DC_COORD &coord,double &timeSpend){

    complex<double> cCoord(coord.x, -coord.y);//将坐标转换为极坐标

    complex<double> cShift(coordRt.x_shift, -coordRt.y_shift);//平移极坐标

    auto f_shift = [](complex<double> source, complex<double> shift) { return (source-shift); };//定义平移lambda表达式

    auto start =chrono::system_clock::now();

    cCoord = f_shift(cCoord, cShift);

    complex<double> cRotateRes = polar(abs(cCoord),arg(cCoord) + coordRt.angle);

//重新生成新的极坐标,模不变为abs(cCoord),角度变化量仍为旋转角度

    coord.x = cRotateRes.real();

    coord.y =-cRotateRes.imag();

//分别提取实部和虚部得到新的笛卡尔坐标

    auto end = chrono::system_clock::now();

    auto duration =chrono::duration_cast<chrono::microseconds>(end- start);

    double temp = double(duration.count()) * chrono::nanoseconds::period::num / chrono::seconds::period::den;//使用

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
public class CoordTrans7Param { public double[,] values=new double[7,1]; //{{dx},{dy},{dz},{rx},{ry},{rz},{k}}; //public double   两个坐标系转换一般需要平移,旋转,缩放共七参数。 Y=(1+k)*M(x,y,z)*X+dX; public double[,] values=new double[7,1]; //{{dx},{dy},{dz},{rx},{ry},{rz},{k}}; //public double dx,dy,dz,rx,ry,rz,k; public void Set4Param(double dx,double dy,double dz,double k) { this.dx=dx; this.dy=dy; this.dz=dz; this.k=k; this.rx=this.ry=this.rz=0; } public void SetRotationParamRad(double rx,double ry,double rz) { this.rx=rx; this.ry=ry; this.rz=rz; } public void SetRotationParamMM(double rx,double ry,double rz) { SetRotationParamRad(rx*Math.PI/648000,ry*Math.PI/648000,rz*Math.PI/648000); } private double[,] GetMx() { double [,] Mx=new double[,] {{1,0,0}, {0,Math.Cos(rx),Math.Sin(rx)}, {0,-Math.Sin(rx),Math.Cos(rx)}}; return Mx; } private double[,] GetMy() { double [,] My=new double[,] {{Math.Cos(ry),0,-Math.Sin(ry)}, {0,1,0}, {Math.Sin(ry),0,Math.Cos(ry)}}; return My; } private double[,] GetMz() { double [,] Mz=new double[,] {{Math.Cos(rz),Math.Sin(rz),0}, {-Math.Sin(rz),Math.Cos(rz),0}, {0,0,1}}; return Mz; } private double[,] GetM() //M=Mx*My*Mz? or M=Mz*My*Mx? { double [,] M=new double[3,3]; MatrixTool.Multi(GetMz(),GetMy(),ref M); MatrixTool.Multi(M,GetMx(),ref M); return M; } private double[,] GetMdx() { double[,] mt = {{ 0, 0, 0 }, { 0, -Math.Sin(rx), Math.Cos(rx) }, { 0, -Math.Cos(rx), -Math.Sin(rx) }}; double[,] m=new double[3,3]; MatrixTool.Multi(GetMz(),GetMy(),ref m); MatrixTool.Multi(m,mt,ref m); return m; } private double[,] GetMdy() { double[,] mt = {{ -Math.Sin(ry), 0, -Math.Cos(ry) }, { 0, 0, 0 }, { Math.Cos(ry), 0, -Math.Sin(ry) }}; double[,] m=new double[3,3]; MatrixTool.Multi(GetMz(),mt,ref m); MatrixTool.Multi(m,GetMx(),ref m); return m; } private double[,] GetMdz() { double[,] mt = {{ -Math.Sin(rz), Math.Co

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值