移位,缩放和旋转坐标系

时间:2012-08-16 08:18:36

标签: c++ rotation system translation coordinate

我有一个图像坐标系和一个平铺坐标系。

我想知道平铺坐标系中的Point(u_img / v_img)。

坐标系用sigma缩放。 u_img = sigma * u_tile; 在平铺坐标系中给出了移位。 两个坐标系之间的旋转角度是标题。

我想要的是(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_trans_tile - > u_trans_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);

但实际上我无法让它发挥作用..任何解决方案?

1 个答案:

答案 0 :(得分:0)

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

这是准确的

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