计算机图形学论文 | 多边形中的点可见性快速算法

news2024/11/13 10:35:14

🦌🦌🦌读论文

🐨🐨摘要

针对点的可见性计算这一计算几何中的基础问题,提出一种支持任意查询点的可见多边形快速计算的基于多边形Voronoi图的点可见性算法。以与Voronoi骨架路径对应的Voronoi通道概念,以及相应的局部最短路径概念为基础,按照深度优先策略对Voronoi图进行遍历,在计算Voronoi骨架路径的同时计算局部最短路径,并基于局部最短路径计算所遍历的多边形边的可见部分。该算法可以处理“带洞”多边形,而且只对多边形进行局部访问:对于“带洞”多边形,由于该算法的数据结构比较简单、剖分空间合理且易于实现,因此仅需O(n)空间和O(n log n)预处理时间,最后给出了在三维室内虚拟场景设计与漫游系统中的应用实例,结果表明文中算法是实际可行,且运行时间与点的可见多边形的边数和多边形的边数均呈线性关系。

🐨🐨相关工作

🐼点的可见性计算

对于点可见多边形计算问题,计算几何领域有很多相关的工作。点的可见性计算是最基础的问题,其典型应用包括艺术画廊中的警卫间问题、机械模型浇注、无线传感网络中的覆盖问题等。在计算机图形学、计算机游戏和虚拟现实等领域,其作为实时绘制中的一种关键技术,根据视点的位置计算可见区域,并将可见区域中的对象加入图形绘制流水线,提高绘制效率。

🐼简单多边形的可见性算法

对于简单多边形,文献[16]提出了一种基于三角化的点的可见多边形算法,它首先对简单多边形进行三角化,并基于三角化的结果构造查询点的最短路径树,然后基于该最短路径树计算多边形的每条边相对于查询点的可见部分,最后得到点的可见多边形,算法时间复杂度为O(n)。

🐼“带洞”多边形的可见性算法

近年来,又出现了一些基于可见区域分割或可见图计算“带洞”多边形中点的可见多边形的算法。这些算法的数据结构一般比较复杂且构造方法较困难,消耗较多的预处理时间和空间。

🐨🐨相关概念

🐼多边形Voronoi图

一种将平面划分为多个区域的方式,其中每个区域对应于一个特定的点集合(称为“种子”或“站点”)。在Voronoi图中,平面上的每一点都被分配到离它最近的种子所在的区域。

- 每个Voronoi单元(区域)包含所有距离该种子点最近的点。
- Voronoi边界是种子点之间的垂直平分线。

简单多边形的Voronoi图是一棵树,其叶节点是多边形的顶点;“带洞”多边形的Voronoi图是一个图,其中度数为1的节点为多边形的顶点。

🐼简单多边形vs带洞多边形

简单:只有一条边界的多边形;

带洞:多条边界,外边界顺时针,内边界逆时针

🐼站点o

多边形中的凹顶点或边

🐼站点的voronoi区域VR

多边形P中到o的距离比到其他任意站点距离都近的点的集合

🐼多边形P的voronoi图VD

P中所有站点的VR的并集

🐼voronoi的骨架路径VSP(q,pi)

多边形P中的一个点q到P的一个顶点p的Voronoi骨架路径(Voronoi Skeleton Path, VSP)是一条由系列Voronoi边首尾依次连接而成的路径,用VSP(q, p)表示,如图中粗虚线所示。

🐼边的关联VR

如果边e被两个VR(p1、p2)所共有,则这俩VR就是边e的关联VR,p1和p2是e的关联边;设点a为e的起点,b为e的终点,那么定义有向边ab,若p1在ab左侧,则称p1为ab的左侧关联边,否则是右侧关联边

🐼VSP对应的voronoi通道C

骨架路径的每条边所关联的两边的voronoi区域形成的通道,如上图阴影区域所示。

🐼局部最短路径SP

将VSP看作绳子,将其用力拉紧(变成直线),可以得到在该通道中的一条最短路径,称之为局部最短路径,如上图中拉紧后的虚线所示。

