Comparison of the different algorithms for  Polygon Boolean operations.

Michael Leonov 1998

http://www.angusj.com/delphi/clipper.php#screenshots

http://www.complex-a5.ru/polyboolean/comp.html

http://www.angusj.com/delphi/clipper.php#screenshots

Introduction

When writing my BS  degree work I tested the following software libraries for speed and  robustness of performing polygon Boolean operations:

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 + + + + + + - + -

First 4 columns denote supported Boolean operations. HOLES means that  a library can handle polygons with holes. KH I means that a library can  handle polygons with 'keyholed' edges, which are sometimes used to describe a  polygon with holes by means of single contour. SI means that a library  allows self-intersecting polygons at its input. DV means that a library  supports polygons with vertices of high degree, i.e. self-touching polygons. KH O means that a library's output can contain keyholed edges (I think  this is the library's disadvantage).

Speed

For testing I used PC with CPU Pentium II (233 MHz) and 96Mb RAM running  Windows NT Workstation 4.0 SP4. All source code was compiled with Microsoft  Visual C++ 6.0 using the same alignment (8 bytes) and optimization options.  Sample polygons were extracted from True Type Font contours using different  levels of Bezier curves polygonal approximation. The test program was executed 5  times for every Boolean operation. The results are summarized in the table below  (N denotes the total number of vertices in input polygons, all timings are  measured in seconds, best times for each N are bold):

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

For N=69839, 174239 Clippoly caused stack overflow due to the O(N)  recursion depth. For N=174239 LEDA caused memory overflow (despite the  presence of the extra 100 Mb of virtual memory) due to the extensive use of the  rational ariphmetic.

Like Clippoly, CGAL and CPG have quadratic running time. BOPS produced incorrect results on test polygons so I did not include its  timings.

Numerical robustness

Most of the programs listed above are not strictly robust and use floating  point arithmetic with some tolerance values. CGAL, CPG and LEDA use exact rational arithmetic to achieve robustness. In this case,  required memory size grows exponentially with a number of cascaded operations,  and this seems not to be satisfactory for practical applications. PolyBoolean uses John Hobby's rounding cell technique to avoid extraneous  intersections and is therefore completely robust. Boolean also rounds the  intersection points to the integer grid, then repeats until no new intersection  points are found.

References

Algorithm used in Boolean is described in [Holwerda  98]. Some additional information can be found in [Preparata  and Shamos 85] (a must-have Computational Geometry book).

Algorithm used in BOPS is described in [Zalik,  Gombosi and Podgorelec 98].

Algorithm used in CGAL is not documented.

Algorithm used in Clippoly is described in [Schutte  94] and [Schutte  95].

Algorithm used in CPG is described in [Eberly  98].

GPC uses a modified version of [Vatti  92]. Implementation details are discussed in [Murta  98]. Alan Murta is currently working on a paper describing GPC.

Polygon Boolean algorithm used in LEDA is not documented by itself.  The segment intersection part is described in [Mehlhorn  and Naher 94].

Polygon Boolean algorithm used in PolyBoolean is described in [Leonov  and Nikitin 97]. Additional algorithmic and implementation issues are  discussed in [Leonov 98].  The segment intersection part is based on [Bentley  and Ottmann 79] and [Hobby  99].

Bentley and Ottmann 1979
J. L. Bentley and T. A. Ottmann. Algorithms for reporting and counting   geometric intersections. IEEE Trans. Comput., C-28:643-647,  1979.
Eberly 1998
D. Eberly. Polysolids   and Boolean Operations.
Hobby 1999
J. Hobby. Practical segment   intersection with finite precision output. Computation Geometry Theory and   Applications, 13(4), 1999.
Holwerda 1998
K. Holwerda et al. Complete   Boolean Description.
Leonov and Nikitin 1997
M. V. Leonov and A. G. Nikitin. An   Efficient Algorithm for a Closed Set of Boolean Operations on Polygonal   Regions in the Plane(draft English translation). A. P. Ershov   Institute of Informatics Systems, Preprint 46, 1997.
Leonov 1998
M. V. Leonov. Implementation   of Boolean operations on sets of polygons in the plane(in Russian).   BS Thesis, Novosibirsk State University, 1998.
Mehlhorn and Naher 1994
K. Mehlhorn and S. Naher. Implementation   of a Sweep Line Algorithm for the Straight Line Segment Intersection   Problem. Max-Planck-Institut fur Informatik, MPI-I-94-160,   1994.
Murta 1998
A. Murta. A   Generic Polygon Clipping Library.
Preparata and Shamos 1985
F. P. Preparata and M. I. Shamos. Computational Geometry: An   Introduction. Springer-Verlag, New York, NY, 1985
Schutte 1994
K. Schutte. Knowledge Based Recognition of Man-Made Objects. PhD   Thesis, University of Twente, 1994. ISBN90-9006902-X.
Schutte 1995
K. Schutte. An edge labeling   approach to concave polygon clipping. Manuscript, 1995.
Vatti 1992
B. R. Vatti. A generic solution to polygon clipping. Commun. ACM,   35(7):56-63, 1992.
Zalik, Gombosi and Podgorelec   1998
B. Zalik, M. Gombosi and D. Podgorelec. A   Quick Intersection Algorithm for Arbitrary Polygons. In L. Szirmay-Kalos   (Ed.), SCCG98 Conf. on Comput. Graphics and it's Applicat., 195-204,   1998. ISBN 80-223-0837-4.

