@Hyperion
Hatte schon nachgesehen, aber auf der Doku Seite waren nur Delimiter Bsp. fürs lesen aber es geht genauso fürs schreiben wie ich gerade gemerkt habe.
Dachte eigentlich das das "," nicht als Delimiter da steht sondern ein Teil meiner Liste ist und ich eigentlich nur eine Spalte habe. Aber gut, das hatte ich einfach falsch verstanden.
@BlackJack
Sollten sie nicht.
Eigentlich sollte das nur zwei Floats in einer Liste sein.
Hier einfach mal das ganze Programm:
Code: Alles auswählen
import csv
import operator
import math
import collections
class Vector:
'Represents a 2D vector.'
def __init__(self, x = 0, y = 0):
self.x = float(x)
self.y = float(y)
def size(self):
return sqrt(self.x**2+self.y**2)
def normalize(self):
n=sqrt(self.x**2+self.y**2)
self.x = self.x / n
self.y = self.y /n
return self
def __add__(self, val):
return Point( self[0] + val[0], self[1] + val[1] )
def __sub__(self,val):
return Point( self[0] - val[0], self[1] - val[1] )
def __iadd__(self, val):
self.x = val[0] + self.x
self.y = val[1] + self.y
return self
def __isub__(self, val):
self.x = self.x - val[0]
self.y = self.y - val[1]
return self
def __div__(self, val):
return Point( self[0] / val, self[1] / val )
def __mul__(self, val):
return Point( self[0] * val, self[1] * val )
def __idiv__(self, val):
self[0] = self[0] / val
self[1] = self[1] / val
return self
def __imul__(self, val):
self[0] = self[0] * val
self[1] = self[1] * val
return self
def __getitem__(self, key):
if( key == 0):
return self.x
elif( key == 1):
return self.y
else:
raise Exception("Invalid key to Point")
def __setitem__(self, key, value):
if( key == 0):
self.x = value
elif( key == 1):
self.y = value
else:
raise Exception("Invalid key to Point")
def __str__(self):
return "(" + str(self.x) + "," + str(self.y) + ")"
Point = Vector
def DistanceSqrd( point1, point2 ):
'Returns the distance between two points squared. Marginally faster than Distance()'
return ( (point1[0]-point2[0])**2 + (point1[1]-point2[1])**2)
def Distance( point1, point2 ):
'Returns the distance between two points'
return math.sqrt( DistanceSqrd(point1,point2) )
def LengthSqrd( vec ):
'Returns the length of a vector sqaured. Faster than Length(), but only marginally'
return vec[0]**2 + vec[1]**2
def Length( vec ):
'Returns the length of a vector'
return math.sqrt( LengthSqrd(vec) )
def Normalize( vec ):
'Returns a new vector that has the same direction as vec, but has a length of one.'
if( vec[0] == 0. and vec[1] == 0. ):
return Vector(0.,0.)
return vec / Length(vec)
def Dot( a,b ):
'Computes the dot product of a and b'
return a[0]*b[0] + a[1]*b[1]
def ProjectOnto( w,v ):
'Projects w onto v.'
return v * Dot(w,v) / LengthSqrd(v)
G=1
def csvreader(filename,delim):
print "analyzing ",filename
csv_in = csv.reader(open(filename, "rb"), delimiter=';')
#csv_in = pylab.csv2rec(file, checkrows=0, skiprows=1, delimiter=delim, names='name,position,speed,mass')
koerper=[]
#Name, Positionx, Positiony, Speedx, Speedy, Masse
for row in csv_in:
name, x_pos, y_pos, x_speed, y_speed, mass = row
koerper.append([name, [float(x_pos),float(y_pos)], [float(x_speed),float(y_speed)], float(mass)])
return koerper
def diff(x,y):
out = [x[0]-y[0],x[1]-y[1]]
return out
def skalar(x,y):
out = x[0]*y[0]+x[1]*y[1]
return out
def skavec(x,y):
out=[x*y[0],x*y[1]]
return out
def addlist(x):
out = [0,0]
for y in x:
out = [out[0]+y[0],out[1]+y[1]]
return out
def main():
print "gestartet"
zeitaufloesung = 0.1
hops = 1000
print "einlesen"
koerper = csvreader("koerper.txt", ";")
log=[]
for i in range(0, hops):
koerpernew=[]
for x in koerper:
force = [0,0]
for y in koerper:
if not y == x:
force = addlist([force, skavec(G * x[3] * y[3] / (skalar(x[1],y[1])**3), diff(x[1],y[1]))])
speednew=addlist([skavec(zeitaufloesung, force),x[2]])
positionnew = addlist([skavec(0.5 * (zeitaufloesung**2), force), skavec(zeitaufloesung,x[2]),x[1]])
koerpernew.append([x[0], positionnew, speednew, x[3]])
koerper=koerpernew[:]
for z in koerper:
log.append([koerper[koerper.index(z)][0], koerper[koerper.index(z)][1], i])
#csvwriter0 = csv.writer(open( "Erde.txt", "wb"))
#csvwriter1 = csv.writer(open( "Mond.txt", "wb"))
#for z in koerper:
# csvwriter[koerper.index(z)].append(csv.writer(open( str(koerper[koerper.index(z)][0]) + ".txt", "wb")))
#for z in log:
# csvwriter[koerper.index(z)].writerow(z[1])
#for z in log:
# if z[0]=='Erde':
# csvwriter0.writerow(z[1])
# if z[0]=='Mond':
# csvwriter1.writerow(z[1])
collector = collections.defaultdict(list)
for entry in log:
collector[entry[0]].append(entry[1])
for name, entries in collector.iteritems():
print len(entries)
with open("%s.txt" % name, "w") as fobj:
writer = csv.writer(fobj, delimiter='\t')
print entries
writer.writerows(entries)
print "finished"
main()
Der class Vektor Kram steht nur drin weil ich unten diese hässlichen Berechnungen ersetzen möchte. Hab mir da zwar (obwohl ich gelesen habe das Python das automatisch richtig machen würde) einen Lösung gebaut, aber zum lesen ist die nicht geeignet.
Ist halt alles sehr hässlich aber zumindest geht es soweit schon mal.