在带洞多边形中,q到pi存在多个voronoi通道,因此存在多个局部最短路径。

🐨🐨算法描述

🐼任意两点间的最短路径算法基本思想

在简单多边形中任意两点间只存在一条voronoi骨架路径,最短路径上的点能够通过顺序遍历其voronoi骨架路径关联的多边形顶点求得。

🐼确定最短路径的算法步骤

1. 确定两点所在的voronoi区域
2. 确定voronoi骨架路径
3. 顺序遍历voronoi骨架路径确定最短路径

🐼算法概述

本节首先讨论多边形内计算一条边相对于给定查询点的可见部分的计算算法。充分性,由引理1知,SP(q, p)上的点为VSP(q, p)所关联的凹顶点,如果只用VSP(q, p)的左侧关联凹顶点计算SP(q, p),则SP(q, p)为VSP(q, p)的左侧关联凹顶点的凸多边形链L_CP。

🐼引理与定理

引理1和引理2为算法提供了理论基础,定理1给出了边的可见部分的计算方法,定理2给出了沿VD(P)进行深度遍历的终止条件。

🐼算法步骤

算法1详细描述了计算点的可见多边形的过程,包括判断q所在的Voronoi区域、计算VSP和SP、计算对于q的可见部分等步骤。

🐼存在可见部分

q到pi的局部最短路径SP是一条在P内的多边形链且在qpi的右侧;且q到pi+1的局部最短路径SP也是一条在P内的凸多边形链且在qpi+1的左侧

🐼定理1

对于一个多边形P及其内部一点q,在q到P的边pipi+1的一个voronoi通道中,有两个SP,pipi+1相对于q存在可见部分,当且仅当ql1在qr1的左侧;且当前voronoi通道中pipi+1相对于q的可见部分可通过计算射线ql1和qr1与pipi+1的交点得到。

由图所示,qp3在qp6左侧,根据定理,p4p5相对于q存在可见部分。通过计算射线qp3、qp6与p4p5的交点可以计算出p4p5相对于q的可见部分qlqr。射线ql1和qr1直接的区域成锥体状,称为可见锥体VC

🐼停止条件

1:如图所示,当遍历到q2和q3时都没必要再深度搜索圈出的两个区域了,因为它们后边的voronoi边关联的多边形的边肯定相对于q不可见

2:带动多边形如果不设终止条件会陷入死循环。当遍历到某个voronoi顶点(如q1、q2和q3)后,后面的voronoi边对应的边都相对于q不可见,所以可以停止该方向的遍历了。

🐼终止条件设置算法

🐨🐨计算VSP和SP

🐼初始VSP和SP的计算

算法1的Step1首先确定给定点q所在的Voronoi区域VR(o),算法1的Step2用于计算初始的Voronoi最短路径和SP。

确定Voronoi骨架路径的过程通常包括以下几个步骤:

1. 构造Voronoi图:首先,需要为给定的多边形构造Voronoi图。这个图表达了多边形内部每个点到最近站点(多边形的顶点或边)的距离。

2. 确定Voronoi区域:对于给定的查询点q,确定其所在的Voronoi区域。这个区域表示所有比到任何其他站点更接近查询点q的点的集合。

3. 计算Voronoi骨架路径:通过深度优先搜索Voronoi图,计算从查询点q到多边形顶点的Voronoi骨架路径。这个路径是由连接查询点q和多边形顶点的Voronoi边组成的。

4. 更新VSP:在DFS过程中,每当访问到一个新的Voronoi顶点时,根据需要更新当前的VSP。这涉及到添加或删除Voronoi边,以反映从查询点到当前顶点的路径。

5.计算SP:在Voronoi通道内,SP(q, p)可以通过连接VSP(q, p)上的点和多边形顶点p来计算。这通常涉及到找到VSP(q, p)上与多边形顶点p最近的点。

6.局部最短路径更新:在DFS过程中,随着VSP的更新,相应的SP也需要更新。这涉及到在VSP上添加或删除点,以确保SP始终保持为局部最短路径。

7. 确定可见性:通过分析Voronoi骨架路径和局部最短路径,确定多边形边相对于查询点的可见部分。

