Autor Beitrag
rotalosi
Hält's aus hier
Beiträge: 12
Erhaltene Danke: 1



BeitragVerfasst: Mi 08.06.16 14:54 
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);
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1581
Erhaltene Danke: 279


Delphi 10 Seattle Prof.
BeitragVerfasst: 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.
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
type
  TPixelType = (ptLeer, ptKreis, ptDreieck, ptRechteck);

var
  Matrix : array[1..641..16of 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).

_________________
Gruß, Jens
Zuerst ignorieren sie dich, dann lachen sie über dich, dann bekämpfen sie dich und dann gewinnst du. (Mahatma Gandhi)
rotalosi Threadstarter
Hält's aus hier
Beiträge: 12
Erhaltene Danke: 1



BeitragVerfasst: 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.
FinnO
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1331
Erhaltene Danke: 123

Mac OSX, Arch
TypeScript (Webstorm), Kotlin, Clojure (IDEA), Golang (VSCode)
BeitragVerfasst: Mi 08.06.16 19:48 
Moin,

für das Zeichnen von Geraden bzw. Linien und Kreisen ist der Bresenham-Algorithmus verbreitet und verhältnismäßig einfach zu implementieren. Für den ersten Schritt sollte das ausreichend sein.

Ein Dreieck kannst du dann entsprechend aus drei Linien zusammensetzen.

Gruß

Für diesen Beitrag haben gedankt: rotalosi
ub60
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 762
Erhaltene Danke: 127



BeitragVerfasst: 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
Einloggen, um Attachments anzusehen!

Für diesen Beitrag haben gedankt: rotalosi
GuaAck
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 376
Erhaltene Danke: 32

Windows 8.1
Delphi 10.4 Comm. Edition
BeitragVerfasst: 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".

Für diesen Beitrag haben gedankt: rotalosi
rotalosi Threadstarter
Hält's aus hier
Beiträge: 12
Erhaltene Danke: 1



BeitragVerfasst: 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.

Für diesen Beitrag haben gedankt: FinnO