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


von Marc (Gast)


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.
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

von Jim M. (turboj)


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)


Lesenswert?

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.

: Bearbeitet durch User
von Jemand (Gast)


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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.