在 Python 2.7+ 和 3.x 中都可以使用的高效 Vector / Point 类(甚至更好:已经有一个)的最佳方法是什么?
我找到了 blender-mathutils,但它们似乎只支持 Python 3.x。然后是这个 Vector 类,它使用numpy,但它只是一个 3D 向量。使用具有静态属性(x 和 y)的向量(如kivy 的向量类(源代码))的列表似乎也很奇怪。(有所有这些列表方法。)
目前我正在使用扩展 namedtuple 的类(如下所示),但这具有无法更改坐标的缺点。我认为这可能成为一个性能问题,当成千上万的对象在移动并且每次都创建一个新的(向量)元组时。(对?)
class Vector2D(namedtuple('Vector2D', ('x', 'y'))):
__slots__ = ()
def __abs__(self):
return type(self)(abs(self.x), abs(self.y))
def __int__(self):
return type(self)(int(self.x), int(self.y))
def __add__(self, other):
return type(self)(self.x + other.x, self.y + other.y)
def __sub__(self, other):
return type(self)(self.x - other.x, self.y - other.y)
def __mul__(self, other):
return type(self)(self.x * other, self.y * other)
def __div__(self, other):
return type(self)(self.x / other, self.y / other)
def dot_product(self, other):
return self.x * other.x + self.y * other.y
def distance_to(self, other):
""" uses the Euclidean norm to calculate the distance """
return hypot((self.x - other.x), (self.y - other.y))
编辑:我做了一些测试,似乎使用numpy.array
ornumpy.ndarray
作为向量太慢了。(例如,获取一个项目几乎需要两倍的时间,更不用说创建一个数组。我认为它更适合对大量项目进行计算。)
所以,我正在寻找一个轻量级的矢量类,它具有固定数量的字段(在我的例子中只是x
和y
),可用于游戏。(如果已经有一个经过充分测试的轮子,我不想重新发明轮子。)