Python中好用的几何库?

114

我正在寻找一个在python中用于几何操作和计算的好的、完善的库,例如:

  • 评估2D和3D中两条线的交点(如果存在)
  • 评估平面和直线的交点或两个平面的交线
  • 评估一条直线与一个点之间的最小距离
  • 找到通过一个点的平面的正交法向量
  • 旋转、平移、镜像一组点
  • 找到由四个点定义的二面角

我有一本收集了所有这些操作的书,虽然我可以自己实现它们,但很遗憾我没有时间,所以我希望能够使用一个库来完成。大多数操作对于游戏是有用的,所以我相信这些功能中的一些可以在游戏库中找到,但我不想包含我不需要的功能(如图形)。

有什么建议吗?谢谢


如果你只需要2D的话,可以查看这个链接:https://github.com/Pithikos/python-rectangles。 - Pithikos
有一个现代的开源库MeshLib,它具有Python接口,主要关注网格操作,但也能够处理点云、线和体素等其他数据类型。 - Fedor
8个回答

39

也许可以看一看SymPy


2
它并不真正满足我的需求,但确实是一个很酷的项目,所以我接受你的答案作为一个有趣的建议,也为了未来考虑(因为SymPy有一个几何模块和大量的开发人员)。 - Stefano Borini
2
仅支持二维,遗憾地并不是一个有建设性的几何引擎。 - meawoppl
7
SymPy的几何模块在处理速度上可能会非常非常慢。因为它旨在进行符号数学计算,它更喜欢使用精确表达式而不是近似的浮点值。考虑到通常涉及几何计算的平方根数量,你可以想象这些表达式变得非常庞大且非常缓慢。 - dusktreader
3
现在的 SymPy 更新已经包含了 3D 库。 - control_fd
谢谢你的回答。我现在正在尝试使用SymPy。第一个实验似乎执行起来相当缓慢 - 即使对于一个简单的2D对象也是如此。你有没有想法它是否适合实时处理几何图形?谢谢。 - Bill
我进行了一个快速测试,以确认@dusktreader上面关于SymPy速度的说法,结果它要慢得多。我编写了两个函数,一个使用SymPy,另一个使用pyeuclid。两者都创建了两个点/向量,然后返回它们之间线段的角度和长度,并在iPython中对它们进行了计时。test_euclid()每次循环需要5.68微秒,而test_sympy_geometry()每次循环需要4.12毫秒。但是SymPy的符号结果非常独特,我认为在某些情况下确实非常有用:(acos(3/5), sqrt(17)/2) - Bill

37

Shapely是一个很好的Python库,它封装了流行的GEOS库。


9
似乎非常专注于GIS数据处理,而不是纯粹的“数学几何”(这么说)。 - Stefano Borini
2
它确实是为GIS社区使用而创建的,但它故意忽略地理投影,这使得它非常适合用作通用欧几里德几何库。我在一个新兴的电脑游戏项目中大量使用它,并且它运行良好。 - Jonathan Hartley
18
在构建实例时可以使用第三个z坐标值,但对几何分析没有影响。所有操作都在x-y平面上执行。 - sebpiq
5
上述评论让我花了大约半个小时的时间来找出答案。真的很烦人。 - meawoppl
2
为什么问题明确要求3D,但只有一个踩? - Jamie Bull
显示剩余2条评论

16

我发现pyeuclid是一个很好的简单通用欧几里得数学包。尽管该库可能不包含您提到的确切问题,但其基础设施足够好,可以轻松地自己编写这些内容。


11

3
最后一次发布是在2009年,它们似乎不完整。有人能否说他们最近使用过它们,并且可以使用这些绑定执行问题中要求的操作? - BenjaminGolder
是的,我找到的所有绑定都不完整,包括一些真正好用的东西,比如建设性实体几何。此外,CGAL高度模板化的特性使其难以很好地封装。在我的项目(Demakein)中,我使用cffi模块和一些可怕的黑客技巧,使用内联C++代码片段直接从Python中使用CGAL。 - Paul Harrison

7
我真的希望能得到这个问题的好答案,但是前面的回答让我不太满意。然而,我刚刚发现了一个看起来很不错的工具pythonocc,它包装了OpenCascade并提供了丰富的几何建模功能。虽然缺乏良好的文档,并且安装时还存在一些问题(尚未支持pypi),但最近更新于4天前(2011年6月19日)。根据pythonocc网站所述:

pythonOCC是Python编程语言的三维CAD / CAE / PLM开发框架。提供高级拓扑和几何操作、数据交换(STEP, IGES, STL的导入/导出)、2D和3D网格化、刚体模拟、参数建模等功能。

[编辑:我已经下载了pythonocc并开始尝试一些例子]

我相信它可以完成所有提到的任务,但我发现它使用起来有点不符合直觉。它几乎完全由SWIG包装器创建,因此难以对命令进行内部检查。


在我看来,这太多了...我们应该开始一个吗?我很快就需要许多几何运算来完成我的光线追踪器,创建一个单独的Github可能是有意义的。我已经有一些代码了,我们不需要从头开始,但如果我们发现它不够好,重新设计也会很容易。 - Stefano Borini
@Stefano Borini:当然没问题!我很乐意提供帮助,但是我的资质远不及您。 - BenjaminGolder
我对现有的东西同样感到失望。对于简单的东西,我已经写了自己的代码(例如在Adolphus中),但是今晚,例如,我需要多面体-多面体交集,而从我拥有的东西到达这一点需要太多步骤才能保持理智。无论如何,如果这个项目继续下去,请算我一个。 - ezod
这个项目已经启动了吗? - Mermoz
1
@Mermoz 是的,但速度非常慢。Stefano已经开始编写库了,而我也在写自己的补充,但我们还没有走得很远。请参见https://github.com/stefanoborini/python-geometry和https://github.com/bengolder/python-geometry。 - BenjaminGolder
作为 PythonOCC 的替代方案,可以看看 OCP(https://github.com/CadQuery/OCP):“使用 pywrap 生成的 OCCT7.4 的 Python 封装”。由于这些绑定尽可能自动化地生成,因此更新到新的 OpenCascade 版本不是问题。它是由 CadQuery(https://github.com/CadQuery/cadquery)开发和用于他们自己的目的。 - tanius

6

geometry-simple 是一个使用 numpy 编写的类库,包含了 Point(点)、Line(线)、Plane(平面)和 Movement(运动)等类,代码只有约 300 行,欢迎查看。


2
你可能会对OpenOpt项目中的Python模块SpaceFuncs感兴趣,详情请访问http://openopt.org
SpaceFuncs是一个用于2D、3D、N维几何建模的工具,可以进行参数化计算、数值优化和解决几何方程组的功能。

2

Python Wild Magic 是另一个使用 SWIG 封装的代码库。虽然它是一个游戏库,但你可以操纵 SWIG 库文件,从 Python API 中排除任何不需要的图形内容。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接