Для тех, кто хотел бы избежать NumPy и сделать это на чистом питоне, это может дать вам несколько хороших идей. Я уверен, что у этой маленькой пародии есть недостатки и недостатки. Модуль "оператор" ускоряет ваши математические вычисления, поскольку они выполняются с помощью функций c:
from operator import sub, add, iadd, mul
import copy
class Acceleration(object):
def __init__(self, x, y, z):
super(Acceleration, self).__init__()
self.accel = [x, y , z]
self.dimensions = len(self.accel)
@property
def x(self):
return self.accel[0]
@x.setter
def x(self, val):
self.accel[0] = val
@property
def y(self):
return self.accel[1]
@y.setter
def y(self, val):
self.accel[1] = val
@property
def z(self):
return self.accel[2]
@z.setter
def z(self, val):
self.accel[2] = val
def __iadd__(self, other):
for x in xrange(self.dimensions):
self.accel[x] = iadd(self.accel[x], other.accel[x])
return self
def __add__(self, other):
newAccel = copy.deepcopy(self)
newAccel += other
return newAccel
def __str__(self):
return "Acceleration(%s, %s, %s)" % (self.accel[0], self.accel[1], self.accel[2])
def getVelocity(self, deltaTime):
return Velocity(mul(self.accel[0], deltaTime), mul(self.accel[1], deltaTime), mul(self.accel[2], deltaTime))
class Velocity(object):
def __init__(self, x, y, z):
super(Velocity, self).__init__()
self.x = x
self.y = y
self.z = z
def __str__(self):
return "Velocity(%s, %s, %s)" % (self.x, self.y, self.z)
if __name__ == "__main__":
accel = Acceleration(1.1234, 2.1234, 3.1234)
accel += Acceleration(1, 1, 1)
print accel
accels = []
for x in xrange(10):
accel += Acceleration(1.1234, 2.1234, 3.1234)
vel = accel.getVelocity(2)
print "Velocity of object with acceleration %s after one second:" % (accel)
print vel
печатает следующее:
Ускорение (2.1234, 3.1234, 4.1234)
Скорость объекта с ускорением
Ускорение (13,3574, 24,3574, 35,3574) через одну секунду:
Скорость (26,7148, 48,7148, 70,7148)
Вы можете получить более быстрые вычисления:
def getFancyVelocity(self, deltaTime):
from itertools import repeat
x, y, z = map(mul, self.accel, repeat(deltaTime, self.dimensions))
return Velocity(x, y, z)