对于那些想避免使用 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)
加速度物体的速度 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)