几何图形布尔运算简介
布尔运算在计算机领域是一个多含义的概念,包括逻辑上布尔类型的与并否操作,而在计算机几何上,它代表的是多边形或多面体之间的集合与并或非等操作。我们也可以粗暴地将图形布尔运算理解为多面体或多边形的加剪法运算,下图展示了多边形间的布尔运算。
布尔运算在BIM领域的应用
几何图形的布尔运算在BIM中很经常会用到,常见的有(1)梁柱之间的连接部位剪切、(2)现浇结构体与预制结构之间的扣减倒模、(3)绿化区域不同植被的面积计算等。
上述的1、2种情况属于**多面体(polyhedra)**的布尔运算,对于这种情况,达索的Spatial建模内核有很好的支持,我们常用的BIM开发平台Revit对Spatial布尔运算有一定的封装,除了极端的精度问题外,可以满足大部分场景的需要。
第3种情况属于多边形(polygon)的布尔运算,对于这种情况,目前我们用的是一个开源的多边形运算库clipperlib。然而ClipperLib只支持由线段构成的多边形间的布尔运算,且由于浮点数存在精度问题,ClipperLib只支持整形数据,这就会导致我们在实际应用时无法很好地保持曲线描述以及精度。对于这个问题,我们稍后会提出使用CGAL如何进行解决。
除了以上的两种情况,其实还有一种很常用的情况,就是设计师需要通过构造一些不规则的直线和曲线(包括圆锥曲线和样条线),并通过这些线找到闭合的区域。对于这种应用场景,Spatial和clipperLib都没法很好地解决,而通过CGAL,我们存在解决这种问题的方法。
CGAL中的布尔运算
查阅CGAL帮助文档,我们发现CGAL支持以下操作:
- 二维平面多边形的布尔运算:该多边形的布尔运算突破了ClipperLib对整形以及直线段的依赖,CGAL中的多边形可以支持直线段、圆弧、圆锥曲线弧、样条线以及任意可以用多项式方程表达的平面曲线。
- 三维多面体的布尔运算:与Spatial功能类似,这里不过度关注。
- 2D-Arrangement(二维平面划分):在查看帮助文档的过程中,我们惊喜地发现这个2D Arrangement模块,它能很好地贴合我们上面描述的通过线获取闭合区域的应用场景。2D Arrangement可以理解为一个二维平面的划分,通过给这个Arrangement添加不同的直线段和曲线段,CGAL内核会把平面分割成一个个闭合或不闭合的模块,而添加的线段也会被相互进行分割,变成多条首尾相连、互不相交的线段。下图是一个2D Arrangement的示例图:
2D Arrangement的构建
参考以下代码
// Constructing an arrangement of various conic arcs.
#include <CGAL/config.h>
#ifndef CGAL_USE_CORE
#include <iostream>
int main ()
{
std::cout << "Sorry, this example needs CORE ..." << std::endl;
return 0;
}
#else
#include <CGAL/Cartesian.h>
#include <CGAL/CORE_algebraic_number_traits.h>
#include <CGAL/Arr_conic_traits_2.h>
#include <CGAL/Arrangement_2.h>
typedef CGAL::CORE_algebraic_number_traits Nt_traits