2012-08-16 174 views
0

我有一个图像坐标系和一个图块坐标系。移位,缩放和旋转坐标系

我想知道瓦片坐标系中的点(u_img/v_img)。

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

我想要的是一样的东西(u_tile v_tile)= F(u_img,v_img,西格玛,航向,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); 

但实际上,我无法得到它的工作..任何解决办法?

+0

是结果而不是预期或有另一种错误? 'imgPixelSize'和'tilePixelSize'是什么类型?如果他们是整数,那么你的问题是整数除法,它不会产生预期的结果。 – denahiro 2012-08-16 08:27:05

+0

结果不是预期的,我认为我的转变是不正确的。 – yokolini 2012-08-16 08:33:41

+0

我改变了添加的功能标题,所以你可以看到imgPix和tilePix都是浮动的 – yokolini 2012-08-16 08:38:15

回答

0

可能是由于将中间结果投射到int造成的舍入误差?

这是准确

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

对'u_trans'和'v_trans'使用'int'可能会导致四舍五入,但最大为1像素。 – denahiro 2012-08-16 08:58:56

+0

@denahiro:也许,这是OP“没有工作”的意思? – Andrey 2012-08-16 09:02:31

+0

其实转换是错误的,但这个答案也有助于改进算法。 – yokolini 2012-08-16 09:44:39