2 Stimmen

Verwalten von gedrehten beweglichen Rasterkarten

Meine Anwendung stellt eine (Raster-)Wanderkarte dar. Ich muss in der Lage sein, die Karte um einen beliebigen Winkel gedreht darzustellen. Das Programm ist derzeit in VC++/MFC, aber das Problem ist allgemeiner Natur. Ich habe eine Quellbitmap (CBitmap oder HBITMAP) und zeichne sie mit StretchBlt in den Gerätekontext (CDC). Während dies schnell und reibungslos für Winkel=0 funktioniert (und der Benutzer kann die Karte reibungslos mit der Maus greifen), ist dies nicht der Fall, wenn ich versuche, die Bitmap zu drehen und dann zu präsentieren (die Drehung der Bitmap mit SetWorldTransform() oder so dauert Hunderte von Millisekunden und dies ist zu langsam).

Ich denke, dass die Lösung darin besteht, sich nur auf die Pixel zu beziehen, die derzeit auf dem Bildschirm zu sehen sind, und nicht die ursprüngliche Quell-Bitmap zu drehen - und das ist der Schlüssel.

Wenn jemand Erfahrung mit einer ähnlichen Implementierung hat, könnte mir das eine Menge Versuch und Irrtum ersparen. Danke! Avi.

2voto

jestro Punkte 2414

Es sieht so aus, als ob SetWorldTransform extrem langsam ist: http://www.codeguru.com/Cpp/G-M/bitmap/specialeffects/article.php/c1743

Und während die anderen in diesem Artikel vorgestellten Optionen schneller sind, gibt es natürlich auch andere, bessere Lösungen wie diese: http://www.codeguru.com/cpp/g-m/gdi/article.php/c3693/ (siehe auch die Kommentare für Korrekturen und Verbesserungen)

Hier sind auch einige nicht Windows-zentrierte Algorithmen zur schnellen Rotation: http://www.ddj.com/Windows/184416337?pgno=11

Beachten Sie, dass Sie erhebliche Geschwindigkeitssteigerungen erzielen können, wenn Sie eine Potenz von 2 Dimensionen garantieren.

1voto

Avi Punkte 31

Lassen Sie mich im Anschluss an meine Frage und die gegebene Antwort Folgendes zusammenfassen:

  1. Ich habe den Algorithmus verwendet, der unter http://www.codeguru.com/cpp/g-m/gdi/article.php/c3693/ .

  2. Es funktioniert und bietet eine ziemlich gute Leistung und reibungslose Anzeige.

  3. Es gab einige Fehler, die ich beheben und die Formeln und den Code in einigen Fällen vereinfachen musste. Code in einigen Fällen.

  4. Ich werde den Algorithmus untersuchen, der unter http://www.ddj.com/Windows/184416337?pgno=11 um zu sehen, ob es eine bahnbrechende Leistung bietet, die es wert ist, angepasst zu werden.

  5. Meine Implementierung erforderte die Verwendung einer großen Quell-Bitmap, so dass ich den Code so ändern musste, dass nicht jedes Mal die gesamte Bitmap gedreht wird, sondern nur der relevante Teil, der auf dem Bildschirm angezeigt wird (andernfalls wäre die Leistung inakzeptabel).

Avi.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X