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

遇到的问题

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

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

现有的解决方案

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

  • 将点置于任意大小的网格上(本文中为24x24,或576个点),在其边界框内探测多边形,丢弃多边形外的所有点。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
多边形扫描线填充算法一种基于扫描线的算法,主要用于将一个封闭的多边形区域进行填充。有序边表法是多边形扫描线填充算法一种实现方式。 有序边表法的基本思路是将多边形区域分割成若干条水平的线段,并将这些线段按照从上到下的顺序排序,形成有序边表。然后,从上到下扫描每条扫描线,将扫描线与多边形边界相交的线段加入活动边表。对于每条扫描线,从左到右依次处理活动边表中的线段,根据线段的左右端的交来确定需要填充的区域。 具体实现时,我们可以使用一个数组来维护有序边表和活动边表。每个元素存储一条线段的信息,如线段的上端、下端、斜率等。在扫描线过程中,我们需要动态地更有序边表和活动边表,以便能够正确地计算出需要填充的像素区域。 以下是基于有序边表法的多边形扫描线填充算法的主要步骤: 1. 将多边形的边按照从上到下的顺序排序,形成有序边表。 2. 初始化活动边表为空。 3. 从上到下扫描每条扫描线。对于每条扫描线,从左到右处理活动边表中的线段,根据线段的左右端的交来确定需要填充的区域,并将填充的像素标记为已填充。 4. 对于每个顶,将其左侧的线段加入活动边表,将其右侧的线段从活动边表中删除。 5. 如果当前扫描线与某条边界线段相交,则根据相交的位置来判断是否需要将该线段加入或删除活动边表。 6. 重复步骤3~5,直到扫描完整个多边形区域。 总的来说,有序边表法是一种比较简单易懂的多边形扫描线填充算法,但由于需要维护有序边表和活动边表,算法效率较低,不适用于处理大规模的多边形区域。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值