2009-11-27 2 views
2

Mon application présente une carte (raster) mobile. Je dois être en mesure de montrer la base de la carte pivotée sur un angle donné. Le programme est actuellement en VC++/MFC mais le problème est générique. J'ai un bitmap source (CBitmap ou HBITMAP) et le dessine au contexte du périphérique (CDC) en utilisant StretchBlt. Bien que cela fonctionne rapidement et en douceur pour angle = 0 (et l'utilisateur peut saisir la carte en douceur avec la souris), ce n'est pas le cas si j'essaye de faire pivoter le bitmap et de le présenter (la rotation du bitmap avec SetWorldTransform) ou prend donc des centaines de millisecondes et c'est trop lent).Gérer une carte raster en rotation

Je pense que la solution est de pouvoir se rapporter uniquement aux pixels qui sont actuellement sur l'écran et ne pas tourner le bitmap source d'origine - et c'est la clé.

Si quelqu'un a une expérience avec une implémentation similaire, cela pourrait me sauver beaucoup d'efforts d'essais et d'erreurs. Merci! Avi.

Répondre

2

Il ressemble à SetWorldTransform est extrêmement lent: http://www.codeguru.com/Cpp/G-M/bitmap/specialeffects/article.php/c1743

Et tandis que les autres options présentées dans cet article sont plus rapides, il y a bien sûr d'autres meilleures solutions comme celui-ci: http://www.codeguru.com/cpp/g-m/gdi/article.php/c3693/ (vérifier les commentaires pour corrections et améliorations ainsi)

aussi voici quelques centriques algorithmes de rotation rapide non-Windows: http://www.ddj.com/windows/184416337?pgno=11

Notez que si vous garantissez pouvoir de 2 dimensions, vous pouvez obtenir des améliorations de vitesse significatives.

+0

Dans le premier article, ils disent: "GetRotatedBitmapNT() Cette fonction est spécifique à NT et ne fonctionnera pas sous Windows 95. C'est la plus simple et probablement la plus rapide des trois fonctions répertoriées dans cette rubrique." " ils prétendent que GetRotatedBitmapNT() est peut-être le plus rapide. Mais je vais passer en revue les autres liens et mettre à jour si je trouve une percée. Merci jusqu'à présent ... Avi. – Avi

1

Pour donner suite à ma question et a fourni de réponse, laissez-moi résumer comme suit:

  1. je l'algorithme mentionné à http://www.codeguru.com/cpp/g-m/gdi/article.php/c3693/.

  2. Cela fonctionne et offre de très bonnes performances et un affichage fluide.

  3. Il y avait quelques bogues dans ce que j'ai dû fixer aussi bien que simplifier les formules et le code dans certains cas.

  4. Je vais examiner l'algorithme mentionné à http://www.ddj.com/windows/184416337?pgno=11 pour voir s'il offre des performances de rupture qui valent la peine de l'adapter. Mon implémentation nécessitait l'utilisation d'un bitmap source de grande taille, je devais donc modifier le code pour ne pas faire pivoter le bitmap entier à chaque fois, mais seulement la partie pertinente qui sera affichée à l'écran (sinon la performance serait inacceptable) .

Avi.