🐶深度优先搜索(DFS)
  • 访问和标记:从q开始,访问与其直接相连的Voronoi边,并标记这些边为已访问。
  • 递归遍历:对于每条已访问的Voronoi边,找到与之相邻的未访问的Voronoi区域,并递归地访问这些区域。这通常涉及到移动到相邻Voronoi区域的顶点或边,并继续探索。
  • 回溯:当一个区域的所有相邻区域都被访问后,回溯到上一个顶点,并继续探索其他未访问的区域。

🐼后续VSP和SP的计算

在已计算的VSP(q, p+1)和SP(q, p+1)的基础上,考虑如何快速确定下条边对应的2条VSP和SP,这取决于TC(q-)的值。

🐨🐨算法分析与实例

🐼算法效率

本文算法在预处理阶段需要构造多边形的Voronoi图,一旦构造完成,其可用于任意点的可见多边形查询。对于简单多边形,其Voronoi图可在O(n)时间内构造出来,对于“带洞”多边形的Voronoi图的构造,则需要O(n log n)时间。

🐼算法实例

给出了算法在虚拟博物馆中的应用实例,展示了算法的实际效果。

🦌🦌🦌做笔记

🐕🐕该文章的研究目的

🐈研究背景

本文针对点的可见性计算问题,提出了一种基于多边形Voronoi图的点可见性算法。该算法支持任意查询点的可见多边形快速计算,对于“带洞”多边形也适用,并且只对多边形进行局部访问。

🐈研究目标

旨在提高多边形中点可见性计算的效率,特别是在三维室内虚拟场景设计与漫游系统中的应用。

🐕🐕该文章的研究方法

🐈Voronoi图的应用

文章提出了Voronoi通道和局部最短路径的概念,通过深度优先策略对Voronoi图进行遍历,在计算Voronoi骨架路径的同时计算局部最短路径,并基于局部最短路径计算所遍历的多边形边的可见部分。

🐈算法实现

算法基于Voronoi图的几何特性,通过深度优先搜索遍历Voronoi图,计算Voronoi骨架路径和局部最短路径,从而确定点的可见多边形。

🐕🐕该文章的研究内容

🐈相关概念

定义了多边形Voronoi图中的Voronoi通道和局部最短路径,并提出了计算这些路径的算法。

🐈算法描述

详细描述了算法的步骤,包括如何确定点所在的Voronoi区域,计算Voronoi骨架路径和局部最短路径,以及如何基于这些路径计算点的可见多边形。

🐈算法分析

分析了算法的时间复杂度和空间复杂度,并讨论了算法在“带洞”多边形中的应用。

🐕🐕该文章的创新点

  • 提出了Voronoi通道和局部最短路径的概念,为点的可见性计算提供了新的视角。
  • 算法可以处理“带洞”多边形,并且只对多边形进行局部访问,提高了计算效率。
  • 算法的数据结构简单、空间合理且易于实现,预处理时间复杂度为O(n log n),空间复杂度为O(n)。

🐕🐕该文章给我们的启发

  • Voronoi图可以作为解决可见性计算问题的有效工具,特别是在复杂场景中。
  • 通过局部访问和深度优先搜索策略,可以显著提高算法的效率。
  • 算法的简单性和实用性使其适用于实际的三维虚拟场景设计与漫游系统。

🦌🦌🦌反思

🐨🐨从中学到了什么

🐼1. Voronoi图在可见性计算中的应用

- 学会了如何利用Voronoi图来解决多边形中的点可见性问题,特别是在复杂或“带洞”的多边形中。

🐼2. 深度优先搜索(DFS)的策略

- 了解了如何通过深度优先搜索策略在Voronoi图中遍历,以计算Voronoi骨架路径和局部最短路径。

🐼3. 算法的时间和空间复杂度

- 掌握了评估算法效率的方法,特别是如何分析算法的时间和空间复杂度,并理解了近似线性算法和近似输出敏感算法的概念。

🐼4. 算法的实际应用

- 认识到了这种算法在三维虚拟场景设计与漫游系统中的应用价值,特别是在提高渲染效率和优化用户体验方面。

