多边形上点的顺序排序_一种寻找多边形视觉中心的新算法

遇到的问题

在一个多边形上放置文本标签或工具提示的最佳位置通常位于其“视觉中心”的某个位置,即多边形内部的一个点,周围有尽可能多的空间。

计算这样一个中心首先想到的是多边形质心。你可以用一个简单快速的公式计算多边形中心,但如果形状是凹的或有一个洞,点可以落在形状外面。740e9f16311cc6baa4f8dd826a630615.png我们如何定义我们需要的点?一个更可靠的定义是”不可到达的极点”或”最大内接圆”:多边形中离边缘最远的点。不幸的是,计算不可访问性的极点既复杂又缓慢。公布的解决方案需要约束delaunay三角化(Constrained Delaunay Triangulation)或计算一个直线骨架作为预处理步骤——这两个步骤都是缓慢且容易出错的。对于我们的用例,我们不需要一个精确解——我们愿意牺牲一些精度来获得更快的速度。当我们在地图上放置标签时,以毫秒为单位计算比精确计算更重要。我们为这个问题创建了一个新的启发式算法。

现有的解决方案

这项在线任务的唯一近似算法是由加西亚-卡斯特利亚诺斯和伦巴多在2007年的论文中描述的。算法是这样的:

  • 将点置于任意大小的网格上(本文中为24x24,或576个点),在其边界框内探测多边形,丢弃多边形外的所有点。
  • 计算每个点到多边形的距离,选择距离最长的点。
  • 重复上面的步骤,但是在这一点上有一个更小的网格(比任意系数1.414小)。
  • 该算法运行多次,直到搜索区域足够小,达到我们想要的精度。
f33c57b17d4d6e8709c2c89d8148fc66.png这个算法有两个问题:
  • 它不能保证找到一个好的解决方案,这取决于机会和外形相对良好的多边形。
  • 在较大的多边形上运行速度较慢,因为有很多点检查的过程。对于上图中的每个蓝点,你必须循环遍历所有多边形点。
然而,以这个想法为灵感,我们设法设计了一个新的算法来修复这两个缺陷。

新的解决方案

我们需要设计一种不依赖于任意常数的算法,并且能够以可靠的增加精度对整个多边形进行彻底搜索。那么就有一个熟悉的概念可以与这个问题直接相关——四叉树

四叉树的主要概念是递归地将二维空间细分为四个象限。这在许多应用程序中都有应用——不仅是空间索引,而且有图像压缩,甚至是物理模拟,在这些应用程序中,提高特定领域的自适应精度是有益的。38807fcfcf390ff0cf4ab0d60a73b3b7.png下面我们将介绍如何将四叉树分区应用于查找不可访问极点的问题。
  1. 从覆盖多边形的几个大单元开始。
  2. 递归地将它们细分为4个较小的单元,探索单元中心作为候选,丢弃那些不可能包含比我们已经找到的更好的解决方案的单元。
由于搜索是彻底的,我们最终会找到一个保证在全局最优范围内的单元。我们如何知道某单元是否可以被丢弃?让我们考虑一个多边形上的方形单元格:b0ae9da0613a89135b8eb21699a6adc4.png如果我们知道从单元中心到多边形的距离(上面的dist),单元内的任何一点到多边形的距离都不能大于dist+radius,其中radius就是单元的半径。如果潜在单元格最大值小于或等于我们已经处理过的单元格的最佳距离(在给定的精度范围内),我们可以放心地丢弃这个单元格。为了使这个假设对任何单元格都能正确工作,不管它们的中心是否在多边形内,我们需要使用到多边形的有符号距离——如果一个点在多边形内为正,如果它在多边形外为负。

寻找更快的解决方案

越早发现一个远离多边形边缘的“好的”单元格,我们在运行中丢弃的单元格就越多,搜索速度也就越快。那么我们如何更快地找到好的单元格呢?

