Schwerkraft (#2)
Übersicht BlitzBasic Beginners-Corner
KnorxThieusBetreff: Schwerkraft (#2) |
Sa, Nov 22, 2014 18:00 Antworten mit Zitat |
|
---|---|---|
Hallo nach langer Zeit mal wieder,
Vor fast einem Jahr habe ich hier mal eine Frage zur Schwerkraft geschrieben. Eine Lösung hatte ich erhalten; ein Ball fällt mit zunehmender Geschwindigkeit abwärts, was sich durch diese Codezeilen in jedem Programmdurchlauf realisieren lässt: BlitzBasic: [AUSKLAPPEN] ys = ys + ys_ Vollständig umgesetzt ist bei mir dann das herausgekommen: BlitzBasic: [AUSKLAPPEN] Graphics 300, 600, 32, 2 ;Grafikfenster öffnen Das sieht ganz OK aus, aber nach dem 13. Hoppser springt der Ball nicht mehr hoch, sondern zittert am unteren Bildschirmrand. Mir ist schon klar, woran das liegen mag, nämlich in Zeile 17 (If y > 600 Then ys = -ys): Irgendwie wird die y-Koordinate zu oft gespiegelt. Mir ist leider trotz Nachdenkens nicht klar, wie es dazu kommt. Ich habe bereits versucht, die y-Koordinate bereits umzukehren, wenn das untere Ende des Balles den Boden berührt (If y + 25 > 600...). Merkwürdigerweise schafft die Kugel dann nicht mal mehr einen Hoppser. Ich habe auch schon im Forum gegooglet - leider vergeblich. Kann mir jemand helfen, wie es geht? Mit freundlichen Grüßen, KnorxThieus |
||
Version: BlitzPlus / Blitz+ |
TimBo |
Sa, Nov 22, 2014 20:14 Antworten mit Zitat |
|
---|---|---|
dein ySpeed wird wohl zu groß sein, baue mal eine obere Schranke für diesen Wert ein. | ||
mfg Tim Borowski // CPU: Ryzen 2700x GPU: Nvidia RTX 2070 OC (Gigabyte) Ram: 16GB DDR4 @ 3000MHz OS: Windows 10
Stolzer Gewinner des BCC 25 & BCC 31 hat einen ersten Preis in der 1. Runde beim BWInf 2010/2011 & 2011/12 mit BlitzBasic erreicht. |
KnorxThieus |
Sa, Nov 22, 2014 20:43 Antworten mit Zitat |
|
---|---|---|
Guter Ansatz, Danke!
Leider wird die Hupfhöhe (?) des Balles jetzt nicht mehr kleiner - sieh selbst: BlitzBasic: [AUSKLAPPEN] Graphics 300, 600, 32, 2 Meine Idee: Irgendwas zu ys addieren, um das auszugleichen - aber was? MfG, KnorxThieus |
||
Version: BlitzPlus / Blitz+ |
Silver_Knee |
Sa, Nov 22, 2014 23:50 Antworten mit Zitat |
|
---|---|---|
Wenn du exakt weißt, dass die Geschwindigkeit des balles negativ (nach oben) sein muss kannst du ys=-Abs(ys) nehmen. Das spiegelt die Geschwindigkeit dann nicht mehr, sondern setzt sie immer auf den gleichen Betrag wie vorher nur mit negativem Vorzeichen, ungeachtet, was vorher für ein Vorzeichen da war. | ||
XeresModerator |
So, Nov 23, 2014 0:16 Antworten mit Zitat |
|
---|---|---|
1) Möglichst alle Werte durch Variablen ersetzen.
2) Versetze die Höhe der Basislinie, sodass man sicher sein kann, dass nichts darunter verschwindet. 3) Mit DebugLog die Werte anschauen, um raus zu finden, wie sich das Programm verhält BlitzBasic: [AUSKLAPPEN]
|
||
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
KnorxThieus |
So, Nov 23, 2014 11:28 Antworten mit Zitat |
|
---|---|---|
@Silver_Knee: Vielen Dank, klingt gut! So hier?
BlitzBasic: [AUSKLAPPEN] Graphics 300, 600, 32, 2 ;Grafikfenster öffnen Irgendwie sinkt er dann auch da ab... @Xeres: In obenstehendem Code ist 2.) umgesetzt, für 1.) fehlen nur noch GraphicsWidth etc. 3.) hätte ich gemeint, estimieren zu können, du hast natürlich recht... Zum Code: Sieht gut aus, aber wie kommt das hier zustande? Und am Ende zittert er noch, wie umgeht man das? Ist der Ansatz richtig, Zeile 25 wie folgt zu verändern? BlitzBasic: [AUSKLAPPEN] ys = -ys + 0.00001
MfG, KnorxThieus |
||
Version: BlitzPlus / Blitz+ |
BladeRunnerModerator |
So, Nov 23, 2014 12:12 Antworten mit Zitat |
|
---|---|---|
Wenn die Bewegungsänderung zu gering wird einfach die Geschwindigkeit auf 0 setzen.
Das beobachtete Verhalten liegt mir an der Ungenauigkeit von Floats. Irgendwann wird die addierte Geschwindigkeit im Bereich der fehleranfälligen Stellen liegen und so kommt es zu einem zyklischen Zittern. Hier wird es zeit die Geschwindigkeit zu nullen und somit die Bewegung zu beenden. In dem Zusammenhang empfiehlt es sich auch bei floats nie auf = zu prüfen, sondern immer einen Bereich zu prüfen, um die Ungenauigkeiten zu filtern. Edit: Da Floats auf ca. 7 Stellen genau sind empfiehlt es sich auf die sechste Nachkommastelle zu prüfen. |
||
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3 Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64 B3D BMax MaxGUI Stolzer Gewinner des BAC#48, #52 & #92 |
DAK |
So, Nov 23, 2014 23:10 Antworten mit Zitat |
|
---|---|---|
So, hab mir das mal genau angeschaut. Dein Problem liegt hier:
BlitzBasic: [AUSKLAPPEN] ys = ys + ys_ Nimm an, y > 600 und ys = 0, was dann ist, wenn der Ball am Boden liegen sollte. Jetzt geht das so durch: BlitzBasic: [AUSKLAPPEN] ys = ys + ys_ ;ys = 0 + 2 Das heißt, egal ob y > 600 oder nicht, y wird um 2 erhöht -> der Ball sinkt ein. Richtig wäre es so: BlitzBasic: [AUSKLAPPEN] ys = ys + ys_ Jetzt sinkt der Ball nicht mehr ein, aber die Sprunghöhe wird nicht kleiner. Das macht auch Sinn, weil du hast noch nicht alle Kräfte drinnen, die auf den Ball wirken. Du hast Gravitation und eine Kollision ohne Energieverlust. Dir fehlt der Luftwiderstand und ggf. ein Kraftverlust beim Aufprall. BlitzBasic: [AUSKLAPPEN] ys = ys + ys_ Dazu dann noch eine Abfrage die das Versinken des Balls verhindert, und eine die die Geschwindigkeit auf 0 setzt, wenn die Geschwindigkeit zu gering wird und du kriegst das hier: BlitzBasic: [AUSKLAPPEN] Graphics 300, 600, 32, 2 ;Grafikfenster öffnen @BladeRunner und Floats: Hier bitte aufpassen, Floats sind Floating Point Numbers, also Gleitkommazahlen. Die Genauigkeit ändert sich in Abhängigkeit der Größe der Zahl! Floats sind ungefähr auf 7 Stellen genau, beginnend mit der höchsten Stelle der Zahl. Das heißt, wenn die Zahl z.B. 0.000001 ist, so ist die Variable bis ungefähr zur 12. Nachkommastelle genau. Ist die Zahl aber 10000000, so ist die Variable gerade mal auf die Zehnerstelle genau! |
||
Gewinner der 6. und der 68. BlitzCodeCompo |
Kruemelator |
So, Nov 23, 2014 23:42 Antworten mit Zitat |
|
---|---|---|
Das Problem ist sehr einfach zu lösen.
Du musst nur dafür sorgen dass der Ball nie im Boden steckt. Mehr brauchst du nicht zu ändern. BlitzBasic: [AUSKLAPPEN] If y > 600 Then ;wenn ball in den boden eindringt, Da die Bewegungsenergie nie verloren geht springt der Ball ewig, wie DAK schon beschrieben hat. |
||
BladeRunnerModerator |
Mo, Nov 24, 2014 9:27 Antworten mit Zitat |
|
---|---|---|
DAK, das ist mir schon klar. Da ich aber ja einen Fehler im Nachkommastellenbereich vermutete war auch dort das Problem verhaftet. Mir ist durchaus bewusst dass die Mantisse immer nur eine begrenzte Stellenzahl wiedergeben kann, auch wenn der Exponent groß ist. | ||
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3 Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64 B3D BMax MaxGUI Stolzer Gewinner des BAC#48, #52 & #92 |
DAK |
Mo, Nov 24, 2014 11:32 Antworten mit Zitat |
|
---|---|---|
Nah, hab eh gedacht, dass du dich damit auskennst. Es war nur, dass deine Aussage vorhin etwas missverständlich/ungenau war. Ich wollt nur, dass niemand, der sich damit nicht so auskennt, dann glaubt, dass Floats irgendeine Art von Fixed Precision haben. Kommt ja öfters vor.
Das Problem ist leider nicht nur eine Nachkomma-Ungenauigkeit, sondern hat mehr was damit zutun, wie die Gravitation hinzugefügt wird: Geschwindigkeit erhöhen Geschwindigkeit zur Position hinzufügen Erst dann checken, ob der Ball nicht eigentlich den Boden berührt. @Kruemelator: Wenn du nur das hinzufügst, ohne eine Verlangsamung, dann springt der Ball sogar immer höher, da er bei jeder Kollision immer wieder ein Stück nach oben gesetzt wird, ohne dass seine Sprungenergie verringert wird. |
||
Gewinner der 6. und der 68. BlitzCodeCompo |
Bobo2040 |
Mo, Nov 24, 2014 12:06 Antworten mit Zitat |
|
---|---|---|
Ehm... wieso sind Floats "ungenau" ?
Bin zar nicht der Threadersteller aber interresiert mich gerade :0 Wenn ich BlitzBasic: [AUSKLAPPEN]
Mache kommt das richtige bei raus :0 Auch wenn ich Nachkommastellen rechnen lasse 0.0000001 oder sowas halt kommt trozdem das richtige bei raus ... wieso sind die dann ungenau ? ^^ Erklärt mir das mal bitte :p oder verstehe ich da was falsch?:0 |
||
bitro.de |
BladeRunnerModerator |
Mo, Nov 24, 2014 12:34 Antworten mit Zitat |
|
---|---|---|
Lass mal zu 1000000 .000001 addieren und schau Dir das Ergebnis an.
Es wird (zumindest bei BMax) 1000000.00 sein. Das liegt daran dass bei Floats die Zahl in 2 Komponenten gespeichert wird: Dem Exponenten (gibt an wo das Komma in der Zahl ist) und der Mantisse (Speichert die Zahl). Da du nur begrenzt Platz hast (32 bit) ist die Genauigkeit dieser Darstellung eingeschränkt, auf (iirc) 8 Nachkommastellen. Belese dich mal bei Wikipedia zu Gleitkommazahlen. Noch dazu hat die binäre Codierung dezimaler Zahlen das Problem dass einige Zahlen gar nicht adäquat dargestellt werden können (zB muss eine periodische Zahl im Dezimalsystem nicht unbedingt eine im Binärsystem sein, bzw. die Periodenlänge kann eine andere sein. Beispiel: 1/3 = 0.3 dezimal. Binär jedoch: 0.01 Damit ergibt sich ein zusätzlicher Cut bei der Genauigkeit, und so wird BMax bei Print (1.0/3.0) folgendes ausgeben: 0.333333343 weil eben gerundet werden muss. Floats sind daher auch für Finanzberechnungen nicht sinnvoll. |
||
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3 Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64 B3D BMax MaxGUI Stolzer Gewinner des BAC#48, #52 & #92 |
KnorxThieusBetreff: Danke! :D |
Mo, Nov 24, 2014 18:26 Antworten mit Zitat |
|
---|---|---|
Hallo,
Jetzt bin ich auch wieder da - endlich... @BladeRunner: Hab ich versucht, hat aber irgendwie nicht geklappt, weil eben der Ball immer gleich hoch sprang... @DAK: Wow, super ausführliche Antwort!! Das hast du prima beschrieben, ich glaub', bis auf ein paar Kleinigkeiten ist mir jetzt alles klar:
If (Abs(ys)<2) Then ys = 0Warum <2 und nicht <1? Habe mal Letzteres eingesetzt, was auch nicht merklich schlechter aussah! (?) • Und der Kraftverlust durch den Aufprall entsteht doch bloß, wenn die Kugel teilelastisch ist? • Dann dürfte der Luftwiderstand noch von der Form/Größe/Masse/Aerodynamik der Kugel abhängig sein, wenn ich mich nicht irre? Danke auch für den Hinweis, dass die unterste Zeile GraphicsHeight() - 1 (⇒ 599) px sind! @Kruemelator: Wäre es nicht sinnvoller, ein Limit beim Einzeichnen der Kugel zu setzen? BlitzBasic: [AUSKLAPPEN] Oval 150 - 25, FLimit(y, -25, 499) - 25, 50, 50)So wird die Geschwindigkeit beim Wiederhochspringen nicht manipuliert. Floats/Mantisse (OT): Den Begriff hab sogar ich gekannt - aber wie kommt man auf den Exponenten? BladeRunner (last): Ja, bei B+ kommt taucht dieser Rundungsfehler auch auf. MfG, KnorxThieus |
||
Version: BlitzPlus / Blitz+ |
DAK |
Di, Nov 25, 2014 13:24 Antworten mit Zitat |
|
---|---|---|
@Floats: wenn man ein Float in der Dezimalsystem haben würde (ist eventuell zum Verstehen einfacher), dann schaut das z.B. so aus:
12345 (nicht Float-Darstellung) = 1.2345 * 10^4 (Float-Darstellung) Dabei heißt der linke Teil (1.2345) Mantisse und die Zahl nach dem 10^ (also 4) ist der Exponent. Der Exponent wird dabei immer so gewählt, dass es links vom Komma der Mantisse nur eine Stelle gibt. Als Float-Zahl wird das dann so gespeichert (bsp. 3 Stellen Exponent und 6 Stellen Mantisse): 0041234560 Die ersten drei Stellen sind Exponent, der Rest ist Mantisse. Der Computer rechnet und speichert natürlich im binären Zahlensystem, nicht im Dezimalen. @Abs(y)<2: Das habe ich deswegen so gewählt, da die Gravitationsbeschleunigung 2 ist. So funktioniert das Ganze bei egal welchem Luftwiderstand/Aufprallwiderstand. @Kraftverlust beim Aufprall: Ja, kommt durch die Teilelastik. @Luftwiderstand: Ist abhängig von Größe, Form, Gewicht und Luftdichte. Ermittle den aber besser durch Ausprobieren, nicht durch errechnen. Funktioniert normalerweise besser so. |
||
Gewinner der 6. und der 68. BlitzCodeCompo |
KnorxThieus |
Di, Nov 25, 2014 18:29 Antworten mit Zitat |
|
---|---|---|
Hallo,
Floats: Ist die Basis dabei immer 10? Bzw. kann man da mit Logarithmus arbeiten? Abs: Also eigtl. If (Abs(ys)<ys_)? Teilelastik müsste man doch dann eigentlich durch variierende Höhe einzeichnen, oder? Ach, ist mir momentan aber noch zu kompliziert... Luftwiderstand: OK, so hätte ich das wahrscheinlich eh gemacht. Gut, dann nochmals vielen Dank für alle Hilfe! Mit freundlichen Grüßen, KnorxThieus |
||
Version: BlitzPlus / Blitz+ |
- Zuletzt bearbeitet von KnorxThieus am Di, Nov 25, 2014 19:02, insgesamt einmal bearbeitet
BladeRunnerModerator |
Di, Nov 25, 2014 18:36 Antworten mit Zitat |
|
---|---|---|
Die Basis von Floats am Computer ist - wer hätte es geglaubt - 2. | ||
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3 Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64 B3D BMax MaxGUI Stolzer Gewinner des BAC#48, #52 & #92 |
KnorxThieus |
Di, Nov 25, 2014 19:01 Antworten mit Zitat |
|
---|---|---|
Ach so - eigentlich logisch!
Also für genau -3.141: Code: [AUSKLAPPEN] 10000001100000000000110001000110
Erklärung: S E E E E E E E E M M M M M M M M M M M M M M M M M M M M M M M 1 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 1 0 0 0 1 1 0 Oder? Quelle: Binärdarstellung von Fliesskommazahlen [sic!] |
||
Version: BlitzPlus / Blitz+ |
DAK |
Mi, Nov 26, 2014 11:27 Antworten mit Zitat |
|
---|---|---|
@Floats: genau so wie im letzten Beispiel. Dabei wird bei der Mantisse die führende 1 immer weggelassen, da die eh immer 1 ist (außer man hat 0).
@Abs: Jup, genau. Nur eventuell <= statt <, aber das sollte gerade bei Floats eh wurscht sein. @Teilelastik: Am besten einfach ausprobieren, wie beim Luftwiderstand. Bei solchen Sachen ist Ausprobieren meist besser, da man die ganz genauen Berechnungen eh nicht so schön hin kriegt. Solange es realistisch ausschaut ist es wurscht, was du genau für Werte hast. In Computerspielen sind so Sachen wie Gravitation und Elastik eh oft anders bewertet als in echt. |
||
Gewinner der 6. und der 68. BlitzCodeCompo |
KnorxThieus |
Mi, Nov 26, 2014 18:33 Antworten mit Zitat |
|
---|---|---|
OK.
DAK hat Folgendes geschrieben: In Computerspielen sind so Sachen wie Gravitation und Elastik eh oft anders bewertet als in echt.
Aufpassen muss man bloß dann, wenn mehrere Objekte im Spiel sind - dass Maßstab und Meine-Welt-Physik-Daten wie Gravitation übereinstimmen - aber auch das dürfte man durch Ausprobieren hinbekommen. Ansonsten wären dann all meine Fragen geklärt. Vielen Dank an euch! MfG, KnorxThieus |
||
Version: BlitzPlus / Blitz+ |
Übersicht BlitzBasic Beginners-Corner
Powered by phpBB © 2001 - 2006, phpBB Group