0

画像座標系とタイル座標系があります。

タイル座標系のポイント(u_img / v_img)を知りたいです。

座標系はシグマでスケーリングされます。u_img = シグマ * u_tile; シフトはタイル座標系で与えられます。2 つの座標系の間の回転角度が進行方向です。

私が欲しいのは (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);

しかし、実際にはそれを機能させることができませんでした..何か解決策はありますか?

4

1 に答える 1

0

中間結果を にキャストすることによって発生する丸め誤差が原因intでしょうか?

これは正確です

  float u_trans = u_img * ratio + u_trans_tile;
  float v_trans = v_img * ratio + v_trans_tile;
于 2012-08-16T08:48:27.777 に答える