我们决定试试另一种方法。我们开始管理优先队列中的单元格,按照单元格的“潜力(potential)”:dist + radius进行排序。通过这种方式,单元格按照其潜力的顺序进行处理。差不多使算法的性能提高了一倍。我们可以做到的另一个加速方法是把多边形质心作为第一个“最佳猜测”,这样我们就可以丢弃所有更坏的单元格。这提高了形状相对规则的多边形的性能。

总结

最终得出来的算法就是Polylabel,这是一个快速而精确的JavaScript模块,用于查找合适的点,以便在多边形上放置标签。它比我们开始时的算法快40倍,同时保证在所有情况下都能得到正确的结果。 

e70f7977e24c21a12d5fbf60ff827c8a.png关注图鲸科技  mapwhale.comc7c53daa36ced4d7136370e4dc9db311.gif

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

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

相关文章

通过Jexus 部署 dotnetcore版本MusicStore 示例程序

ASPNET Music Store application 是一个展示最新的.NET 平台(包括.NET Core/Mono等)上使用MVC 和Entity Framework的示例程序,本文将展示如何在CentOS上运行.NET Core版本的MusicStore,并通过Jexus对外发布。 上篇文章 《结合Jexu…

java爬虫之基于httpclient的简单Demo(二)

转载自 java爬虫之基于httpclient的简单Demo(二)延续demo1的 java爬虫的2种爬取方式(HTTP||Socket)简单Demo(一),demo2出炉啦,大家想学爬虫都可以从这个网盘学习哦:https://pan.baidu.com/s/1pJJrcqJ#list/path%2F 免费…

神经网络中的最小二乘_深度神经网络:噪声中解读出科学

该研究介绍了一种基于深度神经网络的基本新方法,以基于已知的物理模型将函数形式拟合到噪声数据。来自美国橡树林国家实验室的Stephen Jesse领导的团队,提出了一种新的方法,可用来逆向解决问题,可从基于光谱成像数据的最小二乘拟合…

微软开放Holographic平台,意在统一VR的操作系统?

在刚刚结束的台北电脑展上,微软没有发布很多新品,而是宣布向第三方开放Windows Holographic(全息)平台,鼓励其他VR/AR头显使用该平台。近日外媒engadget发表文章,文中作者讲述了微软的野心,有意…

java爬虫的2种爬取方式(HTTP||Socket)简单Demo(一)

转载自 java爬虫的2种爬取方式(HTTP||Socket)简单Demo(一)最近在找java的小项目自己写着玩,但是找不到合适的,于是写开始学一点爬虫,自己也是感觉爬虫比较有趣。这里自己找了一个教程,这一次写的是基于Sock…

linux mysql复制一个表结构图_详解Windows和Linux下从数据库导出表结构,以及Linux下如何导入.sql文件到MySQL数据库...

本文首先讲解window下如何使用Navicat for MySQL导出表。1、如下图所示,目标数据库是mydatabase,数据库中有四张表。2、选中该数据库,右键——数据传输。3、左边可以选择要导出哪几张表,右边选择.sql文件的存储位置。4、在高级中&…

基于Jenkins快速搭建持续集成环境

看了园友张善友的博文,尝试成功.便有此作.原网址: 基于 Jenkins 快速搭建持续集成环境 天下事有难易乎?为之,则难者亦易矣;不为,则易者亦难矣. 首先要学会使用MSBuild构建脚本 附网址:http://www.infoq.com/cn/articles/MSBuild-1. 目标:学会用MSBuild编译程序,主要…

零基础写Java知乎爬虫之进阶篇

转载自 零基础写Java知乎爬虫之进阶篇前面几篇文章,我们都是简单的实现了java爬虫抓取内容的问题,那么如果遇到复杂情况,我们还能继续那么做吗?答案当然是否定的,之前的仅仅是入门篇,都是些基础知识&#x…

MySQL导入冲突保留两者_面试被问MySQL 主从复制,怎么破?

一、前言随着应用业务数据不断的增大,应用的响应速度不断下降,在检测过程中我们不难发现大多数的请求都是查询操作。此时,我们可以将数据库扩展成主从复制模式,将读操作和写操作分离开来,多台数据库分摊请求&#xff0…

