Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Formelfindung (https://www.delphipraxis.net/44370-formelfindung.html)

Maximus 18. Apr 2005 15:58


Formelfindung
 
Hallo,

Ich brauche Hilfe beim finden einer Formel. Es geht darum, dass ich prüfen will ob bei den Einstellungen zu meiner Flugbahn Simulation die Werte zu groß werden, um dann enstsprechend die Geschwindigkeit zu regulieren.

Hier mal der relevante Quelltext (gekürtzt und ohne proceduren)
Delphi-Quellcode:
 var
  v, w: Extended // v Geschwindigkeit; w Abschusswinkel
  ro : Extended // Dichte der Luft
  r : Extended // Radius der Kugel
  cw : Extended // Wiederstandsbeiwert
  m : Extended // Masse
  ax : Extended // Bremsbeschleunigung X-Richtung
  vx : Extended // Geschwindigkeit X-Richtung
  vor_vx: Integer

 k := Pi * ro * r * r * cw / (2*m); // Wird am anfang berechnet
 vx := v * cos (w);

 ax := k * vx * vx; // Bei jedem "Tick" vom Timer wird ab hier gerechnet
 if vx > 0 then vor_vx := -1 else vor_vx := 1; //Bremsbeschleunigung entgegen Wirken lassen
 vx := vx + vor_vx * ax * 0.05;
Um das Problem bei einer kleinen Rechnung zu verdeutlichen:
Nehmen wir an:
k := 5;
vx := 10;

dan würde ax = 5 * 10² = 500
vx = 10 - 1 * 500 * 0,05 = - 15

Schon beim nächsten durchlauf würde sich vx weiter vergrößern bis es irgendwan den Extended Bereich übersteigt und das Programm abstürzen lässt.
Deswegen such ich jetzt eine Formel die ausrechnet ob die Werte noch gültig sind oder ob sie zu groß sind prüft und gegebenenfalls v reguliert.

Inzwischen hab ich schon einige Formeln getestet doch auch nach dem regulieren gab es noch ein Error. Ich hoffe ihr könnt mir weiterhelfen.

Danke schonmal!

MFG
Maximus

freak4fun 18. Apr 2005 16:04

Re: Formelfindung
 
Setzt ein try except end; - Block drum herum und geb als Fehlermeldung aus, das der Wert zu groß ist.
Oder darf das auch nicht sein?

MfG
freak

Maximus 18. Apr 2005 16:26

Re: Formelfindung
 
Zitat:

Zitat von freak4fun
Setzt ein try except end; - Block drum herum und geb als Fehlermeldung aus, das der Wert zu groß ist.
Oder darf das auch nicht sein?

Eigentlich sollte es erst gar nicht dazu kommen und wenn die Werte zu groß werden sollte es gleich beim speichern der Einstellungen erkannt und korrigiert werden.

MFG
Maximus

Binärbaum 18. Apr 2005 16:48

Re: Formelfindung
 
Zitat:

Zitat von Maximus
Delphi-Quellcode:
 var
  v, w: Extended // v Geschwindigkeit; w Abschusswinkel
  ro : Extended // Dichte der Luft
  r : Extended // Radius der Kugel
  cw : Extended // Wiederstandsbeiwert
  m : Extended // Masse
  ax : Extended // Bremsbeschleunigung X-Richtung
  vx : Extended // Geschwindigkeit X-Richtung
  vor_vx: Integer

 k := Pi * ro * r * r * cw / (2*m); // Wird am anfang berechnet
 vx := v * cos (w);

 ax := k * vx * vx; // Bei jedem "Tick" vom Timer wird ab hier gerechnet
 if vx > 0 then vor_vx := -1 else vor_vx := 1; //Bremsbeschleunigung entgegen Wirken lassen
 vx := vx + vor_vx * ax * 0.05;
Um das Problem bei einer kleinen Rechnung zu verdeutlichen:
Nehmen wir an:
k := 5;
vx := 10;

dan würde ax = 5 * 10² = 500
vx = 10 - 1 * 500 * 0,05 = - 15

Schon beim nächsten durchlauf würde sich vx weiter vergrößern bis es irgendwan den Extended Bereich übersteigt und das Programm abstürzen lässt.

Wenn die Werte so schnell ansteigen, ist das bei der Berechnung einer Flugbahn schon ziemlich ungewöhnlich. Und selbst wenn sich die Geschwindigkeit vergrößern sollte, dann nicht so stark, dass der Bereich von Extended überschritten wird. das scheint doch sehr unrealistisch. :?
Deshalb vermute ich, dass der Fehler in irgendeiner der Formeln steckt.

MfG
Binärbaum

Maximus 18. Apr 2005 18:57

Re: Formelfindung
 
Ich glaub eher nicht das ein Fehler in der Formel steckt, da es bei normalen Werten (Gofball + Luft/Erde) ohne Probleme funktioniert.

Aber trotzdem mal den kompletten Code

Delphi-Quellcode:
type
 TBallEngine = class
 private
   vorz_vw : Integer;
   Breite, Hoehe: Integer;
 public
   V : Extended;
   W : Extended;
   G : Extended;
   E : Extended;
   K : Extended;
   Vw : Extended;
   Vx : Extended;
   Vy : Extended;
   Tau : Extended;
   X : Extended;
   Y : Extended;

   function Set_K(ro, r, m, cw: Extended) : Extended;
   procedure Init(valueX, valueY: Extended; B, H: Integer);
   procedure Move;
 end;

implementation

function TBallEngine.Set_K(ro, r, m, cw: Extended) : Extended;
begin
 Result := cw * Pi * ro * r * r / (2*m);
end;

procedure TBallEngine.Init(valueX, valueY: Extended; B, H: Integer);
begin
 W := W * PI / 180;
 Vx := v * cos(w);
 Vy := v * sin(w);

 if vw < 0 then
  vorz_vw := -1
 else
  vorz_vw := 1;

 X := valueX;
 Y := valueY;
 Breite := B;
 Hoehe := H;
end;

procedure TBallEngine.Move;
var aw, ax, ay, lookX, lookY: Extended;
    vor_vx, vor_vy: Integer;
begin
 lookX := x + vx * tau;
 lookY := y + vy * tau;

 if (lookX > 700-Breite) or (lookX < 0) then vx := -e * vx;
 if (lookY > 300) or (lookY < Hoehe) then vy := -e * vy;

 if x < 0 then x := 0;
 if x > 700-Breite then x := 700-Breite;
 if y < Hoehe then y := Hoehe;
 if y > 300 then y := 300;

 aw := k * vw * vw;
 ax := k * vx * vx;
 ay := k * vy * vy;

 if vx < 0 then vor_vx := 1 else vor_vx := -1;
 if vy < 0 then vor_vy := 1 else vor_vy := -1;

 vx := vx + vorz_vw * aw * tau + vor_vx * ax * tau;
 vy := vy - g * tau + vor_vy * ay * tau;

 x := x + vx * tau;
 y := y + vy * tau;
end;
MFG
Maximus


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