Point3类的概念是否与Vec3类分开,unpythonic?

时间:2011-08-30 17:58:21

标签: python math

我正在为Python编写一些3D数学类。我想在以下方面创建一个与Vec3分开的Point3类:

  

Point3 - Point3 = Vec3
  Point3 + Vec3 = Point3

否则,您可以在Point3上执行Vec3上的所有操作。这样做的动机是将点的数学概念与向量分开,希望能够实现更清晰的类型分离和更易于理解的API。

但是,使用Python的鸭子打字以及期望某个界面而不管类型的常见做法,使用Vec3会更好吗?它效率更高吗?

4 个答案:

答案 0 :(得分:3)

我认为这不是特别不合理的。在具有相同域的情况下区分类型并且当一个具有特定的引用框架(例如时区)时,并不是很不寻常。因为一个点是向量和原点的总和,所以在某些区域对其进行编码是合理的。办法。

答案 1 :(得分:3)

这似乎是多余的。如果你考虑一下,笛卡尔空间中的一个点完全等同于从原点开始的束缚向量。听起来你可能为自己做了很多工作。

答案 2 :(得分:1)

我理解你的论点。我也一直在努力学习积分课程。根据我的经验,采用更实用的方法并根据列表/元组的函数编写API更好(尽管我猜也许不是“更多pythonic”)。

我认为,对此的主要反对意见是,你可能想要一种简洁的方式来编写简单的代数运算(总和等。),但为此我建议使用numpy。 numpy不仅支持元素添加,而且通过矩阵运算等方式为您提供将来可能需要它的效率。

同时,当您说想要一个干净的API时,除了文档之外,您添加到API的差异将是不可见的。实际上,一个看不见的API并没有那么有用。

我知道这与你最初的问题完全不同,但我怀疑它是长期最好的设计( ie 随着你的图书馆的发展,你想要支持更加雄心勃勃的点转换,批处理,等。等。)。

答案 3 :(得分:1)

是的,这是糟糕的设计,因为增加或减少两点没有概念意义。

但是,您可以向点添加矢量(获取点)或添加两个矢量(获取矢量),因此听起来您只是将点与矢量混淆。

点不是矢量,但可以以一个实现。在编程中,我们使用组合模拟“使用组合实现”关系 - Point类将包含一个私有Vector实例,并使用它来处理它暴露的任何方法的逻辑。

事实上,因为Vector已经可以完成Point可以做的所有相同的事情(加上更多),你可能想要考虑甚至不打扰进行区分,并且只使用{ {1}}类,根本没有Vector类。这是否是一个好主意取决于您的API将用于什么。