![]() |
Form einer Parabel folgen lassen
Hallo,
mittels folgenden Code positionier ich eine Form über eine Strecke in 10 Schritten:
Delphi-Quellcode:
Nun würd ich gerne die Form über eine Parabel in 10 Schritten positionieren lassen.
procedure TSplashScreenForm.Timer_BewegungTimer(Sender: TObject);
begin // If count < 10 then begin //SplashScreen in die linkere obere Ecke bewegen, mit 10 Schritten Left := Left_alt - round(count / 10.0 * Left_alt); Top := Top_alt - round(count / 10.0 * Top_alt); inc(count); end else begin //Timer beenden Timer_Bewegung.Enabled := false; //Variable setzen, dass SplashScreen in Position ist F_SS_in_Position := true; end; end; Sprich, die Bewegung soll nicht einer Strecke folgen, sondern einer Parabel. Nun ist Mathematik schon länger her. Die Formel für eine Parabel lautet y = x². Nur wie kann ich das auf den Code anwenden? |
Re: Form einer Parabel folgen lassen
Delphi-Quellcode:
Ungefähr so...
count := -5;
OriginalLeft := Left; OriginalTop := Top; while count < 5 do begin Left := OriginalLeft + Count; Top := OriginalTop + (Count * Count); inc(Count); end; |
Re: Form einer Parabel folgen lassen
Danke!
|
Re: Form einer Parabel folgen lassen
eine Frage hätt ich noch:
Wie kann ich von einer gegebenen Position zu einer neuen Position die Form über eine Parabel bewegen lassen? |
Re: Form einer Parabel folgen lassen
Es sei (x1|y1) der Start-, (x2|y2) der Endpunkt der Bewegung.
Im Endpunkt muss gelten: y2-y1 = a (x2-x1)² -> a = (y2-y1) / (x2-x1)² Wenn du Left wie in deinem ersten Beitrag gleichmäßig (linear) von x1 bis x2 laufen lässt, ergibt sich für jeden Schritt:
Delphi-Quellcode:
Top := y1 + a * Sqr(Left - x1)
|
Re: Form einer Parabel folgen lassen
oh - wunderbar - Danke!
Jetzt muss ich nur noch etwas an den Werten feilen - aber es schaut schon mal ganz gut aus... [Edit] Irgendwie komm ich aber nicht auf den Endpunkt |
Re: Form einer Parabel folgen lassen
Zitat:
|
Re: Form einer Parabel folgen lassen
hier mal der Code:
Delphi-Quellcode:
procedure TSplashScreenForm.FormActivate(Sender: TObject); begin //Variablen vordefinieren Left_alt := Left; Top_alt := Top; count := 1; end; procedure TSplashScreenForm.Timer_BewegungTimer(Sender: TObject); begin // If count < const_max_count then begin //Bewegung des SplashScreens abhängig von der ausgewählten Version // Left := Left_alt - count; // Top := Top_alt - (count * count); //Top = y1 + ((y2-y1) / (x2-x1)²) * Sqr(Left - x1) Left := Left_alt - round(count / 10.0 * Left_alt); // Top := Top_alt - y; Top := Left_alt + round( (( (const_Endpos_X - Left_alt) / ((const_Endpos_Y - Top_alt) * (const_Endpos_Y - Top_alt)) ) * Sqr(Left - Left_alt)) ); end; inc(count); end else begin //Timer beenden Timer_Bewegung.Enabled := false; //Variable setzen, dass SplashScreen in Position ist F_SS_in_Position := true; end; end; |
Re: Form einer Parabel folgen lassen
Da hast du aber einiges in meiner Formel verdreht ;) .
Ich habe mal Struktur und Formatierung verändert, so funktioniert es bei mir:
Delphi-Quellcode:
const
DestX = 100; DestY = 100; [...] procedure TSplashScreenForm.FormActivate(Sender: TObject); begin //Variablen vordefinieren Left_alt := Left; Top_alt := Top; count := 1; a := (DestY - Top_alt) / Sqr(DestX - Left_alt); end; procedure TSplashScreenForm.Timer_BewegungTimer(Sender: TObject); begin If Left <> DestX then begin Left := Left_alt + Round(Count / 10.0 * (DestX - Left_alt)); Top := Top_alt + Round(a * Sqr(Left - Left_alt)); inc(count); end else TimerBewegung.Enabled := false; end; |
Re: Form einer Parabel folgen lassen
Danke für den Code.
Nur leider bewegt sich die Form fast linear in die Endpositionen Eigentlich sollte ja die Form erst in einem Bogen nach unten gehen und dann eben in die Endpositionen |
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:23 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