C++ 移动、缩放和旋转坐标系

C++ 移动、缩放和旋转坐标系,c++,rotation,system,translation,coordinate,C++,Rotation,System,Translation,Coordinate,我有一个图像坐标系和一个瓷砖坐标系 我想知道瓷砖坐标系中的点(u_img/v_img) 坐标系用sigma进行缩放。u_img=西格玛*u_瓦; 偏移在平铺坐标系中给出。 两个坐标系之间的旋转角度为航向 我想要的是(u_tile v_tile)=f(u_img,v_img,sigma,heading,u_trans,v_trans) 我从以下几点开始: void image2tile( uint u_img, uint v_img, int u_tran

我有一个图像坐标系和一个瓷砖坐标系

我想知道瓷砖坐标系中的点(u_img/v_img)

坐标系用sigma进行缩放。u_img=西格玛*u_瓦; 偏移在平铺坐标系中给出。 两个坐标系之间的旋转角度为航向

我想要的是(u_tile v_tile)=f(u_img,v_img,sigma,heading,u_trans,v_trans)

我从以下几点开始:

void   image2tile( uint u_img, uint v_img,
                   int u_trans_tile, int v_trans_tile,
                   float imgPixelSize, float tilePixelSize,
                   float heading,
                   int& u_tile, int& v_tile )
{
      float ratio = imgPixelSize / tilePixelSize;
      int u_trans = u_img * ratio + u_trans_tile;
      int v_trans = v_img * ratio + v_trans_tile;

      v_tile = floor( v_trans * cos( heading ) + u_trans * sin ( heading ) );
      u_tile = floor( -v_trans * sin( heading ) + u_trans * cos ( heading ) );
}
有一些结果似乎是合理的,但如果我把u_img=0和v_img=0放进去,我会得到u_trans_tile和v_trans_tile,而事实并非如此

我认为解决方案可能是这样的:

1.)将平铺坐标中的平移转换为图像坐标 2.)之后,它只是一个法线变换,使用比例因子乘以旋转矩阵乘以点向量,再加上新的平移向量

u\u trans\u tile->u\u trans\u img v_trans_tile->u_trans_img

  v_tile = floor( ratio*( v_img * cos( heading ) + u_img * sin ( heading ) + u_trans_img);
  u_tile = floor( ratio*(-v_img * sin( heading ) + u_img * cos ( heading ) + v_trans_img);

但事实上我没能让它工作。。有什么解决方案吗?

可能是由于将中间结果强制转换为
int
所导致的舍入错误

这是准确的

  float u_trans = u_img * ratio + u_trans_tile;
  float v_trans = v_img * ratio + v_trans_tile;

结果是否不是预期的,或者是否存在其他错误?什么类型是
imgPixelSize
tilePixelSize
?如果它们是整数,那么您的问题是整数除法,它不会产生预期的结果。结果不是预期的结果,我认为我的转换不正确。我更改了添加的函数头,以便您可以看到imgPix和tilePix都是浮点数。您是否检查了
cos(m_currGpsPos_s.heading)
返回您期望的值?否则,您的转换看起来是正确的,尽管当您切换
v_tile
u_tile
的顺序时,代码有些混乱。我编辑了我的问题,也许这会对您有所帮助。我真的认为我没有正确的转换。对
u_trans
v_trans
使用
int
可能会导致舍入,但最大值为1像素。实际上转换是错误的,但这个答案也有助于改进算法。@Andrey我很抱歉我的评论听起来是否定的。我想你指出了一个重要的错误。我只是想补充一点,这会导致一个小错误。@yokolini:旋转角度是如何定义的?确保它在弧度方向上,并且是相对于x轴的逆时针方向。它在弧度方向上,并且是逆时针方向。u_img和v_img=0和heading=0的简单结果是错误的!