Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Bewegung-Beschleunigung (https://www.delphipraxis.net/91066-bewegung-beschleunigung.html)

FloBue 28. Apr 2007 18:13


Bewegung-Beschleunigung
 
ICh versuche einen Federschwinger zu programmieren und dieser soll zur Mitte hin Beschleunigen und zu den Ecken hin Abbremsen. Die Beschleunigung funktioniert zwar aber sie hakt und funktioniert nicht mit allen Werten. Hier ist der Quellcode:

Delphi-Quellcode:
procedure TForm1.Timer1Timer(Sender: TObject);
begin
{label1.caption:=timetostr(time);}
ko:=0;
repeat {Für Überarbeitung weiß}
with image1.canvas do begin
Pen.Width:=1;
Pen.Color:=clwhite;
moveto(0,ko);
Lineto(image1.Width,ko);
end;
ko:=ko+1;
until ko=image1.Height;
with image1.canvas do begin
pen.Color:=clblack;
moveto(10,image1.Height div 2+20);
lineto(10,image1.Height div 2-20);
moveto(image1.width-10,image1.Height div 2+20);
lineto(image1.width-10,image1.Height div 2-20);
moveto(10,image1.height div 2);
lineto(image1.width-10,image1.height div 2);
end;
t1:=timetostr(time);
if radiobutton1.Enabled=true then begin;

if (x1+x2)/2<(image1.width div 2) then begin
x1:=x1+v1;
x2:=x2+v1;
timer1.Interval:=timer1.Interval-2;//-trunc(vi)
end;
if (x1+x2)/2>=(image1.width div 2) then begin
x1:=x1+v1;
x2:=x2+v1;
timer1.Interval:=timer1.Interval+2;//-trunc(vi)
end;
end;
if x1>=image1.Width-20 then begin
radiobutton1.enabled:=false;
radiobutton2.enabled:=true;
timer1.Interval:=100;

end;
if radiobutton2.Enabled=true then begin
if (x1+x2)/2>=(image1.width div 2) then begin
x1:=x1-v1;
x2:=x2-v1;
timer1.Interval:=timer1.Interval-2;//-trunc(vi)
end;
if (x1+x2)/2<(image1.width div 2) then begin
x1:=x1-v1;
x2:=x2-v1;
timer1.Interval:=timer1.Interval+2;//-trunc(vi)
end;
end;
if x2<=20 then begin
radiobutton2.enabled:=false;
radiobutton1.enabled:=true;
timer1.Interval:=100;
end;

label2.Caption:=timetostr(time);
with image1.canvas do begin
rectangle(x1,y1,x2,y2);
end;


procedure TForm1.FormCreate(Sender: TObject);
begin
x1:=50;
x2:=20;
y1:=image1.Height div 2+10;
y2:=image1.Height div 2-10;
timer1.Enabled:=false;
radiobutton1.Enabled:=true;
radiobutton2.Enabled:=false;
label1.caption:=inttostr(image1.Width);
v1:=10;
vi:=2/((image1.Width-10) div 2);
label1.caption:=floattostr(vi);

end;
Danke für jede Antwort (kann zur not noch einen screenshot schicken... :lol:

[edit=Christian Seehase]Delphi-Tags gesetzt. Bitte künftig selber machen. Danke. Mfg, Christian Seehase[/edit]

HannosG 28. Apr 2007 20:42

Re: Bewegung-Beschleunigung
 
Herzlich Willkommen in der DP! :dp:

Am besten errechnet man die x-Position mit Sinus.
Das Intervall vom Timer sollte nicht verändert werden.

Wenn du physikalisch genau sein möchtest, dann kannst du dich in Harmonische Schwingung - Wikipedia mal einlesen...

Ansonsten etwas abgekürzt:
[Vorkau=ON]
Delphi-Quellcode:
type
  TForm1 = class(TForm)
    Timer1: TTimer;
    Image1: TImage;
    procedure Timer1Timer(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;
  Winkel,v1,y1,y2: Integer;

implementation

{$R *.dfm}

procedure TForm1.Timer1Timer(Sender: TObject);
var Pos: Integer;
begin
With Image1.Canvas do
  begin
  Pen.Color:=clWhite; // Für Überarbeitung weiß
  Brush.Color:=clWhite;
  Rectangle(0,0,Image1.Width,Image1.Height);

  Pen.Color:=clblack;
  MoveTo(10,Image1.Height div 2+20);
  LineTo(10,Image1.Height div 2-20);              // |
  MoveTo(Image1.Width-10,Image1.Height div 2+20);
  LineTo(Image1.Width-10,Image1.Height div 2-20); //    |
  MoveTo(10,Image1.Height div 2);
  LineTo(Image1.Width-10,Image1.Height div 2);    // ---
  end;
Winkel:=(Winkel+v1)mod 360;
Pos:=round( Image1.Width/2 + sin(Pi*Winkel/180)*(Image1.Width/2-25) ); // Sinus wird von Rad nach Deg umgerechnet
Image1.Canvas.rectangle(Pos-10,y1,Pos+10,y2);
end;


procedure TForm1.FormCreate(Sender: TObject);
begin
y1:=Image1.Height div 2-10;
y2:=Image1.Height div 2+10;
v1:=3;
Winkel:=0;
Timer1.Interval:=40; // oder im Objektinspektor einstellen - 1000/40 -> 25 "Bilder" pro Sekunde
end;


end.
[Vorkau=OFF]

HannosG 28. Apr 2007 21:14

Re: Bewegung-Beschleunigung
 
Liste der Anhänge anzeigen (Anzahl: 1)
:arrow: "Screenshot": :)

FloBue 29. Apr 2007 09:11

Re: Bewegung-Beschleunigung
 
Dankeschön

Das ich darauf nicht selbst gekommen bin (wäre das naheliegenste gewesen....) :wall:
Danke Danke Danke :cheers: :spin:


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:14 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