Python - Hüpfender ball, falsche Berechnung?

Gast #6168839
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.
1
        global time_start
2

3
        time_now = int(round(time.time() * 1000))
4
        time_diff = time_now - time_start
5
        time_start = time_now
6

7
        if self.direction == "down": # initial 
8
            self.speedy += GRAVITY * time_diff #GRAVITY = 0.01
9
        else:
10
            self.speedy -= GRAVITY * time_diff
11
            if self.speedy <= 0: # obere lage (Ball dreht geschwindigkeit um)
12
                print(500 - self.y)
13
                self.direction = "down"
14

15
        if self.direction == "down":
16
            self.y += self.speedy * time_diff
17
            if(self.y + self.radius >= SCREEN_HEIGHT): # Ball prallt vom Boden wieder ab
18
                # self.speedy = self.speedy * 0.75
19
                self.direction = "up"
20
        else:
21
            self.y -= self.speedy * time_diff
22
 
23
        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
#6168906
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.
#6168918
Es wird deutlich einfacher, wenn du die Geschwindigkeit 
Vorzeichenbehaftet betrachtest. Dann reicht in der Schleife so was hier:
1
time_diff = 0.0001
2
speedy = 0
3
y = 10
4
GRAVITY=-1
5
for i in range(100):
6
  print(y,speedy)
7
  for i in range(1000):
8
    y += speedy*time_diff
9
    speedy += GRAVITY*time_diff
10
    if y<0: # y<radius
11
      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.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 6 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.