二维轮廓自动添加屋顶

   

1、背景介绍

     在提取建筑物轮廓点后,对轮廓点进行简化得到建筑物轮廓线。将轮廓线进行拉伸,变可得到建筑物白膜,如下图所示。这种形状比较简单,所重建模型实质上就是一个个立方体盒子,缺少屋顶细节,视觉观感上并不好。

建筑物白膜(缺少屋顶结构信息)

          但实际上,真实建筑物屋顶结构各不相同,由不同面片构成,具有复杂的屋顶结构,如下图所示。

2、基于CGAL自动生成斜坡屋顶

         一般的建筑物轮廓线矢量数据中并没有建筑物屋顶信息,相比较光秃秃的白模,如果能加上屋顶,其视觉观感就会好很多。本次介绍一种利用CGAL自动添加斜坡屋顶的方法。CGAL有个算法可以自动生成2D多边形骨架线,叫2D Straight Skeleton。具体的生成原理,可以去看官网上介绍。此次主要介绍如何利用CGAL生成屋顶,并使用PCL进行可视化显示。

2.1 环境配置

     本次程序需要安装依赖CGAL、PCL,其安装配置环境参考之前博客。本次实验在PCL1.11、CGAL5.5版本上运行。其中安装参考博客:

CGAL参考博客:CGAL环境配置(VS2019 PCL1.8)-CSDN博客

PCL参考博客:win11+VS2019下配置PCL1.11.1-CSDN博客

2.2 骨架线生成

     建筑物骨架线实质是对于一个闭合的多边形,在其内部生成其他线段。如下图所示,黑色线段为建筑物外轮廓,红色线段为骨架线。在CGAL库中,本质是生成了新的顶点,顶点与边相连,即可生成骨架线。

建筑物轮廓与骨架示意图

        生成骨架线API接口示例:

 SsPtr iss = CGAL::create_interior_straight_skeleton_2(poly.vertices_begin(),
        poly.vertices_end());

2.3 三维模型可视化

    当然,生成的内部点是二维,没有高度,那么如何生成三维模型呢?可以采用如下简单策略:

(1)所有的外轮廓点,高程设置一个高度;

(2)所有的内部点,高程设置成另一个高度,一般是比外轮廓点高;

(3)对每个面对应的点,直接连接      

     可视化函数接口示例:

 viewer->addPolygon<pcl::PointXYZ>(contour, r, g, b, str);

3、测试与可视化

     程序运行环境 :

     PCL 1.11

    CGAL 5.5

    VS2019

3.1 骨架线生成测试

      假设组成外轮廓的形状如下,总共由A、B、C、D、E、F组成,每个点坐标如下:

A(0,0)、B(20,0)、C(20,20)、D(10,20)、E(10,10)、F(0,10)。具体可参考如下:

轮廓点分布示意图

       利用CGAL中骨架线生成函数create_interior_straight_skeleton_2,运行结果如下,总共生成了6个面,其中每个面组成的点数各不相同。如第一个面由3个点组成,三个点坐标为(0,0)、(5,5)、(0,10)组成。可以发现点(5,5)是生成点,(0,0)、(0,10)为轮廓边缘点,为已有点。

      分析每个面对应的点,其满足如下规律:

(1)首尾两个点为边缘点,非首尾点为生成的新的点

(2)按照点的顺序进行连接,是一个闭合的能够刻画真实形状的多边形

生成的面片

3.2 多边形可视化

     假设生成的点高程一样(z坐标相同),原始边缘点高程一样,将每个面对应的多边形进行可视化,结果如下。从俯视静态图,同一多边形颜色相同。三维动图展示了屋顶的三维空间结构,由6个面组成,每个面形状、高度各不相同。

俯视截图静态图三维框线动图三维面动图

L型屋顶测试

      从俯视静态图,同一多边形颜色相同。三维动图展示了屋顶的三维空间结构,由8个面组成,每个面形状、高度各不相同。

俯视截图静态图三维框线动图三维面动图

凹型屋顶测试

