Forum: PC-Programmierung Python - Hüpfender ball, falsche Berechnung?


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Marc (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Hallo,
ich wollte in python eine Simulation erstellen.
Ein Ball soll zusnächst einfach von einer gewissen höhe runterfallen und 
wieder hochspringen. Das funktioniert auch, allerdings mehr als 
erwartet. Daher bin ich mir nicht sicher, ob ich die werte richtig 
berechne.
Der ball springt nicht mehr so hoch, wie die ausgangssituation ist. Dies 
ist normalerweise auch richtig, allerdings habe ich noch gar keine 
Dämpfung drinn.
        global time_start

        time_now = int(round(time.time() * 1000))
        time_diff = time_now - time_start
        time_start = time_now

        if self.direction == "down": # initial 
            self.speedy += GRAVITY * time_diff #GRAVITY = 0.01
        else:
            self.speedy -= GRAVITY * time_diff
            if self.speedy <= 0: # obere lage (Ball dreht geschwindigkeit um)
                print(500 - self.y)
                self.direction = "down"

        if self.direction == "down":
            self.y += self.speedy * time_diff
            if(self.y + self.radius >= SCREEN_HEIGHT): # Ball prallt vom Boden wieder ab
                # self.speedy = self.speedy * 0.75
                self.direction = "up"
        else:
            self.y -= self.speedy * time_diff
 
        return self.x, self.y

Ich berechne zunächst die Geschwindigkeit des Balls und anhand dessen 
die Position

Woran lieg es jetzt aber, dass der Ball nicht mehr so hoch springt, wie 
beim start? Eigentlich wechseln sich ja geschwindigkeit und position 
immer ab, ohnde dass ich irgendwann mal was abziehe

von Jim M. (turboj)


Bewertung
1 lesenswert
nicht lesenswert
Bei der Berechnung verliert der Ball etwas Geschwindigkeit beim 
Abprallen:

Hinweg ("down"): self.speedy * time_diff

Rückweg ("up"): (self.speedy - GRAVITY * time_diff) * time_diff

Gemeinerweise ist die Differenz auch noch von der Frame Time time_diff 
abhängig.

von Mathias M. (matjes)


Bewertung
0 lesenswert
nicht lesenswert
Es wird deutlich einfacher, wenn du die Geschwindigkeit 
Vorzeichenbehaftet betrachtest. Dann reicht in der Schleife so was hier:
time_diff = 0.0001
speedy = 0
y = 10
GRAVITY=-1
for i in range(100):
  print(y,speedy)
  for i in range(1000):
    y += speedy*time_diff
    speedy += GRAVITY*time_diff
    if y<0: # y<radius
      speedy = -speedy


Evtl. ist das Problem bei dir, dass du in der Schleife zweimal die 
gleiche Bedingung abfragst und dann mittendrin die Richtung wechselst. 
(edit Ich denke das ist das, was  Jim M sagt)
Evtl. unterschätzt du aber auch einfach, wie genau man rechnen muss, 
damit das Ergebniss stimmt.
Irgendwie finde ich keine Startparameter, bei denen bei dir überhaupt 
was springt.

: Bearbeitet durch User
von Jemand (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Das Euler-Integrationsverfahren ist auch nicht für Genauigkeit bekannt.
Besser: https://de.wikipedia.org/wiki/Runge-Kutta-Verfahren

Die Fallunterscheidung für Auf und Ab würde ich auch sofort in die Tonne 
treten, die ist völlig unnötig, dafür gibt es Vorzeichen.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.