三维gis中用纹理限定多边形地理区域

在三维 gis 中经常需要在指定的多边形地理范围内做一些操作,比如地形的多边形裁剪、压平多边形区域内的倾斜摄影模型、在指定地理范围内绘制等间距的点等。这都涉及到限定多边形区域的问题。

所谓的限定多边形地理区域,核心问题在于判断某个片元是否处于多边形区域内。虽然说在CPU中通过几何算法可以判断某个点是否处于多边形区域内,但是并不适用于实时计算机图形渲染,因为空间是连续的,而点位是离散的,不可能把一个区域内的所有的地理坐标点都取完,然后依次在CPU中判断;而且在CPU中判断多边形和点的包含关系需要对凸多边形和凹多边形加以区分,较为繁琐而且性能不高。相对来说用纹理限定多边形区域更加通用,该方式不用区分凸多边形和凹多边形、纹理可以在着色器里使用,性能也更高。

 

在自定义多边形区域内做某些操作

多边形角点的原始坐标为世界坐标系下的位置,为了把多边形绘制在一张纹理上并在后续用于判断包含关系。我们要把多边形角点的世界坐标在局部坐标系(比如ENU坐标系)下转换为相对坐标;同时获得相对坐标X和Y的最大、最小值表示一个范围 u_regionBounds,传入到顶点着色器中用于计算纹理坐标。

 

世界坐标转换为相对坐标 

 

相对坐标的范围 

绘制表示多边形区域的纹理时,在顶点着色阶段:根据角点坐标 position 在范围 u_regionBounds 中的相对位置得到 [ 0, 1 ] 的纹理坐标,然后转到 [ -1, 1 ] 区间表示裁剪坐标。片元着色器直接给一个红色即可,使用时通过坐标值的R分量是否为1判断片元是否位于多边形区域内。

      attribute vec3 position;uniform vec4 u_regionBounds;void main(){vec2 regionBoundsDimension = u_regionBounds.zw - u_regionBounds.xy;vec2 xy = (position.xy - u_regionBounds.xy) / regionBoundsDimension * 2.0 - 1.0;gl_Position = vec4(xy.x, xy.y, 0.5, 1.0);}

绘制多边形区域的顶点着色器 

      void main(){gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);}

绘制多边形区域的片元着色器 

在调用draw call渲染多边形到一张纹理时,设置渲染状态( render state ) 的视口大小( viewport )为图片的纹理的尺寸。这次绘制得到如下图所示的红色多边形纹理。

 

多边形区域纹理 

上面的 “多边形区域纹理” 只是记录了多边形区域的形状,把它作为 uniform 变量输入到另一次 draw call 的着色器中,用于判断多边形区域和片元的包含关系。这次在顶点着色器中也是用相对坐标和对应范围计算出纹理坐标插值给片元着色器;在片元着色阶段,从多边形区域纹理上取颜色值,如果 R 分量不为1就判定为不在多边形区域内,被剔除或者以别的方式处理该片元。

          vec2 boundsDimension = u_regionBounds.zw - u_regionBounds.xy;v_texCoord = (a_position.xy - u_bounds.xy) / boundsDimension;

使用多边形纹理 - 顶点阶段 - 计算某个片元在多边形区域纹理上的纹理坐标 

          float r = texture2D(u_regionTexture, v_texCoord).r;if (r < 0.9) {discard;}

使用多边形纹理 - 片元阶段 - 判断片元是否位于多边形区域内 

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

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

相关文章

1和0的故事-MISC-bugku-解题步骤

——CTF解题专栏—— 题目信息&#xff1a; 题目&#xff1a;1和0的故事 作者&#xff1a;Eas0a 提示&#xff1a;无 解题附件&#xff1a; 解题思路&#xff1a; 哦&#xff1f;1和0的故事&#xff1f;&#xff08;奸笑.jpg&#xff09;&#xff0c;打开看看啊。 emmm...j…

Java电子招投标采购系统源码-适合于招标代理、政府采购、企业采购、等业务的企业