🐼5. 计算几何中的基本概念

- 学习了Voronoi图、Voronoi骨架路径、Voronoi通道和局部最短路径等计算几何中的基本概念,并理解了它们在算法中的作用。

🐨🐨有什么问题

🐼1. 算法的扩展性

- 该算法是否可以扩展到非多边形(如曲线边界)的几何形状,以及如何适应更复杂的三维场景?

🐼2. 算法的优化

- 在大规模数据集或高密度点集中,算法的性能如何?是否存在进一步优化空间,以提高算法的效率?

🐼3. 算法的鲁棒性

- 算法对于噪声数据或不精确的输入有多鲁棒?如何处理输入数据的误差?

🐼4. 实际应用中的挑战

- 在实际的三维虚拟场景中,算法如何处理动态变化的场景,例如移动的物体或变化的视角?

🐼5. 算法的并行化

- 考虑到现代计算硬件的发展,该算法是否可以并行化以利用多核处理器的优势?

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2237457.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Redis 高并发分布式锁实战

目录 环境准备 一 . Redis 安装 二:Spring boot 项目准备 三:nginx 安装 四:Jmeter 下载和配置 案例实战 优化一:加 synchronized 锁 优化二:使用 redis 的 setnx 实现分布式锁 优化三:使用 Lua 脚本…

LLM大模型学习精华系列:VLLM性能优化部署实践——全面加速从推理到部署的流程

训练后的模型会用于推理或者部署。推理即使用模型用输入获得输出的过程,部署是将模型发布到恒定运行的环境中推理的过程。一般来说,LLM的推理可以直接使用PyTorch代码、使用[VLLM]等框架,也可以使用[llama.cpp]等c推理框架。 常见推理方法 G…

【大数据学习 | kafka高级部分】kafka的快速读写

1. 追加写 根据以上的部分我们发现存储的方式比较有规划是对于后续查询非常便捷的,但是这样存储是不是会更加消耗存储性能呢? 其实kafka的数据存储是追加形式的,也就是数据在存储到文件中的时候是以追加方式拼接到文件末尾的,这…

SpringCloud篇(微服务)

