Entwickler-Ecke
Delphi Language (Object-Pascal) / CLX - Einfache Zeichenfunktionen für eine 64x16 Matrix
rotalosi - Mi 08.06.16 14:54
Titel: Einfache Zeichenfunktionen für eine 64x16 Matrix
Hallo,
ich hab mal wieder ein Problem.
Ich arbeite an einem Programm das ein Array für eine 64x16 LED Matrix erstellen kann.
Ich erstelle eine Matrix aus entsprechend angeordneten Shapes. Ich wähle eine Farbe und nach dem klicken auf ein Shape wird das gespeichert. Wenn alle "Pixel" da sind wo sie hingehören kann ich mittels Button das Array erstellen lassen.
Funktioniert auch alles soweit. Nun möchte ich das Programm aber verfeinern. Ich möchte z.b. Kreise, Dreiecke und Rechtecke wie bei einem Zeichenprogramm zeichnen können.
Außerdem gelingt es mir nicht die Pixelfarbe beim drüberfahren mit der Maus zu ändern (Wenn die linke Maustaste gedrückt ist);
Delphi-Quelltext
1: 2: 3: 4:
| procedure TForm1.ShapeMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); begin if (ssLeft in Shift) then TShape(Sender).Brush.Color := ColorGrid.ForegroundColor; end; |
Allen Shapes ist diese OnMouseMove Prozedur zugeordnet. Es ändert sich aber nur die Farbe des Shapes in das ich zuerst geklickt habe.
Hat da jemand evtl einen Tipp für mich, wie sich so was realisieren lässt?
Gruß rotalosi
Nersgatt - Mi 08.06.16 16:20
Moin!
Du zäumst das Pferd von der falschen Seite auf. Du lässt den Benutzer die Matrix mittels Shapes generieren und erstellst dann aus den Shapes Dein Array. Das heißt, die eigentlich Information liegt erst mal in den Shapes.
Besser wäre es, das Array in den Mittelpunkt zu setzen. Speichere die Informationen direkt im Array und erstelle aus dem Array die Darstellung der Matrix. Dann könntest Du auch von den Shaped weggehen und die Matrix selbst zeichnen.
Um mal konkret zu werden, ich würde mir ein Array definieren, in dem ich die Stati der Pixel festhalte.
Delphi-Quelltext
1: 2: 3: 4: 5:
| type TPixelType = (ptLeer, ptKreis, ptDreieck, ptRechteck);
var Matrix : array[1..64, 1..16] of TPixelType; |
Beim Klick auf einen Pixel setzt Du den Wert direkt im Array entsprechend. Und dann erst erstellst Du aus dem Array die Darstellung (Shapes oder lieber selbst zeichnen).
rotalosi - Mi 08.06.16 17:17
Hallo,
intern benutze ich bereits ein Array of TShape. Die Shapes stellen ja nur die sichtbare Farbe der LED Matrix dar.
Das Array wird zur Laufzeit erzeugt. Die Frage ist eher, wie kann z.b. nachdem ich den Kreismittelpunkt mittels Maus
festgelegt habe, durch ziehen der Maus die "Pixel" unter dem Kreis in der Farbe ändern. Also so wie da z.b. bei Paint ist.
Halt nur viel gröber.
ub60 - Mi 08.06.16 20:08
Das Zeichnen mit den Shapes ist sicher sehr aufwändig. Ich hänge mal eine kleines Testprogramm an, das als "schneller Editor" für eine Arduino-8x8-Matrix dient.
Eventuell kann man das schnell erweitern.
Zum Zeichnen kann man auch auf einer 64x16-Canvas zeichnen und das jeweils in den Editor hochrechnen. Das geht am schnellsten.
ub60
GuaAck - Mi 08.06.16 21:19
Hallo,
ich würde es etwa wie ub60 machen. Ich fand folgenden Weg bei einem ähnlichen Prblem aber noch einfacher:
a) Ich male mit einem beliebigen Editor (das alte "Paint" ist gut) ein 64x16 Bild. Da hat man allen Komfort. Das Bild speichert man als Bitmap.
b) Mit einem kleine Delphi-Programm lade ich die Datei in das Bitmap in eines TPicture (o. ä.) und gehe dann mit Scanline die Pixels durch.
Ich habe so mal Piktogramme aus einer Druckschrift zunächst gescannt, dann auf 64x64 reduziert, mit "Paint" etwas retouchiert, war viel leichter als neu machen.
Gruß
GuaAck
P.S. Zum Beitrag weiter oben: Wenig bekannt: Der Plural von "Status" ist "Status" (nicht "Stati"), für Plural gesprochen "Statuuuuuuus".
rotalosi - Do 09.06.16 08:06
Hallo,
vielen Dank für eure Hilfe.
Der Bresenham-Algorithmus ist genau das was ich gesucht habe. Der Code von ub60 ist auch sehr interessant. Diese Variante des "Pixelzeichnens" ist auf jeden Fall deutlich performanter als Shapes dazu zu benutzen.
Und GuaAck hat mir eine tolle Anregung für eine zusätzliche Funktion gegeben. Das importieren von Bitmaps.
Vielen Dank und viele Grüße euch allen.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!