Conclusions

All tested libraries are very good for educational purposes and for studying  different approaches to the polygon Boolean operations. PolyBoolean, Boolean and GPC are probably the fastest publicly available  libraries. The correct rounding of intersection points is performed only in PolyBoolean and Boolean. Of course, all these opinions are only  mine, and I don't attempt to make strong assertions about usefulness of these  programs. Click here  to get the polygons I used for testing. Soon I will make the source code of the  test program (with all necessary modifications of the tested libraries) publicly  available.

[算法]Comparison of the different algorithms for Polygon Boolean operations的更多相关文章

  1. OpenCascade Modeling Algorithms Boolean Operations

    Modeling Algorithms Boolean Operations of Opencascade eryar@163.com 布尔操作(Boolean Operations)是通过两个形状( ...

  2. Python - 数据结构与算法(Data Structure and Algorithms)

    入门 The Algorithms Python https://github.com/TheAlgorithms/Python 从基本原理到代码实现的Python算法入门,简洁地展示问题怎样解决,因 ...

  3. 游戏编程算法与技巧 Game Programming Algorithms and Techniques (Sanjay Madhav 著)

    http://gamealgorithms.net 第1章 游戏编程概述 (已看) 第2章 2D图形 (已看) 第3章 游戏中的线性代数 (已看) 第4章 3D图形 (已看) 第5章 游戏输入 (已看 ...

  4. 图及其衍生算法(Graphs and graph algorithms)

    1. 图的相关概念 树是一种特殊的图,相比树,图更能用来表示现实世界中的的实体,如路线图,网络节点图,课程体系图等,一旦能用图来描述实体,能模拟和解决一些非常复杂的任务.图的相关概念和词汇如下: 顶点 ...

  5. 树及其衍生算法(Trees and tree algorithms)

    1,二叉树(Binary tree) 二叉树:每一个节点最多两个子节点,如下图所示: 相关概念:节点Node,路径path,根节点root,边edge,子节点 children,父节点parent,兄 ...

  6. 算法导论(Introduction to Algorithms )— 第十二章 二叉搜索树— 12.1 什么是二叉搜索树

    搜索树数据结构支持很多动态集合操作,如search(查找).minmum(最小元素).maxmum(最大元素).predecessor(前驱).successor(后继).insert(插入).del ...

  7. Technical notes fornight

    1.8.2016 Royal trumpeters heralded the beginning of the annual ceremony, as Norway's royal family an ...

  8. Python基础杂点

    Black Hat Python Python Programming for Hackers and Pentesters by  Justin Seitz December 2014, 192 p ...

  9. R语言︱决策树族——随机森林算法

    每每以为攀得众山小,可.每每又切实来到起点,大牛们,缓缓脚步来俺笔记葩分享一下吧,please~ --------------------------- 笔者寄语:有一篇<有监督学习选择深度学习 ...

随机推荐

  1. Scrum会议5(Beta版本)

    组名:天天向上 组长:王森 组员:张政.张金生.林莉.胡丽娜 代码地址:HTTPS:https://git.coding.net/jx8zjs/llk.git SSH:git@git.coding.n ...

  2. 漫谈Java虚拟机(JVM)

    Java 虚拟机(JVM)是可运行 Java 代码的假想计算机. 只要根据 JVM 规范描述将解释器移植到特定的计算机上,就能保证经过编译的任何 Java 代码能够在该系统上运行. 从上图中不难明白J ...

  3. SAE saestorage.class.php文件的封装代码

    Source for file saestorage.class.php Documentation is available at saestorage.class.php <?php /** ...

  4. [ZZ] KlayGE 游戏引擎 之 Order Independent Transparency(OIT)

    转载请注明出处为KlayGE游戏引擎,本文的永久链接为http://www.klayge.org/?p=2233 http://dogasshole.iteye.com/blog/1429665 ht ...

  5. spring对dao层的支持(datasource的作用)

    本文大多数内容转自“http://www.cnblogs.com/liunanjava/p/4412408.html”感谢原作者 在做一个项目时,持久层并没有使用spring jpa和hibernat ...

  6. PHP调用java的class

    PHP调用java的class   转:http://hi.baidu.com/lei0827/blog/item/28439a4e923234ced1c86a18.html PHP调用java的cl ...

  7. Yii源码阅读笔记(一)

    今天开始阅读yii2的源码,想深入了解一下yii框架的工作原理,同时学习一下优秀的编码规范和风格.在此记录一下阅读中的小心得. 每个框架都有一个入口文件,首先从入口文件开始,yii2的入口文件位于we ...

  8. Oracle 数据库安装

    下载 www.oracle.com ->Downloads -> Oracle Database 安装: 解压到同一文件夹下 仅安装数据库软件 单实例数据库安装 企业版 oracle基目录 ...

  9. Apache Kafka源码分析 - ReplicaStateMachine

    startup 在onControllerFailover中被调用, /** * Invoked on successful controller election. First registers ...

  10. WIN7 64位系统下的服务程序更新失败问题解决

    自己用DELPHI做了个小的服务在后台运行,帮助自己做一些琐事,今天修改了一下代码结果重启服务的时候一直还是以前的状态,新加的代码没任何效果. 1.检查程序没问题呀 2.关闭SSD缓存硬盘问题仍旧 3 ...