Seite 1 von 1

'Objekte' zeichnen

Verfasst: 17.01.2013 14:03
von harryup
hi,
prinzipiell geht es nur darum, Objekte zeichnen und auch wieder verändern zu können.
Im einfachsten Fall sind die Objekte nur Linien, können aber auch komplexere Kurven sein.
Das mache ich auf einem CanvasGadget, ich denke, das ist die 'eleganteste' Lösung.
Nun sind die Linien zwar gezeichnet, also an bestimmten Positionen wurde die Farbe der Pixel geändert, ich könnte nun vielleicht feststellen, welche Farbe unter dem Mauszeiger liegt, das gibt aber noch keine Info darüber, welchem Objekt das Pixel zugeordnet ist, wenn mehrere Objekte übereinander liegen.
Auch eine Position auf der Linie lässt noch keinen Rückschluss zu, welchem Objekt die aktuelle Mausposition zugeordnet ist, die Linie ist ja nur durch die Start- und Endposition definiert.
Ist es sinnvoll hier für jedes Objekt einen transparenten Layer (Image- oder CanvasGadget) anzulegen und es darauf zu zeichnen oder gibt es dafür elegantere Lösungen? Werden halt recht viele Layer, wenn ich viele Objekte habe.
Grüße & Dank, harry

Re: 'Objekte' zeichnen

Verfasst: 17.01.2013 14:50
von NicTheQuick
Normalerweise nutzt man bei sowas eine geordnete Liste, die alle Objekte in ihrer Reihenfolge wie sie übereinander liegen enthält. Und dann gibt es für jedes Objekt eine Methode/Procedure, die überprüft, ob eine bestimmte Koordinate (in dem Fall die des Mauscursors) auf ihr liegt. Jetzt geht man in der richtigen Reihenfolge (Top to Bottom) alle Objekte durch und übergibt ihrer Methode/Procedure die Mauskoordinate und lässt sie überprüfen, ob diese Koordinate zu ihr gehört.

Du kannst aber auch ein zweites unsichtbares Bild bzw. ein 2D-Array erstellen, bei dem jede Koordinate die ID des Objektes enthält, das als letztes auf den entsprechenden Pixel gemalt hat. Das heißt während du z.B. eine Linie in das CanvasGadget malst, schreibst du an die selben Stellen in dem 2D-Array, welches Objekt das war. Dann weißt du direkt anhand der Mauskoordinate welches Objekt diesen Pixel gemalt hat.
Wird jetzt über diese Linie z.B. noch ein Kreis gemalt, der die Linie teilweise überdeckt, überschreibt der Kreis natürlich auch die entsprechende Einträge im 2D-Array mit seiner Objekt-ID.

Re: 'Objekte' zeichnen

Verfasst: 17.01.2013 16:50
von harryup
Hab' ich befürchtet, dass es kein Spaziergang wird.
Die Idee mit dem 2. Canvas ist schick, so viele Objekte werden kaum übereinander liegen dass sie nicht mehr einzeln selektierbar sind.
Die Objekte werde ich dann wohl in ein Array zur Bearbeitung sichern, muss irgendwann ja eh sein, sonst hätte ich nur ein Bild aller Objekte.
Dank dir, Grüsse, harry

Re: 'Objekte' zeichnen

Verfasst: 17.01.2013 17:30
von Kurzer
Hallo harryup,

bei dem was Du vor hast, denke ich an an den grafischen Editor des von mir genutzten Screenshottools (faststone Capture).

Da kann man auch Pfeile, Kreise, Rechtecke usw. auf einem Screenshot platzieren und solange man den Editor noch nicht verlassen hat, kann man diese Dinge "anfassen" und auf dem Screenshot verschieben oder vergrößern/verkleinern.
Erst wenn man den Editor verlässt, wird das ganze dann auf einen Layer zusammengerechnet.

Bild

Daher würde ich das ganze so machen:

Für das Hintergrundbild nimmst Du ein Canvas oder wegen mir auch ein großes Imagegadget.
Die einzelnen Objekte (Kreise, Pfeile usw.) zeichnest Du aber alle in separate, kleine Images. Einen Kreis mit Radius 40 Pixel sitzt dann also auch nur in einem Image mit 40 x 40 Pixel.

Zu jedem Objekt (Image) merkst Du Dir dann noch die Position an der es auf dem großen Bild (dem Screenshot) gezeichnet werden müssen. Und natürlich noch eine Z-Order, damit man die Reihenfolge des Zeichnens kennt.

Beim Zeichnen (z.B. nachdem ein neues Objekt zugekommen ist oder eines verschoben wurde) musst Du dann die ganze Komposition einmal neu erstellen.

- Hintergrundbild erneuern
- Objekt mit kleinstem Z-Layer an Postion xyz auf das Hintergrundbild zeichnen.
- Objekt mit nächst höherem Z-Layer an Postion xyz draufzeichnen.
- Objekt mit nächst höherem Z-Layer an Postion xyz draufzeichnen.
- usw.

Und wenn Du nun wissen willst welches Objekt zwecks Verschiebung vom User angeklickt wurde, wenn er in das Hintergrundbild klickt, dann brauchst Du nur prüfen, ob sich an der Mausposition (bezogen auf das große Hintergrundbild) eines der kleineren Objektimages befindet. Das ist nur eine Prüfung auf ein Rechteck unter Beachtung der Ausmaße des kleinen Images mit der größten Z-Order.

Wenn Du das Objekt/Image gefunden hast, dann rechnst Du die Mauskoordinate so um, dass Du die Mausposition innerhalb des kleines Images heraus bekommst.
Wenn Du die hast, dann kannst Du innerhalb des kleinen Images sehr einfach mit Point() rausfinden, ob gerade genau auf ein gesetztes Pixel (z.B. den roten Kreis) geklickt wurde oder nicht.