“.Net 社区虚拟大会”(dotnetConf) 2016 Day 1 Keynote: Scott Hunter

“.Net 社区虚拟大会”(dotnetConf) 2016 今天凌晨在Channel9 上召开,在Scott Hunter的30分钟的 Keynote上没有特别的亮点,所讲内容都是 微软“.Net社区虚拟大会”dotnetConf2015:关键词:.NET 创新、开源、跨平台 的具体化&#x…

Java(enum)枚举用法详解

转载自 Java(enum)枚举用法详解本篇文章主要介绍了Java 枚举用法详解,枚举的好处:可以将常量组织起来,统一进行管理。有兴趣的可以一起来了解一下。概念 enum的全称为 enumeration, 是 JDK 1.5 中引入的新特…

python处理脑电信号_用ICA去除脑电信号中的眼球链接

你有没有注意到你的“组件”完全是原始信号的比例和颠倒?这是因为你不能得到比信号更多的成分。在您需要执行以下步骤:将所有EEG通道输入ICA手动移除包含眨眼或其他伪影的组件用反变换重构让我们详细了解第2步:为什么要手动删除组件&#xff…

ASP.NET Core 中文文档 第一章 入门

原文:Getting Started翻译:娄宇(Lyrics)校对:刘怡(AlexLEWIS) 1、安装 .NET Core 2、创建一个新的 .NET Core 项目: mkdir aspnetcoreappcd aspnetcoreapp dotnet new 3、编辑 project.json 文件,添加 Kestrel HTTP se…

Properties文件的XML格式

转载自 Properties文件的XML格式 想必大家都用过*.properties文件,作为配置文件。但是,如果该文件写入了中文,待编译后内容就会成为乱码,使用native命令也好、使用ant执行编码转换也好,多少有点麻烦,与其如…

python简单爬虫课题_VS2019python爬虫入门

VS2019新建python项目在vs2019中添加python编译环境创建python控制台应用程序项目配置python环境安装requests第三方库管理程序包,执行安装requests包命令pip install requests导入第三方包import requests简单爬虫编写import requestsif __name__ "__main__&…

“.Net 社区虚拟大会”(dotnetConf) 2016 Day 2 Keynote: Miguel de Icaza

美国时间 6月7日--9日,为期三天的微软.NET社区虚拟大会正式在 Channel9 上召开,美国时间6.8 是第二天, Miguel de Icaza 做Keynote,Miguel 在波士顿Xamarin的办公室,所以使用了Skype。 class"video_iframe" …

Java泛型总结

转载自 Java泛型总结 Java泛型是JDK5引入的一个新特性,允许在定义类和接口的时候使用类型参数(type parameter)。声明的类型参数在使用的时候使用具体的类型来替换。泛型最主要的应用是在JDK5中的新集合类框架中。对于泛型概念的引入&#xf…

用 Visual Studio Code 在 macOS 上创建首个 ASP.NET Core 应用程序

原文:Your First ASP.NET Core Application on a Mac Using Visual Studio Code作者:Daniel Roth、Steve Smith 以及 Rick Anderson翻译:赵志刚校对:何镇汐、刘怡(AlexLEWIS) 本节将展示如何在 macOS 平台上创建首个 ASP.NET Core…

linux安装mysql遇到的问题_Linux下安装MySQL5.7及遇到的问题解决方法

一、下载地址本文安装的版本:或者使用wget下载:[rootlocalhost opt]# wget https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.32-el7-x86_64.tar.gz[rootlocalhost opt]# tar -xvf mysql-5.7.32-el7-x86_64.tar.gz二、检查是否已经安装过mysql[…

Java 8 新特性:扩展注解(类型注解和重复注解)

转载自 Java 8 新特性:扩展注解(类型注解和重复注解)(注:先回顾下JDK1.5版本出现的注解 ,然后再解释JDK 8的注解 更新内容。) 一.注解(JDK1.5) 1.注解(&…