Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Winkel - Rotation (https://www.delphipraxis.net/59333-winkel-rotation.html)

Airblader 20. Dez 2005 20:23


Winkel - Rotation
 
Hi ;)
Ich will grade ein Bild (Ball u.ä.) rotiert bewegen, also in alle Richtung mit Winkel.

Irgendwie geht diese Rechnung nicht richtig (hab sie mir "zusammengesucht") - er rotiert immer in 45°-Schritten, obwohl der Winkel +/- 1 gerechnet wird.
Winkel ist ein Real, Pos eben TPoint:


Delphi-Quellcode:
Player.Pos.X := Round(Player.Pos.X + cos(DegToRad(Player.Winkel)));
Player.Pos.Y := Round(Player.Pos.Y + sin(DegToRad(Player.Winkel)));

Was stimmt denn daran nun nicht?

air

Khabarakh 20. Dez 2005 20:31

Re: Winkel - Rotation
 
:gruebel: ? Willst du nun ein Bild rotieren oder eine Figur bewegen? Auf jeden Fall wird sich Pos nur auf die 9 Pixel um die aktuelle Position herum verlagern, da du das Ergebnis rundest -> Ergebnisse von cos und sin = -1, 0 oder 1 -> 45°

Airblader 20. Dez 2005 20:33

Re: Winkel - Rotation
 
Stimmt, da is was wahres dran (nun gut, ich will sie bewegen).
Aber was kann ich dann machen, irgendwie muss ich ja runden, da Integer :gruebel:

air

Khabarakh 20. Dez 2005 20:40

Re: Winkel - Rotation
 
Ich könnte dir besser antworten, wenn ich wüsste, wie das Bewegen genau von Statten gehen soll :wink: . Wenn du es in einer Animation bewegst und deshalb wirklich immer nur um ca. 1-2 Pixel verschieben kannst (und der Winkel sich ständig ändert), musst du intern Floats für die Position verwenden und zum Zeichnen wieder runden. Falls du die GR32-Lib hast, kannst du einfach GR32.TFloatPoint und die vielen Routinen dazu benutzen. Falls du das Objekt auch über eine längere Strecke auf einmal bewegen kannst, musst du das Ergebnis von sin/cos mit dem Radius multiplizieren, mit größerem Radius verringert sich die Ungenauigkeit.
Delphi-Quellcode:
// Player um 10 Pixel bewegen
// Das Runden sollte nicht mehr sichtbar sein
Player.Pos.X := Round(Player.Pos.X + 10 * cos(DegToRad(Player.Winkel)));
Player.Pos.Y := Round(Player.Pos.Y + 10 * sin(DegToRad(Player.Winkel)));

Airblader 21. Dez 2005 10:40

Re: Winkel - Rotation
 
Danke, mit internen Floats gehts - manchmal denkt man einfach zu kompliziert ;)


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:27 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz