Bewegte Grafikelemente (Linien, Kreise, ...) zeichnen

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
Nimral
Beiträge: 89
Registriert: Mi 10. Jun 2015, 11:33

Bewegte Grafikelemente (Linien, Kreise, ...) zeichnen

Beitrag von Nimral »

Hi allseits,

ich frage mich schon länger, wie das eigentlich funktioniert - performant und ruckelfrei. Ich meine konkret die Funktionen, die man aus Vektorzeichenprogrammen kennt, wo man eine einfache Form (Linie, Kreis, Linienzug ...) per Maustaste "anfasst" und dann durch Ziehen mit der Maus verändert, bis man die Maustaste loslässt.

Die Maussteuerung macht mir kein Problem, ich denke, es wird sich um onMouseDown und onMouseUp und MouseDrag Events drehen, aber wie genau macht man das Zeichnen? Vor einfarbigem Hintergrund kann ich es mir gerade noch vorstellen, ich würde die "alte" Kurve nochmal in Hintergrundfarbe zeichnen, und dann die Neue. Aber wie geht sowas vor vor beliebigem Hintergrund, so dass die letzte "Version" sauber gelöscht wird, bevor die Neue gezeichnet wird? Einfach den kompletten Hintergrund neu zeichnen kanns ja wohl nicht sein, oder doch? Man müsste ausschließlich die überzeichneten Pixel auslesen und puffern und wiederherstellen ...

Bevor ich euch belästige habe ich selbst schon gesucht, und z.B. die Quellen eines CAD Systems, in Lazarus geschrieben, gefunden, aber ein schneller Test dieser Funktionalität verlief eher ernüchternd, es gibt zwar eine Art bewegte Grafik, aber sie zeigt da wo sich letzter und neuer Stand die Pixels teilen gruselige Darstellungsfehler. Von Zeichenprogrammen und CAD Systemen bin ich besseres gewohnt - und das geht dort wohl auch ganz ohne Spezial-Grafikkarten. Es muss also Systemfunktionen geben die das unterstützen.

Ein Tutorial oder ein paar Code-Samples zum Durcharbeiten wären nett ..

Ziel-Plattformen wären übrigens Windows und Linux/Raspi.

Thnx, Armin.

Benutzeravatar
Winni
Beiträge: 628
Registriert: Mo 2. Mär 2009, 16:45
OS, Lazarus, FPC: Laz2.06, fpc 3.04
CPU-Target: 64Bit
Wohnort: Fast Dänemark

Re: Bewegte Grafikelemente (Linien, Kreise, ...) zeichnen

Beitrag von Winni »

Hi!

Die Logik geht folgendermaßen:

Bevor Du anfängst eine geänderte Figur zu zeichen, kopierst Du das ganze Image auf eine (unsichtbare) TBitmap im Hintergrund.
Bevor Du jetzt anfängst die Figur zu verschieben oder deformieren, kopierst Du die Hintergrund-Bitmap auf das Image zurück.

Wenn Die eine Figur so auf dem Image weiterhin erscheinen soll, machst Du hiervon eine Kopie im Hintergrund und benutzt die weiterhin als Hintergrund. And so on ...

Das Kopieren einer Bitmap auf ein Image geht erstaunlich schnell, weil letztendlich die hochoptimierte Funktion BitBlit benutzt wird.

Winni

Antworten