numpy を避けて純粋な python でこれを行いたい人にとって、これはいくつかの良いアイデアを与えるかもしれません。この小さなスキットにも欠点と欠陥があると確信しています。"operator" モジュールは、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)
1 秒後の加速度 Acceleration(13.3574, 24.3574, 35.3574) のオブジェクトの速度: Velocity(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)