4、总结

      详细介绍使用CGAL中骨架线生成方法,快速生成屋顶结构。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

玩转盲盒潮流:从0到1搭建小程序平台

在当前的消费市场中&#xff0c;盲盒已成为一种炙手可热的消费模式&#xff0c;凭借其神秘性和随机性&#xff0c;迅速俘获了年轻消费者的心。作为一位有志于创新并紧跟市场趋势的创业者&#xff0c;你可能会想&#xff1a;如何从0到1搭建一个属于自己的盲盒小程序平台&#xf…

SpringBoot高级原理详解

文章目录 1 SpringBoot自动化配置原理01-SpringBoot2高级-starter依赖管理机制02-SpringBoot2高级-自动化配置初体验03-SpringBoot2高级-底层原理-Configuration配置注解04-SpringBoot2高级-底层原理-Import注解使用105-SpringBoot2高级-底层原理-Import注解使用206-SpringBoot…

linux---线程控制

线程和进程 以前我们要同时跑多个程序&#xff0c;可以通过fork()多个子进程&#xff0c;然后通过系统函数进行程序的替换&#xff0c;但是创建进程代价大&#xff0c;不仅要拷贝一份父进程的地址空间&#xff0c;页表&#xff0c;文件表述符表等。但是线程不需要因为是进程的…

frp搭建内网流量转发

前提条件 有一台外网服务器 背景介绍 外网服务器linux内网客户端Windows 10下载frp软件安装包 下载地址:https://github.com/fatedier/frp/releases 服务端软件包下载 客户端软件包下载 服务端部署 解压软件包 tar xzvf frp_0.58.0_linux_amd64.tar.gz修复加压后文件夹名…

TemperMonkey在百度搜索页面,提供跳转其他平台搜索、与批量打开搜索结果的功能的脚本代码

代码 // UserScript // name 百度搜索。链接其他搜索。跳转功能。 // namespace http://tampermonkey.net/ // version 0.1(2020-6-24 17:37:27) // description try to take over the world! // author gwd // match https://www.baidu.com/s?…

深度学习中的优化算法一(Pytorch 18)

一 优化和深度学习 优化算法 使我们能够 继续更新模型参数&#xff0c; 并使损失函数的值最小化。这就像在训练集上评估一样。事实上&#xff0c;任何满足于将优化视为黑盒装置&#xff0c;以在简 单的设置中最小化目标函数的人&#xff0c;都可能会知道存在着一系列此类“咒…

Vivado报错集合

Synth 8-5535 报错代码 [Synth 8-5535] port <clk_0> has illegal connections. It is illegal to have a port connected to an input buffer and other components. The following are the port connections : Input Buffer:Port I of instance clkin1_ibufg(IBUF) i…

监控服务器性能指标,提升服务器性能

服务器是网络中最关键的组件之一&#xff0c;混合网络架构中的每个关键活动都以某种方式与服务器操作相关&#xff0c;服务器不仅是现代计算操作的支柱&#xff0c;也是网络通信的关键。 从发送电子邮件到访问数据库和托管应用程序&#xff0c;服务器的可靠性和性能直接影响到…

打开服务器远程桌面连接不上,可能的原因及相应的解决策略

在解决远程桌面连接不上服务器的问题时&#xff0c;我们首先需要从专业的角度对可能的原因进行深入分析&#xff0c;并据此提出针对性的解决方案。以下是一些可能的原因及相应的解决策略&#xff1a; 一、网络连接问题 远程桌面连接需要稳定的网络支持&#xff0c;如果网络连接…

【车载开发系列】Autosar中的VFB

【车载开发系列】Autosar中的VFB # 【车载开发系列】Autosar中的VFB 【车载开发系列】Autosar中的VFB一. 什么是VFB二. VFB的优点与缺点1&#xff09;VFB的缺点2&#xff09;VFB的好处 三. RTE与VFB之间关系四. 总线架构模式 一. 什么是VFB Virtual Functional Bus。它就是虚拟…

