CGAL的二维可见度计算

        二维可见性计算在计算机图形学、地理信息系统(GIS)、游戏开发等领域都有广泛的应用。

        在计算机图形学中,二维可见性计算被用于确定物体在特定视角下的可视性。例如,一个角色在视图中是否可见,或者一个对象是否遮挡了另一个对象的视线。这些信息对于渲染图像和创建逼真的视觉效果至关重要。

        在地理信息系统(GIS)中,二维可见性计算被用于确定在给定位置和方向上哪些地理特征是可见的。例如,在规划道路或建筑布局时,需要确定哪些地标或地形特征是可见的,以便进行决策。

        在游戏开发中,二维可见性计算被用于确定玩家在特定位置和方向上可以看到哪些物体和场景。这有助于实现游戏中的探索和寻路算法,以及创建逼真的游戏世界。

        此外,二维可见性计算还可以用于计算物体之间的可视区域,例如在城市规划中确定哪些建筑之间是可视的,或者在医疗可视化中确定哪些器官之间是可视的。

        总之,二维可见性计算是一种重要的计算机图形学技术,它在许多领域都有广泛的应用,包括计算机图形学、地理信息系统、游戏开发等。

1、介绍

        这个包提供了在二维多边形内计算可视区域的功能。该包基于2D排列包,并使用CGAL::Arrangement_2作为指定输入和输出的基本类。因此,一个多边形P由一个有界排列面f表示,该面没有孤立的顶点,任何与f相邻的边缘都将f与另一个面分开。注意,f可能包含孔。同样,一个简单多边形由一个没有孔的面表示。

        给定P中的两个点p和q,当且仅当段pq在P内,其中P被视为封闭的,即∂P⊂P时,它们才相互可见。对于查询点q∈P,可见的点的集合定义为q的可视区域,记作Vq。

1.1、退化和正则化

        如图(1)所示,查询点q的可视区域Vq可能不是一个多边形。在图中,所有标记的点都是共线的,这意味着点c对q是可见的,即线段bc是Vq的一部分。我们称这种由退化引起的低维特征为“针”。然而,对于许多应用来说,这些针实际上是不相关的。此外,对于一些算法来说,首先忽略这些针甚至更有效。因此,该软件包还提供了计算正规化可视区域Vq¯¯¯¯¯=closure(interior(Vq))=(Vq∖∂Vq)∪∂(Vq∖∂Vq)的功能,如图(2)所示。

2、类和算法

        在许多方面,回答可见性查询类似于回答点位置查询。因此,我们使用与实现二维排列点位置相同的设计。各种可见性类模板中的每一个都采用不同的算法或策略来回答查询。与点位置情况类似,一些策略需要预处理。因此,在使用可见性对象回答可见性查询之前,必须将其附加到排列对象。之后,可见性对象观察所附加排列的变化。因此,在附加可见性对象后可以修改排列。但是,使用此功能时应谨慎,因为排列的每个更改都需要更新附加对象中的辅助数据结构。

     Class

Function

Preprocessing

Query

Simple_polygon_visibility_2

simple polygons

No

O(n) time and O(n) space

Rotational_sweep_visibility_2

polygons with holes

No

O(nlogn) time and O(n) space

Triangular_expansion_visibility_2

polygons with holes

O(n) time and O(n) space

O(nh) time and O(n) space.

        其中n表示f的顶点数量,h表示孔的数量+1。

3、实践中的运行时间

        上图的左手侧描绘了大教堂的外部边界,这是一个有565个顶点的简单多边形。右手边展示了大教堂及其内部支柱,这是一个有1153个顶点的多边形(带孔)。下表显示了大教堂所有顶点的所有可见性多边形计算的总运行时间消耗。  

边界教堂

total preprocessing time

total query time

Simple_polygon_visibility_2

-

0.38

Rotational_sweep_visibility_2

-

1.01

Triangular_expansion_visibility_2

0.01

0.06

        第二张表显示了整个大教堂的相同情况。该表不报告Simple_polygon_visibility_2的时间,因为此算法只能处理简单多边形。

完整教堂

total preprocessing time

total query time

Rotational_sweep_visibility_2

-

1.91

Triangular_expansion_visibility_2

0.01

0.04

        因此,通常情况下,即使多边形很简单,我们也建议使用Triangular_expansion_visibility_2。该算法的主要优点是它的局部性。在包含查询点的三角形位于三角测量中后,该算法会探索相邻的三角形,但仅限于实际看到的三角形。在这个意义上,该算法可以被认为是输出敏感的。请注意, Triangular_expansion_visibility_2算法在整个大教堂上表现更好,因为在许多情况下,额外的柱子会提前遮挡视线。然而,如果简单多边形是相当凸的(即,几乎看到所有边界),或者如果只需要一个(或很少)查询,则使用不需要预处理的算法之一是有利的。 

4、简单多边形中的可见性范例

        在简单多边形中查找点的可见范围

5、带孔多边形中的可见性范例

        在带孔的多边形中查找点的可见范围

6、历史

CGAL 5.6 - 2D Visibility: User Manual

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值