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