2012-08-16 1 views
0

저는 이미지 좌표계와 타일 좌표계를 가지고 있습니다.시프트, 스케일 및 회전 좌표계

타일 좌표계에서 Point (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

+0

결과가 예상과 다르다. 변형이 올바르지 않다고 생각한다. – yokolini

+0

imgPix와 tilePix가 모두 float이라는 것을 알 수 있도록 함수 헤더를 추가했습니다. – yokolini

답변

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

+0

@denahiro : 어쩌면 OP가 "작동하지 않는다"는 의미일까요? – Andrey

+0

실제로 변형은 잘못되었지만이 답변은 알고리즘 개선에도 도움이되었습니다. – yokolini