2

私のアプリケーションは、(ラスター) 移動マップを表示します。任意の角度に基づいて回転したマップを表示できるようにする必要があります。プログラムは現在 VC++/MFC にありますが、問題は一般的なものです。ソース ビットマップ (CBitmap または HBITMAP) があり、StretchBlt を使用してデバイス コンテキスト (CDC) に描画します。angle=0 の場合、これは高速かつスムーズに機能しますが (ユーザーはマウスでマップをスムーズにつかむことができます)、ビットマップを回転させて表示しようとすると、これは当てはまりません (SetWorldTransform() を使用したビットマップの回転)。または数百ミリ秒かかり、これは遅すぎます)。

解決策は、現在画面上にあるピクセルのみに関連付けることができ、元のソース ビットマップを回転させないようにすることだと思います。これが鍵です。

誰かが同様の実装の経験があれば、多くの試行錯誤の努力を節約できるかもしれません. ありがとう!アビ。

4

2 に答える 2

2

SetWorldTransform が非常に遅いようです: http://www.codeguru.com/Cpp/GM/bitmap/specialeffects/article.php/c1743

その記事に示されている他のオプションはより高速ですが、もちろん、次のような他のより良いソリューションがあります: http://www.codeguru.com/cpp/gm/gdi/article.php/c3693/ (修正についてはコメントを確認してください)改善も)

また、Windows 中心ではない高速回転アルゴリズムもいくつかあります: http://www.ddj.com/windows/184416337?pgno=11

2 次元の累乗を保証すると、速度が大幅に向上することに注意してください。

于 2009-12-04T20:55:48.830 に答える
1

私の質問と提供された回答のフォローアップとして、次のことを要約しましょう。

  1. http://www.codeguru.com/cpp/gm/gdi/article.php/c3693/に記載されているアルゴリズムを使用しました。

  2. それは機能し、かなり優れたパフォーマンスとスムーズな表示を提供します。

  3. 場合によっては数式とコードを単純化するだけでなく、修正する必要があるバグがいくつかありました。

  4. http://www.ddj.com/windows/184416337?pgno=11に記載されているアルゴリズムを調べて、適応させる価値のあるブレークスルー パフォーマンスが得られるかどうかを確認します。

  5. 私の実装では大きなソース ビットマップを使用する必要があったため、毎回ビットマップ全体を回転させるのではなく、画面に表示される関連部分のみを回転させるようにコードを変更する必要がありました (そうしないと、パフォーマンスが許容できなくなります)。

アビ。

于 2010-01-02T19:16:20.403 に答える