欢迎访问 生活随笔!

生活随笔

当前位置: 首页 >

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

发布时间:2023/12/3 71 豆豆
生活随笔 收集整理的这篇文章主要介绍了 多边形上点的顺序排序_一种寻找多边形视觉中心的新算法 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

遇到的问题

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

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

现有的解决方案

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

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

新的解决方案

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

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

    寻找更快的解决方案

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

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

    总结

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

    关注图鲸科技  mapwhale.com

    总结

    以上是生活随笔为你收集整理的多边形上点的顺序排序_一种寻找多边形视觉中心的新算法的全部内容,希望文章能够帮你解决所遇到的问题。

    如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。