http://www.complex-a5.ru/polyboolean/comp.html 一文比较了2维多边形bool操作的效率。
根据benchmark,
PolyBoolean和gpc是比较高效的算法。但是严格意义上并不能用他们。
PolyBoolean
以有符号整数的形式表示点坐标,这样当然高效,对于浮点型点坐标,通过把浮点scale到整型进行计算。
目前 Polyboolean有c++和c#版本。地址:http://www.complex-a5.ru/polyboolean/index.html
以下是一些数据:
Library name | Principal author | Language |
---|---|---|
Boolean (v. 1.34) | Klaas Holwerda | C++ |
Boolean Operations On Polygons (v. 2.0) (BOPS) | Matej Gombosi | C++ |
CGAL (r. 1.1) | Joint project of 7 sites | C++ |
Clippoly (pl. 7) | Klamer Schutte | C++ |
Constructive Planar Geometry (CPG) | Dave Eberly | C++ |
GPC (v. 2.22) | Alan Murta | C |
LEDA (v. R-3.6.1) | Max-Planck-Institut fuer Informatik | C++ |
PolyBoolean v0.0 | Michael Leonov, Alexey Nikitin | C++ |
Capabilities
Library | AND | SUB | OR | XOR | HOLES | KH I | SI | DV | KH O |
---|---|---|---|---|---|---|---|---|---|
Boolean | + | + | + | + | + | + | - | + | + |
BOPS | + | - | + | - | + | - | - | - | + |
CGAL | + | + | + | - | - | - | - | - | - |
Clippoly | + | + | - | - | - | - | - | - | - |
CPG | + | + | + | + | + | - | - | + | - |
GPC | + | + | + | + | + | + | + | + | - |
LEDA | + | + | + | + | + | - | - | + | - |
PolyBoolean | + | + | + | + | + | + | - | + |
Speed
vc6.0编译,PC机器, Pentium II (233 MHz) and 96Mb RAM。多边形数据有字体的等高线生成。测试程序运行5次每个bool操作。测试结果如下:
N:所有多边形的顶点。时间单位为妙(s),粗体位最佳数据。
Library | N=3885 | N=7076 | N=20190 | N=69839 | N=174239 |
---|---|---|---|---|---|
Boolean | 1.084 | 1.773 | 5.923 | 23.219 | 65.927 |
Clippoly | 15.482 | 51.965 | 487.942 | ... | ... |
GPC | 0.160 | 0.381 | 8.570 | 64.463 | 133.670 |
LEDA | 0.806 | 1.422 | 3.801 | 16.636 | ... |
PolyBoolean | 0.158 | 0.255 | 0.721 | 3.532 | 16.011 |