Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Kreisförmige Bewegung eines Objektes (https://www.delphipraxis.net/76961-kreisfoermige-bewegung-eines-objektes.html)

Waldteufel 12. Sep 2006 18:16

Re: Kreisförmige Bewegung eines Objektes
 
Hi ErdnussLocke.

Zitat:

Zitat von ErdNussLocke
Wozu steht die "2" bei "inc(Grad,2)"?

Inc(Grad) heißt: Erhöhe Grad (um 1).
Inc(Grad) heißt: Erhöhe Grad um 2.

Zitat:

Zitat von ErdNussLocke
Warum bei der "left"+"top"- Zuweisung am Ende *40?

Weil der Sinus nur zwischen 1 und -1 hin- und herschwingt. Das wäre ein ziemlich kleiner Kreis. Deshalb mal 40 (Radius).

Gruß,
Waldteufel

benst 12. Sep 2006 18:18

Re: Kreisförmige Bewegung eines Objektes
 
Für kontinuierliches Drehen:
Anstatt:
Inc(Grad, 2);
folgendes:
Grad:=(Grad+2) mod 360;
... und
if Grad = 360 then Timer1.Enabled := false
weglassen.
Also so:

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
  XR := 40;
  YR := 40;
  X0 := Label1.left - XR;
  Y0 := Label1.top;
  Grad := 0;
  Richtung := 1 //1 = mathematische pos. Drehsinn (gegen Uhrzeigersinn), -1 = entsprechend anders herum
  Timer1.Enabled := true
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  Grad:=(Grad+2) mod 360;
  Label1.left := X0 + round (cos(2*Pi/360 * Grad) * XR);
  Label1.Top := Y0 - round (sin(2*Pi/360 * Richtung * Grad) * YR);
end;
(Für sehr große Kreise Grad:=(Grad+1)mod 360, falls es ruckelt.)

ErdNussLocke 12. Sep 2006 18:18

Re: Kreisförmige Bewegung eines Objektes
 
thx!
Dann hab ichs jetz verstanden!
Danke an euch alle!
Bis zum nächsten Prob ;)
MfG
ErdNussLocke

Nikolas 12. Sep 2006 18:28

Re: Kreisförmige Bewegung eines Objektes
 
Das mod ist aber völlig überflüssig. Die Sinusfunktion ist doch schön periodisch (sin(alpha)=sin(alpha+360°) oder sin(x)=sin(x+2 pi))

benst 12. Sep 2006 18:30

Re: Kreisförmige Bewegung eines Objektes
 
Das habe ich zuerst auch gedacht und das geht vermutlich auch gut. Sauber programmiert ist das aber (wie ich finde) nicht, weil es irgendwann zum Überlauf kommt.

QuickAndDirty 13. Sep 2006 12:56

Re: Kreisförmige Bewegung eines Objektes
 
Naja, "sauber" programmiert wäre es, alle x und y eines 1/4 Kreises zu speichern
und den Rest durch Spiegelung an der X- und/oder der Y-Achse zu ermitteln.
Das schont den Prozessor....Sin und Cos ist nicht mal eben so ermittelt.

himitsu 13. Sep 2006 13:18

Re: Kreisförmige Bewegung eines Objektes
 
Zitat:

Zitat von benst
Das habe ich zuerst auch gedacht und das geht vermutlich auch gut. Sauber programmiert ist das aber (wie ich finde) nicht, weil es irgendwann zum Überlauf kommt.

Wenn du jetzt statt der 360 eine schöne Zweierpotenz nutzt, am Besten sogar noch in einen Datentypen perfekt reinpassend (z.B. Byte=256, Word=65536, ... ), dann kannst du das "langsame" MOD auch weglassen und höchstens mit einem netten AND arbeiten :)

Delphi-Quellcode:
Var Grad: Byte; {0..255}

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  Inc(Grad, 2);
  Label1.left := X0 + round (cos(Pi/128 * Grad) * XR);
  Label1.Top := Y0 - round (sin(Pi/128 * Richtung * Grad) * YR);
end;
oder halt mit belibigen Zweierpotenzen und AND:
Delphi-Quellcode:
Var Grad: Integer; {z.B.: 0..1023}

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  Grad := (Grad + 2) and $03FF;
  Label1.left := X0 + round (cos(Pi/512 * Grad) * XR);
  Label1.Top := Y0 - round (sin(Pi/512 * Richtung * Grad) * YR);
end;

Novilos 13. Sep 2006 14:44

Re: Kreisförmige Bewegung eines Objektes
 
Zitat:

Zitat von TStringlist
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
  // Radius des Einheitskreises = 40 Dots
  X0 := Label1.left - 40;
  Y0 := Label1.top;
  Grad := 0;
  Timer1.Enabled := true
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  inc(Grad,2);
  Label1.left := X0 + round (cos(2*Pi/360 * Grad) * 40);
  Label1.Top := Y0 - round (sin(2*Pi/360 * Grad) * 40);
  if Grad = 360 then Timer1.Enabled := false
end;

Kann mir wer die Rechnung erklären? Wie das mit Sin und Cos genau abläuft? Versteh ich nicht so ganz :)
Danke sehr

Nikolas 13. Sep 2006 14:55

Re: Kreisförmige Bewegung eines Objektes
 
naja, 2pi/360*Grad verwandelt Grad von Rad zu Deg, wie du Funktion RadtoDeg. also 0-360 -> 0-2pi. Die 40 ist der Radius des Kreises.
Wie sin und cos am Einheitskreis definiert sind, kannst du in der WIkipedia lesen.

himitsu 13. Sep 2006 14:58

Re: Kreisförmige Bewegung eines Objektes
 
Schau mal im Tafelwerk, bei Wikipedia, oder sonstwo nach Kreisfunktionen, als sowas schimpfen sich Sinus und Cosinus schließlich :zwinker:


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:47 Uhr.
Seite 2 von 3     12 3      

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