Links und Funktionen
Sprachumschaltung

Navigationspfad


Inhaltsbereich

ausweichenNullPunktFuenf.py

ausweichenNullPunktFuenf.py — text/python-source, 6 KB (6530 bytes)

Dateiinhalt

'''
Created on 16.04.2011
Version 0.5
Wichtigste Neuerungen: Automatisches Einfuegen von Hindernissobjekten an einer per Zufallsgenerator ermittelten und vollstaendig geometrisch errechneten Position und mit richtiger Ausrichtung
Achtung: In dieser Version ist noch nicht die am Freitag gemeinsam erarbeite Steuerung uebernommen worden, sonder sie bassiert auf meinem eigenem Prinzip
Vorteile gegenueber des Loesungsansatzes vom Florian fuer die Hindernissplatzierung - Hiermit sind auch Tunnel und im Allgemeinen komplexere Obiekte als Hindernisse moeglich
@author: christoph
'''
from visual import *
from random import *
from math import *

scene.width=1000
scene.height=1000
system = frame()        #Der Frame System enthaelt die Fahrbahn und alle Hindernissobjekte
bahn = ring(frame = system, axis=(0,1,0), radius = 10, thickness = .5, opacity=0.5)
auto = box(color = color.red, lenght = .5, height = .5, width = .5, y = bahn.thickness+.25, z = bahn.radius, axis=(1, 0, 0))
origin = (0,0,bahn.radius)
hindernisse = []
lamo1=local_light(color=color.yellow)

def drehen():
    while true:
        rate(50)
        #auto.rotate(angle=radians(0.5), axis = (1,0,0), origin = (0,0,bahn.radius))
        system.rotate(angle=radians(0.5), axis = (0,1,0))
         
def fahren():
    while true:
        rate(50)
        lenkenOhneRotate((30*scene.mouse.pos.x))
        system.rotate(angle=radians(0.3), axis = (0,1,0))



def lenkenOhneRotate(Grad):   
    auto.z=round(cos(radians(Grad)), 3) * (bahn.thickness+.20) + bahn.radius            
    auto.y=round(sin(radians(Grad)), 3) * (bahn.thickness+.20)                          
        
    bahnradius=vector(0, 0, 10)
    autovektor=vector(0, auto.y, auto.z)
    normale=autovektor-bahnradius
    print normale    
    
    y=1
    z=(-(normale.y*y))/(normale.z+0.0001)
    
    tangente=(0, y, z)
    print "tangente:", tangente
    auto.axis=tangente
    auto.length=0.25
        