对话:用言语构建深刻的思想碰撞

对话&#xff1a;用言语构建深刻的思想碰撞 在写书中&#xff0c;对话是一种有力的工具&#xff0c;能与读者进行有效的沟通和交流&#xff0c;引发深思和反思。它不仅是信息传递的方式&#xff0c;更是加深情感、探讨主题和吸引读者参与的桥梁。你应从读者的角度思考&#xf…

labelme的使用

创建虚拟环境 听说是要用这个3.6版本的python环境 conda create --namelabelme python3.6激活虚拟环境 activate labelme下载labelme pip install labelme #安装labelme组件启动labelme 在你打开文件的时候推荐还是自己先建立一个label.txt 把自己要分的类别放进去 label.…

AI | 基于扣子 Coze 零代码手把手从 0-1 搭建专属 Bot 机器人

前言 无论是智能语音助手、聊天机器人&#xff0c;还是自动化流程机器人&#xff0c;它们都在为我们提供更加便捷、高效的服务。然而&#xff0c;对于非专业人士来说&#xff0c;搭建一个属于自己的机器人似乎是一项遥不可及的任务。基于扣子 Coze 零代码平台&#xff0c;我们…

【评价类模型】层次分析法(AHP)

1.评价类思想综述&#xff1a; 明确评价主体–>评价指标确定–>计算指标权重–>方案评价 1.1指标确定&#xff1a; 可以通过一个思维导图的方式来画出一个指标系统&#xff0c;先确定方向&#xff0c;再向下细化 注意&#xff1a;指标需要具有贴合性和独立性。 贴合…

【Python】【Scrapy 爬虫】理解HTML和XPath

为了从网页中抽取信息&#xff0c;必须对其结构有更多了解。我们快速浏览HTML、HTML的树状表示&#xff0c;以及在网页上选取信息的一种方式XPath。 HTML、DOM树表示以及XPath 互联网是如何工作的&#xff1f; 当两台电脑需要通信的时候&#xff0c;你必须要连接他们&#xff…

盖雅技能发展云,助力制造企业人效合一

制造行业尽管经历多次变革&#xff0c;但企业对人的管理始终是一项高度依赖经验和耗费人力的工作。随着供应链管理和生产设备的自动化、数字化升级&#xff0c;如何将第一生产要素——人&#xff0c;通过数字化的工具融入制造过程的闭环&#xff0c;对企业实现自动化工厂和智能…

C语言 | Leetcode C语言题解之第101题对称二叉树

题目&#xff1a; 题解&#xff1a; /*** Definition for a binary tree node.* struct TreeNode {* int val;* struct TreeNode *left;* struct TreeNode *right;* };*/ bool isSymmetric(struct TreeNode* root) {if (root NULL) return true;//如果根为空直接…

Python函数、类和方法

大家好&#xff0c;当涉及到编写可维护、可扩展且易于测试的代码时&#xff0c;Python提供了一些强大的工具和概念&#xff0c;其中包括函数、类和方法。这些是Python编程中的核心要素&#xff0c;可以帮助我们构建高效的测试框架和可靠的测试用例。 本文将探讨Python中的函数、…

Nginx的集群负载均衡(nginx构建tomcat集群案例)

一 .Nginx的集群负载均衡 1.nginx 集群负载均衡示意图 2.四层负载均衡和7层负载均衡 LVS 四层负载均衡(常用); Haproxy四层负载均衡;Nginx 四层负载均衡; Haproxy七层负载均衡;Nginx 七层负载均衡(常用); 3.nginx构建tomcat集群 步骤1:安装tomcat 步骤2:nginx配置tom…

【QT八股文】系列之篇章3 | QT的多线程以及QThread与QObject

【QT八股文】系列之篇章3 | QT的多线程 前言4. 多线程为什么需要使用线程池线程池的基础知识python中创建线程池的方法使用threading库队列Queue来实现线程池使用threadpool模块&#xff0c;这是个python的第三方模块&#xff0c;支持python2和python3 QThread的定义QT多线程知…