尝试用大一统的计算几何库CGAL解决BIM的算法问题(三)——图形的布尔运算

几何图形布尔运算简介

布尔运算在计算机领域是一个多含义的概念,包括逻辑上布尔类型的与并否操作,而在计算机几何上,它代表的是多边形或多面体之间的集合与并或非等操作。我们也可以粗暴地将图形布尔运算理解为多面体或多边形的加剪法运算,下图展示了多边形间的布尔运算。
来自维基百科

布尔运算在BIM领域的应用

几何图形的布尔运算在BIM中很经常会用到,常见的有(1)梁柱之间的连接部位剪切、(2)现浇结构体与预制结构之间的扣减倒模、(3)绿化区域不同植被的面积计算等。

上述的1、2种情况属于**多面体(polyhedra)**的布尔运算,对于这种情况,达索的Spatial建模内核有很好的支持,我们常用的BIM开发平台Revit对Spatial布尔运算有一定的封装,除了极端的精度问题外,可以满足大部分场景的需要。

第3种情况属于多边形(polygon)的布尔运算,对于这种情况,目前我们用的是一个开源的多边形运算库clipperlib。然而ClipperLib只支持由线段构成的多边形间的布尔运算,且由于浮点数存在精度问题,ClipperLib只支持整形数据,这就会导致我们在实际应用时无法很好地保持曲线描述以及精度。对于这个问题,我们稍后会提出使用CGAL如何进行解决。

除了以上的两种情况,其实还有一种很常用的情况,就是设计师需要通过构造一些不规则的直线和曲线(包括圆锥曲线和样条线),并通过这些线找到闭合的区域。对于这种应用场景,Spatial和clipperLib都没法很好地解决,而通过CGAL,我们存在解决这种问题的方法。

CGAL中的布尔运算

查阅CGAL帮助文档,我们发现CGAL支持以下操作:

  1. 二维平面多边形的布尔运算:该多边形的布尔运算突破了ClipperLib对整形以及直线段的依赖,CGAL中的多边形可以支持直线段、圆弧、圆锥曲线弧、样条线以及任意可以用多项式方程表达的平面曲线。
  2. 三维多面体的布尔运算:与Spatial功能类似,这里不过度关注。
  3. 2D-Arrangement(二维平面划分):在查看帮助文档的过程中,我们惊喜地发现这个2D Arrangement模块,它能很好地贴合我们上面描述的通过线获取闭合区域的应用场景。2D Arrangement可以理解为一个二维平面的划分,通过给这个Arrangement添加不同的直线段和曲线段,CGAL内核会把平面分割成一个个闭合或不闭合的模块,而添加的线段也会被相互进行分割,变成多条首尾相连、互不相交的线段。下图是一个2D Arrangement的示例图:来自CGAL帮助文档

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
  • 4
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 布尔运算是计算机图形学中一种常用的运算方式,可以对图形进行合并、交集、差集等操作。通过布尔运算,可以方便地对图形进行编辑、处理和分析,提高了图形处理的效率和灵活性。 孔洞是指一个封闭的几何图形中的空白区域,没有实际的几何形状。在计算机图形学中,处理孔洞是一项重要的任务。它可以用来处理有孔洞的图形,例如在二维图形中隧道、窗户等,以及在图形中的洞穴、空洞等。 CGAL计算几何算法)是一个强大的计算几何算法,提供了大量的几何算法和数据结构,用于处理几何图形的建模和计算。CGAL包含了许多常用的布尔运算和孔洞处理算法,可以方便地对几何图形进行合并、分割、填补孔洞等操作。 在CGAL中,可以使用布尔运算来将多个几何图形合并为一个新的几何图形,或者计算两个几何图形的交集、差集等。此外,CGAL还提供了用于检测和处理孔洞的算法,可以准确地找到图形中的孔洞并进行填补或删除。 总之,布尔运算和孔洞处理在计算机图形学中具有重要的应用,而CGAL作为一个强大的计算几何算法,提供了丰富的算法和工具,可以方便地进行布尔运算和孔洞处理,从而实现对几何图形的灵活编辑和处理。 ### 回答2: 布尔运算是指将两个或多个图形形状进行逻辑运算的方法。这些图形形状可以是线段、多边形、曲线等,在进行布尔运算之后会得到新的图形形状。常见的布尔运算有并运算、交运算和差运算。 孔洞是指图形中的一个或多个区域被另一个图形包围,形成的空洞。在布尔运算中,我们可以使用孔洞来创建复杂的图形形状。例如,在几何计算CGAL中,可以通过使用布尔运算来创建凹多边形,其中包含一个或多个孔洞。 CGAL计算几何算法的缩写,是一个功能强大的开源,提供了丰富的几何计算功能。它支持多种几何对象的表示和处理,包括点、线段、多边形等。CGAL中提供了各种布尔运算算法,可以进行复杂的几何操作,比如计算两个多边形的交集、并集和差集等。 通过使用CGAL中的布尔运算算法,我们可以方便地对图形进行编辑和处理。例如,我们可以使用CGAL来合并多个几何图形,删除或添加孔洞,从而生成所需的最终图形。这在各种领域中都有广泛的应用,如计算机图形学、地理信息系统、CAD等。 总之,布尔运算是一种用于逻辑处理图形形状的方法,而孔洞是指图形中被包围而形成的空洞。CGAL是一个功能强大的计算几何算法,提供了丰富的几何计算功能,可以进行各种布尔运算操作,包括孔洞的处理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值