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()