def KordinatenfuerHindernisse():
    for i in range(1, 50):  #10 Staebe und 10 Kugeln werden eingefuegt
        x1=randrange(-bahn.radius*10000+1, bahn.radius*10000+1, 1)/10000      
        '''Die Methode hat den Zweck, auf irgendwo auf dem Ring ein Hinderniss zu platzieren. Nachdem der Ring in der y-Ebene liegt, muessen nur passende x- und z-kordinaten
        gefunden werden. Nimmt man nun irgendeine x-Kordinate(x1), so ergibt sich durch einen mathematischen Zusammenhang (weiter unten!)auch die zugehoerige z-kordinate(z1) des Ringpunkts
        Der x-Wert kann jedoch nie groesser wie der Ringradius gewaehlt werden'''
        if round(x1, 3)==0:     #Vermeidung einer Null-Division; Bin mir nicht sicher, ob das noetig ist...
            continue
        
        if randrange(0,2,1)==0:     #Beim Radizieren gingen ohne die Fallunterscheidung die Vorzeichen verloren
            z1=round(-sqrt((bahn.radius ** 2)-(x1 ** 2)), 4)    #Berechnung des z-Wertes des auf dem Ring liegen Punkt in abhaengigkeit vom bereits feststehenden x-Wert
        else:
            z1=round(sqrt((bahn.radius ** 2)-(x1 ** 2)), 4)
        
        verhaeltnissXZ=z1/x1    #wird spaeter benoetigt. Eine Null-Divison wird bereits bei der Generierung des x-Wertes anhand eines Zufallsgenerator durch eine geeignete Wertemenge ausgeschlossen
        zufallswinkel=randrange(0, 360, 1)  
        '''Es wurde bisher nur 'grob' bestimmt, wo das Hinderniss platziert werden soll. Man kann sich ein 2-dimensionales Kordinatensystem vorstellen, indem der Ring genau den Ursprung
        durchlaeuft und sozusagen aus dem Kordinatensystem-ebene heraus der Betrachter entegegenlaeuft. Durch obige zufallswinkel-Bestimmung wird auf den Grad genau festgelegt,
        in welchem Quadtranten dieses vorgestellte Kordinatensystems das Hinderniss eingeguegt werden soll'''
        zwischenspeicher=round(cos(radians(zufallswinkel)), 3) * bahn.thickness     #Da da Hinderniss also ueberall um den Ring herum stationiert werden kann, aendert sich auch die Lage in der xz-Ebene geringfuegig. Dies wird in dieser Zeile berechnet
        laengeDesGesamtvektors=bahn.radius+zwischenspeicher #Laenge des Ortsvektors. Dieser zeigt dorthin, wo das Hinderniss eigefuegt werden soll. Dabei ist die geringfuegige Aenderung in de xz Ebenen hervorgehen aus vorheriger Zeile bereits inbegriffen. Jedoch noch keine y-Komponente
        if randrange(0,2,1)==0:     #Durch Wurzel wuerde ansonsten das Vorzeichen verloren gehen
            x2=round(-sqrt((laengeDesGesamtvektors ** 2)/(1+ verhaeltnissXZ ** 2)), 4)      #Grundlegende Formel: Betrag eines Vektors=sqrt(komponente1 im Quadrat + komponente2 im Quadrat + [komponente3 im Quadrat])
        else:
            x2=round(sqrt((laengeDesGesamtvektors ** 2)/(1+ verhaeltnissXZ ** 2)), 4)
        z2=x2*verhaeltnissXZ
        y2=round(sin(radians(zufallswinkel)), 3) * bahn.thickness       #Da da Hinderniss also ueberall um den Ring herum stationiert werden kann, aendert sich auch die Lage in der y-Ebene. Dies wird in dieser Zeile berechnet
        
        print "z1",z1, "x1", x1, "verhaeltniss", verhaeltnissXZ, "zwischenspeicher", zwischenspeicher, "laengedesGesamtvektors", laengeDesGesamtvektors, x2 , z2, "y2", y2
        positionsvektor=vector(x2, y2, z2)      #Engueltiger und vollstaendiger Ortsvektor, der an den Ort zeig, wo das Hinderniss eingefuegt werden soll
        test=sphere(pos=positionsvektor, color=color.blue, radius=0.3)      #nur zu TESTZWECKEN
        
        normale=positionsvektor-vector(x1, 0, z1)   #Normale durch den Punkt, an dem das Hinderniss eigefuegt werden soll
        #Bestimmung der Tangente
        if y2==0:   #Vemeidung einer Null-Divison
            continue
        ytangente=((zwischenspeicher*3)/y2)      #Berechnen des TangentenVektors durch den Punkt, an dem die Hindernisse stationiert werden sollen. Zweck: Hindernisse werden daran ausgerichtet und liegen somit buendig am Ring an:               
        xztangente=3    
        xtangente=round(-sqrt((xztangente ** 2)/(1+verhaeltnissXZ ** 2)))
        ztangente=xtangente*verhaeltnissXZ
        tangente=vector(xtangente, ytangente, ztangente)
        test=box(frame=system, pos=positionsvektor, axis=tangente,color=color.blue,  height=0.3, width=0.3, length=2)            #Einfuegen der Hindernisse an der Position unm mit der Ausrichtung, die von dieser ganzen Funtkion errechnet wurde. Vorerst jedoch nur TEST-Objekte. Alle Hinderniss-Objekte werden in eine Liste eingefuegt.
        test.length=1
        hindernisse=[test]


KordinatenfuerHindernisse()        
    
fahren()

Funktionsleiste