项目说明 随着公司的快速发展&#xff0c;企业人员和经营规模不断壮大&#xff0c;公司对内部招采管理的提升提出了更高的要求。在企业里建立一个公平、公开、公正的采购环境&#xff0c;最大限度控制采购成本至关重要。符合国家电子招投标法律法规及相关规范&#xff0c;以及审…

高级/进阶”算法和数据结构书籍推荐

“高级/进阶”算法和数据结构书籍推荐《高级算法和数据结构》 高级算法和数据结构 为什么要选择本书 谈及为什么需要花时间学算法&#xff0c;我至少可以列举出三个很好的理由。 (1)性能&#xff1a;选择正确的算法可以显著提升应用程序的速度。仅就搜索来说&#xff0c;用二…

【AICFD案例教程】PCB多变量AI预测分析

AICFD是由天洑软件自主研发的通用智能热流体仿真软件&#xff0c;用于高效解决能源动力、船舶海洋、电子设备和车辆运载等领域复杂的流动和传热问题。软件涵盖了从建模、仿真到结果处理完整仿真分析流程&#xff0c;帮助工业企业建立设计、仿真和优化相结合的一体化流程&#x…

IDEA不支持Java8了怎么办?

IDEA不支持Java8了怎么办&#xff1f; 01 异常发生场景 当我准备创建一个springboot项目时&#xff0c;发现Java8没了 02 问题的产生及其原因 查阅了官方文档之后&#xff0c;确认了是Spring Boot 不再支持 Java 8&#xff0c;不是我的问题&#xff0c;这一天终于还是来了 0…

计算4人队形的最可能分布

2 2 2 1 2 2 2 2 2 1 2 2 2 2 2 1 2 2 3 3 3 x 3 3 2 2 2 1 2 2 2 2 2 1 2 2 在6*6的平面上2个点随机分布&#xff0c;有3种分布方式&#xff0c;2a1&#xff0c;2a2&#xff0c;2a3&#xff0c;占比为1&#xff1a;5&#xff1a;1. 3 3 …

Rust UI开发(四):iced中如何添加菜单栏(串口调试助手)

注&#xff1a;此文适合于对rust有一些了解的朋友 iced是一个跨平台的GUI库&#xff0c;用于为rust语言程序构建UI界面。 这是一个系列博文&#xff0c;本文是第四篇&#xff0c;前三篇链接&#xff1a; 1、Rust UI开发&#xff08;一&#xff09;&#xff1a;使用iced构建UI时…

开源六轴协作机械臂MechArm案例演示!

介绍 今天&#xff0c;我将向大家展示一个我独立设计并实现的机械臂模型。这个模型的核心功能是实现实时的手势追踪——只需用手轻轻拖拽&#xff0c;机械臂就能立即跟随你的动作进行移动。 我之所以想要创造这样一个模型&#xff0c;是因为在一些危险环境中&#xff0c;我们可…

如何正确选择爬虫采集接口和API?区别在哪里?

在信息时代&#xff0c;数据已经成为了一个国家、一个企业、一个个人最宝贵的资源。而爬虫采集接口则是获取这些数据的重要手段之一。本文将从以下八个方面进行详细讨论&#xff1a; 1.什么是爬虫采集接口&#xff1f; 2.爬虫采集接口的作用和意义是什么&#xff1f; 3.爬虫…

RabbitMQ之延迟消息

文章目录 前言一、死信交换机二、延迟消息死信交换机实现延迟消息图解流程 DelayExchange插件实现延迟消息安装插件声明延迟交换机发送延迟消息 总结 前言 死信交换机、延迟消息 一、死信交换机 当一个队列中的消息满足下列情况之一时&#xff0c;可以成为死信&#xff08;dea…

leetcode:用队列实现栈(后进先出)

