二维笛卡尔坐标系旋转问题可以描述如下:有两套笛卡尔坐标系,分别是XOY和X'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;//使用