2012-08-16 142 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