题目描述 题目链接&#xff1a;225. 用队列实现栈 - 力扣&#xff08;LeetCode&#xff09; 题目分析 我们先把之前写的队列实现代码搬过来 用队列实现栈最主要的是实现栈后进先出的特点&#xff0c;而队列的特点是先进先出&#xff0c;那么我们可以用两个队列来实现 一个队…

阿里达摩院裁撤量子实验室

我是卢松松&#xff0c;点点上面的头像&#xff0c;欢迎关注我哦&#xff01; 马云的达摩院也不搞量子计算了&#xff0c;因为缺钱&#xff0c;整体裁掉了达摩院量子实验室&#xff0c;把所有的设备都赠送给了浙江大学。 达摩院量子实验室&#xff1a;总共30个研究员&#xf…

centos中mysql8忘记密码的操作步骤

1、编辑/etc/my.cnf文件&#xff0c;在末尾出增加 skip-grant-tables [mysqld] datadir/opt/data1/mysql8/data socket/var/lib/mysql/mysql.sock log-error/var/log/mysql/mysqld.log pid-file/run/mysqld/mysqld.pid bind-address0.0.0.0 skip-grant-tables2、 重启mysql服务…

共享办公真的会提高工作效率吗

共享办公&#xff0c;顾名思义&#xff0c;就是多个企业或个人共同使用一个办公空间&#xff0c;共享办公设施和服务的一种办公模式。近年来&#xff0c;随着大众创业、万众创新的浪潮&#xff0c;以及互联网技术的发展&#xff0c;共享办公越来越受到创业者和小微企业的青睐。…

什么是GPU?

GPU&#xff0c;即图形处理单元&#xff08;Graphics Processing Unit&#xff09;&#xff0c;是一种专用于图形渲染和图形计算的处理器。最初&#xff0c;GPU主要设计用于处理图形和图像相关的计算&#xff0c;例如在计算机游戏、电影特效和计算机辅助设计&#xff08;CAD&am…

Spring Boot进行单元测试,一个思路解决重启低效难题!

所谓单元测试就是对功能最小粒度的测试&#xff0c;落实到JAVA中就是对单个方法的测试。 junit可以完成单个方法的测试&#xff0c;但是对于Spring体系下的web应用的单元测试是无能为力的。因为spring体系下的web应用都采用了MVC三层架构&#xff0c;依托于IOC&#xff0c;层级…

Apache POI(处理Miscrosoft Office各种文件格式)

文章目录 一、Apache POI介绍二、应用场景三、使用步骤1.导入maven坐标2.写入代码讲解3.读取代码讲解 总结 一、Apache POI介绍 Apache POI 是一个处理Miscrosoft Office各种文件格式的开源项目。简单来说就是&#xff0c;我们可以使用 POI 在 Java 程序中对Miscrosoft Office…

使用Python+Redis实现文章投票网站后端功能

1&#xff0e;实现投票功能&#xff0c;2&#xff0e;创建文章数据&#xff0c;3&#xff0e;对文章进行排序。 实现投票功能 实现投票功能&#xff0c;要注重文章的时效性与投票的公平性&#xff0c;所以需要给投票功能加上一些约束条件&#xff1a; 文章发布满一个星期后&…

【挑战业余一周拿证】一、亚马逊云科技简介 - 第 1 节 - 模块 1 简介

CSDN 官方中文视频&#xff08;免费&#xff09;&#xff1a;点击进入 一、亚马逊云科技简介 第 1 节 - 模块 1 简介 1、讲师&#xff1a;李锦鸿 部门&#xff1a;亚马逊云科技培训与认证部门 方向&#xff1a;从事数据中心及云计算相关产品与解决方案工作 课程&#xff…

ESP32基于IDF框架OTA学习记录

ESP32基于IDF框架OTA学习记录 参考&#xff1a; 空中升级 (OTA) - ESP32 - — ESP-IDF 编程指南 v5.1.1 文档 (espressif.com) 目录 ESP32基于IDF框架OTA学习记录1.分区表2.native_ota_example上手2.1配置分区表2.2配置OTA的bin文件2.3修改esp32的https证书验证方法2.4修改当…