![]() |
[Graphics32] (Problem) Wie bewege ich ein Polygon auf eine fixe Position?
Hallo :)
Ich spiele derzeit mit der graphics32 lib herum und beschäftige mich derzeit mit transforming. Ich möchte ein Polygon auf eine fixe Position bringen, dazu mache ich folgendes:
Delphi-Quellcode:
Das Polygon wird nun um 20 punkte nach x und um 20 punkte nach y verschoben. Das heißt aber auch, dass das Polygon jedesmal um 20 punkte verschoben wird wenn der Code durchlaufen wird. Also wandert das Polygon immer weiter nach rechts z.b.
var
afftrans : TAffineTransformation; Polygon : TPolygon32; [...] begin [...] afftrans:= TAffineTransformation.Create; afftrans.Translate(20,20); Polygon.Transform(afftrans); [...] end; Ich möchte es aber auch eine Fixe Position setzen. Grund: Ich möchte das Polygon per Mausklick irgendwo hin setzen. Idee: A) Polygon auf Fixe Position bringen (Maus Coords.) B) Aktuelle Position des Polygons ermitteln, Maus Coords. abziehen und die Difference als Translate an das Polygon schicken. Meine Frage daher: Kann ich das Polygon A) Auf ne Fixe Position setzen oder B ) Dier derzeitge Transformation ermitteln? Ich hoffe ich konnte euch das Problem klar machen ;) Mfg colezero |
AW: [Graphics32] (Problem) Wie bewege ich ein Polygon auf eine fixe Position?
Warum lässt du die Transformation denn überhaupt mehrmals ausführen?
|
AW: [Graphics32] (Problem) Wie bewege ich ein Polygon auf eine fixe Position?
Wenn ich auf das Canvas mehrmals drauf klicke, wird diese procedure auch mehrmals durchlaufen ;) Aber ich kann da nicht einfach die X,Y Coords. der Maus übergeben, weil er das Polygon sonst jedesmal so verschieben würde:
Delphi-Quellcode:
Aber ich will ja nur
AltePosition.X := AltePosition.X + NeuesX;
AltePosition.Y := AltePosition.Y + NeuesY;
Delphi-Quellcode:
ALtePosition.X := NeuesX;
AltePosition.Y := NeuesY; |
AW: [Graphics32] (Problem) Wie bewege ich ein Polygon auf eine fixe Position?
Was in der Grafik nicht unüblich ist, ist das Mitführen einer ganz eigenen Transformationsmatrix für jedes Objekt. Dann würde das eigentliche Polygon nie verschoben, sondern immer nur zum Zeitpunkt der Anzeige eine Kopie davon mit der zugehörigen Matrix. Damit kann man dann stets von der Ursprungsposition ausgehen. (In der Matrix steht dann ja quasi die absolute Verschiebung (wenn es nur eine Translationsmatrix ist).)
Da ich hier leider weder Delphi noch Gr32 zur Hand habe, weiss ich nicht, ob das die Polygonklasse evtl. ohnehin schon intern so macht, und du an die Matrix dran kommst. Im Zweifel eben selbst nen kleinen Wrapper drum würgeln, dann ist's sogar hübsch :) |
AW: [Graphics32] (Problem) Wie bewege ich ein Polygon auf eine fixe Position?
Ich denke ich werd mir das mal anschauen und evtl. so machen, klingt für mich auch sehr hübsch ;) Ich werde die Tage mich dran machen und schauen was nach einen schönen Wochenende bei SOnne im Garten so alles dabei rauskommt und die Ergebnisse hier rein stellen.
Danke dir für deine Hilfen/Anregungen Viele Grüße |
AW: [Graphics32] (Problem) Wie bewege ich ein Polygon auf eine fixe Position?
Zitat:
|
AW: [Graphics32] (Problem) Wie bewege ich ein Polygon auf eine fixe Position?
Das Problem bei den Graphics32 ist, dass es eben keine eigene Transformations-Matrix für ein TPolygon32 mitführt und somit auf diese nicht zugegriffen werden kann.
Wenn man ein Polygon über die TAffineTransformation transformiert, werden die Koordinaten der Punkte-Arrays in Polygon.Points direkt (und permanent!) überschrieben und nicht erst, wie z.B. bei OpenGL, eine Transformationsmatrix des Objektes verändert, die man nachher auch noch manipulieren könnte. Du könntest dir aber z.B. eine eigene Klasse von TPolygon32 ableiten, die genau das macht, dass vor dem Zeichnen eben eine zuvor dem Polygon zugewiesene TAffineTransformation (per Matrix-Multiplikation) angewendet wird, die Punkte selbst aber nicht durch ein transform() überschrieben werden. Dazu müsstest du die Draw() und Transform()-Routinen überschreiben und der neuen Klasse eine neue Property einer TAffineTransformation geben, die dann immer direkt vor dem Zeichnen angewendet wird. Ab da arbeitest du dann nur noch mit der AffineTransformation. Diese kannst du über AffineTransformation.Clear() auch zurücksetzen, dadurch wird die Identitätsmatrix für die Transformation geladen. Ich weiss jetzt ja nicht, was du genau mit dem Zeug vorhast, aber wenn es darum geht, mit Matrizen, Transformationen und Polygonen herumzuspielen, dann würde ich dir jetzt fast raten, vergiss die Graphics32 und nimm gleich OpenGL :) Da bekommst du die Hardware-Beschleunigung frei Haus und noch diverse andere Nettigkeiten, und vor Allem...es wird nie langweilig damit :) Die Lernkruve ist zwar am Anfang ziemlich steil, aber wenn man mal die Grundbegriffe verstanden hat, macht es wirklich Spass. |
AW: [Graphics32] (Problem) Wie bewege ich ein Polygon auf eine fixe Position?
Hallo Hallo,
danke dir blackfin für die Anregungen. Ich hab mein Problem am Wochenende über eine eigene Klasse gelöst. Die neue Klasse wird von TPOlygon32 abgeleitet und wurde mit entsprechenden Matrizen versehen. Weil ich auch gesehen hab, dass Transform vom Polygon direkt die Vertices verschiebt. Es funktioniert so weit, aber ich bin nicht richtig glücklich damit. Ich glaube es ist/war den Aufwand nicht wirklich wert. Was genau mein Vorhaben ist kann ich sagen, ich wollte eine Radial-Menu Komponente für ein Projekt von mit entwickeln. Also ein Menu, dass sich kreisförmig um ein Objekt öffnet. Mit der GDI kommt man nicht weit, finde ich zumin. und mit der GDI+ auch nicht, weil sie einfach zu lahm ist und viel CPU verbraucht. Vielleicht komme ich mit OpenGL besser an eine Lösung. Ich werde mich wieder melden :) Vielen Dank nochmals und schöne Grüße |
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:13 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz