import numpy as np
import matplotlib.pyplot as plt

# Konstante Erdbeschleunigung
g = 9.81  # m/s^2

# Anfangswerte für senkrechten Wurf
# Positiv = nach oben
y0 = 0.0     # Startposition in m
v0 = 20.0    # Anfangsgeschwindigkeit in m/s (z.B. Wurf nach oben)

# Optional: Benutzereingabe
# y0 = float(input("Anfangshöhe y0 in m: "))
# v0 = float(input("Anfangsgeschwindigkeit v0 in m/s (positiv nach oben): "))

# Definition der Bewegungsgleichungen
def y(t):
    """Weg-Zeit-Funktion"""
    return y0 + v0 * t - 0.5 * g * t**2

def v(t):
    """Geschwindigkeits-Zeit-Funktion"""
    return v0 - g * t

def a(t):
    """Beschleunigungs-Zeit-Funktion (konstant)"""
    return -g * np.ones_like(t)

# Flugzeit bis zum Boden bestimmen: y(t) = 0
# y(t) = y0 + v0 * t - 0.5 * g * t^2 = 0
# quadratische Gleichung: -0.5*g*t^2 + v0*t + y0 = 0
A = -0.5 * g
B = v0
C = y0

D = B**2 - 4 * A * C  # Diskriminante

if D < 0:
    raise ValueError("Keine reale Lösung für die Flugzeit (prüfe y0 und v0).")

t1 = (-B + np.sqrt(D)) / (2 * A)
t2 = (-B - np.sqrt(D)) / (2 * A)

# Wir brauchen die positive Zeit
t_impact_candidates = [t for t in (t1, t2) if t > 0]
if not t_impact_candidates:
    raise ValueError("Keine positive Aufprallzeit gefunden (prüfe y0 und v0).")

t_impact = max(t_impact_candidates)

# Zeitvektor von 0 bis Aufprallzeit
t = np.linspace(0, t_impact, 400)

# Werte berechnen
y_t = y(t)
v_t = v(t)
a_t = a(t)

# Plot 1: Weg-Zeit-Funktion
plt.figure()
plt.plot(t, y_t)
plt.xlabel("Zeit t [s]")
plt.ylabel("Höhe y(t) [m]")
plt.title("Senkrechter Wurf: Weg-Zeit-Funktion")
plt.grid(True)

# Plot 2: Geschwindigkeit-Zeit-Funktion
plt.figure()
plt.plot(t, v_t)
plt.xlabel("Zeit t [s]")
plt.ylabel("Geschwindigkeit v(t) [m/s]")
plt.title("Senkrechter Wurf: Geschwindigkeit-Zeit-Funktion")
plt.grid(True)

# Plot 3: Beschleunigung-Zeit-Funktion
plt.figure()
plt.plot(t, a_t)
plt.xlabel("Zeit t [s]")
plt.ylabel("Beschleunigung a(t) [m/s^2]")
plt.title("Senkrechter Wurf: Beschleunigung-Zeit-Funktion")
plt.grid(True)

plt.show()
