• ベストアンサー

画像回転について

いつもお世話になります。 下記ソースにてビットマップの回転を実現させようとしております。 ソースの一部ですので処理概要を説明すると、 まず、編集用画像領域をimage[][]に格納しておいて、 バッファでデータのやり取りをしており、下記ソースで演算後、 BitBltしております。 そこで、三角関数の処理に公式を利用しているのですが、 どうも左回転してしまいます。右回転したいので 安直に下記RotX・RotYを入れ替えたら右回転したんですけど、 実際の表示位置とは反転してしまいます。 数学的な話だと思うのですが、正常に右回転する方法を ご存知の方、ご教授よろしくお願い致します。 開発環境はVC++6.0MFCです。 for (y = 0 ; y<Height ; y++) { //オリジナル針のY方向  for (x=0 ; x<Width ; x++) { //オリジナル針のX方向   double IncreX=x-2.5;  //針中心からのベクトル   double IncreY=y-31.5; //針中心からのベクトル   double RotX= IncreX*::cos(m_dSAngle)-IncreY*::sin(m_dSAngle);   double RotY= IncreX*::sin(m_dSAngle)+IncreY*::cos(m_dSAngle);   long Offset = long(50.0+RotY) * 100 + long(50.0+RotX);   ASSERT(Offset<100*100);   *(buf+Offset)=image[y][x];  } }

質問者が選んだベストアンサー

  • ベストアンサー
  • g_dori
  • ベストアンサー率47% (330/699)
回答No.2

他のソースが見えないので何とも言えませんが、多分ここのところが問題なんだと思いますのでアドバイスさせて頂きます。 DIBでの画像データは左下がオフセットとなり、右方向へなめて一段上へ・・・このように格納されています。 これを理解せずに回転しようとすると、反対方向へ回転しますので、DIBをバイナリレベルで扱う場合は注意してください。 image[0][0]は画像左下の座標なので、y座標の考え方を根本から反転してください。表示位置に影響が出たのはそのためだと思われます。 *DDサーフェイスはちゃんと左上が頂点ですが、過去の解答を見る限りDIBですよね? また、オリジナル側の画像を参照して回転すると、斜線がガタガタになったり、画像に穴ができたりします。 根本的な対策は、ここで言うところのbuf側から全部の座標を埋めていく事です。 ※ここで複数の座標を参照すれば綺麗な中間色が出せます。が、重い・・・ ソースは御自身で作成できると思いますので、頑張ってください。このままでよろしければ、yのあたりをチョコッと直せば済む筈です。 *私はWin32ベース(というか、こういう細かい部分はasm)で作るので、MFCベースのソースはちょっと・・なので。投げやりでごめんなさい。 また、回転拡大縮小はAPIに任せた方が楽だと思いますよ? 結局キャッシュミスが起こるので、アセンブラで作成しても大差ないです。 尚、参照URLの方が的確なアドバイスが選られると思います。 ご参考まで。

参考URL:
http://www.bio100.co.jp/

その他の回答 (1)

  • ranx
  • ベストアンサー率24% (357/1463)
回答No.1

角度の測り方は反時計回りが標準ですから、普通にやったのでは左回転 するでしょうね。 で、時計回りにするには、簡単です。角度をマイナスにすれば良いのです。 ご質問の例ではm_dsAngleを(-m_dsAngle)で入れ替えればよいことになります。