# Schräger Wurf mit Steuerelementen
# A. Filler, 2005
#----------------------------------------------------------
from visual import *
from visual.controls import *
print """
- Rotieren Sie die Kamera mit der rechten Maustaste.
- Zoomen Sie in das Bild hinein oder aus dem Bild heraus
  mit der mittleren Maustaste oder mit der linken + rechten
  Maustaste.
"""

# Festlegung der Ereignisse bei Verwendung der Buttons
def setwurf(): 
    if b1.text == 'Wurf':
        b1.text = '-----'
    else:
        b1.text = 'Wurf'
def zurueck(): 
    if b2.text == 'Zurueck':
        b2.text = '----'
    else:
        b2.text = 'Zurueck'
# Festlegung der Ereignisse bei Verwendung der Schieberegler
def setwinkel(obj): 
    winkelrate(obj.value) 
def setgeschw(obj): 
    geschwrate(obj.value) 
def winkelrate(value):
    winkel = 45
def setgeschw(value):
    geschw = 2

# Steuerfenster und Buttons erzeugen
c = controls(title='Wurfsteuerung',x=0, y=0, width=224, height=600, range=100) 
b1 = button( pos=(0,78), width=50, height=20, text='Wurf', action=lambda: setwurf())
b2 = button( pos=(0,50), width=50, height=20, text='Zurueck', action=lambda: zurueck())
s1 = slider(pos=(-16,-74), width=7, length=80, axis=(0,1,0), min = 0, max =100, action=lambda: setwinkel(s1))
s2 = slider(pos=(16,-74), width=7, length=80, axis=(0,1,0), min = 0, max =20, action=lambda: setgeschw(s2))
d1 = button( pos=(-16,-85), width=28, height=14, text='Winkel')
d2 = button( pos=(16,-85), width=28, height=14, text='Geschw.')

s1.value=50
s2.value=6

# 3D-Szene erzeugen
scene.x=224
scene.y=0
scene.width = 800
scene.height = 600
scene.center = (0,-0.8,0)
scene.range = 4
scene.background = (0.85,0.85,0.85)
scene.title = "Schraeger Wurf"
Boden = box (pos=(0, -3.1, 0), length=7,  height=0.25, width=7,  color = (0.85,0.85,0.85))

# Startposition:
start = (-2.5,-2.8,0)

# Startpunkt:
Puenktchen = sphere (pos=start, color = (0.3,0.3,0.3), radius = 0.05)

# Geworfene Kugel:
Kugel = sphere (pos=start, color = color.blue, radius = 0.2)

# Vektor der Fallbeschleunigung:
g = vector (0,-10,0)

# Bahnkurve:
Spur = curve(color = (0.3,0.3,0.3), radius=0.015)

# Animation:
dt = 0.005
t = 0.0

# Pfeil, der den Vektor der Anfangsgeschwindigkeit symbolisiert
pfeilzylinder=cylinder(pos=start, axis=(1,1,1), radius=0.03)
pfeilkegel=cone(pos = vector(start)+vector(1,1,1), axis=(1,1,1), radius=0.07)

while 1:
    rate(100)
    c.interact() # Abfrage von Mauseingaben im Kontrollfenster

    # Anfangsgeschwindigkeit:
    vx = s2.value * cos(s1.value*pi/200)
    vy = s2.value * sin(s1.value*pi/200)
    v0 = vector (vx, vy, 0)
    pfeilzylinder.visible = 0
    pfeilkegel.visible = 0
    pfeilzylinder=cylinder(pos=start, axis=(0.2*vx,0.2*vy,0), radius=0.03)
    pfeilkegel=cone(pos = vector(start)+vector(0.2*vx,0.2*vy,0), axis=(0.05*vx,0.05*vy,0), radius=0.07)
    pfeilzylinder.visible = 1
    pfeilkegel.visible = 1
    
    if b1.text == '-----':
        t = 0.0
        while Kugel.pos.y >= vector(start).y: 
              rate(100)
              t = t + dt
              Kugel.pos = vector(start) + t*v0 + 0.5*g*t*t
              Spur.append(pos=Kugel.pos)
    if b2.text == '----':
              b1.text = 'Wurf'  
              Spur.visible = 0
              del Spur
              Spur = curve(color = (0.3,0.3,0.3), radius=0.015)
              Spur.visible = 1
              t = -0.01
    if t < 0:
              Kugel.pos = vector(start)
              b2.text = 'Zurueck'
              t = 0.0