目录 一、认识微服务 1. 单体架构 2. 分布式架构 3. 微服务 3.1. 特点 3.2. 优点 3.3 缺点 二、微服务设计、拆分原则 1. AKF 拆分原则 2. Y轴(功能)关注应用中功能划分,基于不同的业务拆分 3. X轴(水平扩展&#xff09…

Hive简介 | 体系结构

Hive简介 Hive 是一个框架,可以通过编写sql的方式,自动的编译为MR任务的一个工具。 在这个世界上,会写SQL的人远远大于会写java代码的人,所以假如可以将MR通过sql实现,这个将是一个巨大的市场,FaceBook就这…

高校宿舍信息管理系统小程序

作者主页:编程千纸鹤 作者简介:Java领域优质创作者、CSDN博客专家 、CSDN内容合伙人、掘金特邀作者、阿里云博客专家、51CTO特邀作者、多年架构师设计经验、多年校企合作经验,被多个学校常年聘为校外企业导师,指导学生毕业设计并参…

森林防火责任大于天,可视化监控大屏让隐患无处遁形。

在大自然的生态系统中,森林是地球之肺,为我们提供着清新的空气、丰富的资源和优美的环境。然而,森林火灾却如同一场可怕的灾难,随时可能摧毁这片宝贵的绿色财富。森林防火责任大于天,而可视化监控大屏的出现&#xff0…

“穿梭于容器之间:C++ STL迭代器的艺术之旅”

引言: 迭代器(Iterator)是C STL(标准模板库)中非常重要的一部分,它提供了一种统一的方式来遍历容器中的元素。无论容器是数组、链表、树还是其他数据结构,迭代器都能够以一致的方式访问这些数据…

el-scrollbar 动态更新内容 鼠标滚轮无效

有以下功能逻辑,实现了一个时间轴组件,点击、-号后像地图那样放大组件以显示不同的UI。 默认显示年月: 当点击一下加号时切换为年: 当点击减号时切换为日: 即加号、减号点击就是在年月日显示进行切换。给Scrollvie…

Linux【基础篇】

-- 原生罪 linux的入门安装学习 什么是操作系统? 用户通过操作系统和计算机硬件联系使用。桥梁~ 什么是Linux? 他是一套开放源代码(在互联网上找到Linux系统的源代码,C语言写出的软件),可以自由 传播&…

C++类(5)

1.<<和>>操作符重载 我们该如何重载操作符<<和>>呢&#xff1f; 如果在类里面&#xff0c; void operator<<(ostream& out) {out << _year << "年" << _month << "月" << _day <&l…

【MM-Align】学习基于输运的最优对齐动力学,快速准确地推断缺失模态序列

代码地址 - > github传送 abstract 现有的多模态任务主要针对完整的输入模态设置&#xff0c;即每个模态在训练集和测试集中要么是完整的&#xff0c;要么是完全缺失的。然而&#xff0c;随机缺失的情况仍然没有得到充分的研究。在本文中&#xff0c;我们提出了一种新的方…

高精度算法-保姆级讲解

目录 1.什么是高精度算法 2.高精度加法 3.高精度减法 4.高精度乘法 5.高精度除法 &#xff08;高精度除以低精度&#xff09; 6.高精度阶乘&#xff08;n个低精度数相乘&#xff09; 1.什么是高精度算法 高精度算法&#xff08;High Accuracy Algorithm&#xff09;是…

vue大疆建图航拍功能实现

介绍 无人机在规划一块区域的时候&#xff0c;我们需要手动的给予一些参数来影响无人机飞行&#xff0c;对于一块地表&#xff0c;无人机每隔N秒在空中间隔的拍照地表的一块区域&#xff0c;在整个任务执行结束后&#xff0c;拍到的所有区域照片能够完整的表达出一块地表&…

learnopencv系列三:GrabCut和DeepLabv3分割模型在文档扫描应用中的实现

文章目录 一、使用OpenCV实现自动文档扫描1.1 图片预处理1.2 查找轮廓1.3 检测角点1.4 仿射变换1.5 Streamlit Web App1.5.1 设置扫描函数和图像下载链接函数1.5.2 streamlit app1.5.3 测试结果 二&#xff1a;DeepLabv3文档分割2.1 项目背景2.2 合成数据集2.2.1 图像收集与预处…

SQLite的BLOB数据类型与C++二进制存储学习记录

一、BLOB数据类型简介 Blob&#xff08;Binary Large Object&#xff09;是一种用于存储二进制数据的数据类型&#xff0c;在数据库中常用于存储图片、音频和视频等大型&#xff08;大数据量&#xff09;的二进制数据[1-2]。需要注意的是&#xff0c;SQLite中BLOB类型的单对象最…

C# 自己编写web服务

文件后缀响应 "text/html"; 文件后缀响应 "application/json"; httpListenerContext.Response.ContentType 文件后缀响应; httpListenerContext.Response.AppendHeader("Access-Control-Allow-Origin", "*"); // L…

微服务day04

网关 网关路由 快速入门 创建新模块&#xff1a;hm-gateway继承hmall父项目。 引入依赖&#xff1a;引入网关依赖和nacos负载均衡的依赖 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"…

Agent框架调研:19种Agent架构对比分析

代理&#xff08;Agent&#xff09;指能自主感知环境并采取行动实现目标的智能体&#xff0c;即AI作为一个人或一个组织的代表&#xff0c;进行某种特定行为和交易&#xff0c;降低一个人或组织的工作复杂程度&#xff0c;减少工作量和沟通成本。 背景 目前&#xff0c;我们在…

ODOO学习笔记(4):Odoo与SAP的主要区别是什么?

Odoo 和 SAP 都是知名的企业资源规划&#xff08;ERP&#xff09;软件&#xff0c;它们之间存在以下一些主要区别&#xff1a; Odoo与SAP的区别 一、功能特点 功能广度 Odoo&#xff1a;提供了一整套全面的业务应用程序&#xff0c;涵盖了销售、采购、库存管理、生产、会计、…