Entwickler-Ecke
Algorithmen, Optimierung und Assembler - Polygone rotieren
Al Borland - Mi 15.12.04 16:44
Titel: Polygone rotieren
Hallo allerseits!
Ich suche nach einer Methode Polygone zu rotieren.
Es soll ein Programm werden, daß Rundskalen zeichnen soll -
also wie bei einem Uhren- Zifferblatt.
Dabei muss der Mittelpunkt der Rotation gewählt werden können...
Wer hat dafür eine Idee? Komm ich eventuell ums Rechnen herum?
Kann man vielleicht ein Metafile gedreht auf ein Canvas ausgeben?
AXMD - Mi 15.12.04 17:04
Titel: Re: Polygone rotieren
:welcome:
Al Borland hat folgendes geschrieben: |
Komm ich eventuell ums Rechnen herum? |
Also das mal sicher nicht ;)
Soweit ich weiß, hatten wir grad vor kurzem einen solchen Beitrag. Siehe auch Forensuche
POLYGON
AXMD
Al Borland - Mi 15.12.04 17:37
AXMD hat folgendes geschrieben: |
Also das mal sicher nicht ;)
|
Echt nicht? :bawling: Wie soll ich das denn alles rechnen...
Mit Winkelfunktionen wird das ganz schön aufwendig.
Gibt es nicht irgendeine schlaue Grafik Bibliothek, die so was kann?
sourcehunter - Do 16.12.04 10:23
Hast du schon mal was von Matrizen gehört? Also wir hatten sowas im Unterricht, wie man Polygone dreht.
AXMD - Do 16.12.04 17:27
Wir auch - und da brauchst du doch eine ziemliche Ahnung von Mathe, damit du weißt, was du tust; und damit auch dein Programm macht, was es machen soll ;)
AXMD
P_G - Fr 17.12.04 13:58
Hi Al,
du kannst es auf folgende Weise machen:
Die Koordinatenpunkte deines Polygons legst du in einem
Array of TPoint ab. Dieses Array nenne ich im folgenden Codebeispiel "Points".
Dann implementierst du zunächst die Prozedur mit der Rotationsmatrix:
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17:
| procedure RotatePoints(var Points: array of TPoint; const Angle: Extended; const Org: TPoint); var Sin, Cos: Extended; Prime: TPoint; I: Integer; begin SinCos(Angle, Sin, Cos); for I := Low(Points) to High(Points) do with Points[I] do begin Prime.X := X - Org.X; Prime.Y := Y - Org.Y; X := Round(Prime.X * Cos - Prime.Y * Sin) + Org.X; Y := Round(Prime.X * Sin + Prime.Y * Cos) + Org.Y; end; end; |
Diese Prozedur kannst du jetzt aufrufen:
Quelltext
1:
| RotatePoints(Points, DegToRad(10), Point(X,Y)); |
Der zweite Parameter ist der frei wählbare Rotationswinkel. Der dritte Parameter ist der Koordinatenpunkt des Rotationszentrums. Er ließe sich durch eine entsprechende Matrix auch zur Laufzeit errechnen, wenn der Graphic-Mittelpunkt noch nicht bekannt ist, oder veränderbar sein soll. Nach der Rotation zeichnest du nun auf dem Canvas.
Gruß, P_G
Al Borland - Mo 20.12.04 10:41
:autsch: Oh nein...
Ich hätte vielleicht mal vorher wieder ins Forum gucken sollen...
Ich hab nämlich in der Zwischenzeit eine Routine selbst programmiert, allerdings nicht so elegant mit einer Matrize, sondern ziemlich umständlich :oops: (32 Zeilen - man bin ich blöd)...
Deine Routine klappt sehr gut - Danke!
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2024 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!