【问题标题】:Given a large set of vertices in a non-convex polygon, how can i find the edges?给定非凸多边形中的大量顶点,我如何找到边缘?
【发布时间】:2011-02-14 01:21:52
【问题描述】:

我有一组顶点(称为 A),我想找到所有的边界顶点,这样这个边界顶点集就是形状的轮廓。

A 中的许多顶点是多余的,因为它们在形状内部,我想去掉这些顶点。

我的问题类似于Best Algorithm to find the edges (polygon) of vertices,但我需要它来处理非凸多边形情况。

编辑: 澄清:下图是一个凹多边形。这就是我所说的非凸的。如果我在其上运行凸包算法,它不会保留多边形的凹面部分。(除非我弄错了)。

我在多边形的内部和边界上有一组顶点:[[x1,y1], [x2,y2]...] 我想减少集合,使顶点只是形状的边框轮廓。

【问题讨论】:

  • “为非凸多边形案例工作”是什么意思?您链接到的问题包括输入顶点形成凹多边形的情况,因此我看不出您的问题有何不同。
  • 如何区分哪些顶点在多边形内部,哪些顶点在边上?

标签: outline polygons vertices concave


【解决方案1】:
【解决方案2】:

您的描述有些含糊,但您可能正在寻找算法来构造一组点的Convex Hull。简单地说,凸包就是在所有顶点周围放上橡皮筋所得到的形状。
在 2D 中编写凸包算法并不是非常困难,并且有一些库可以做到这一点,例如 qhull

(您链接到的问题中也给出了该答案,这似乎是您问题的特例)

【讨论】:

  • 凸包不会排除一些点,因为它只会跟踪凸多边形吗?我在答案中添加了一张图片以阐明形状。
  • 它会,但你怎么知道要划分哪条边来放置这两个额外的边?
【解决方案3】:

这是一个古老的、可能已被废弃的问题,但它让我开始思考。您不是在寻找凸包,而是要保持多边形形状,而只是摆脱沿线位于“边缘”之间的点。

解决方案可以是遍历相邻点并计算第一个和第二个的线性斜率,然后保存该斜率值,计算第二个和第三个的斜率,如果 pt1-pt2 的斜率等于pt2-pt3 然后 pt2 在形成线时是多余的,因此可以被删除。继续循环,直到回到 pt1。

这将确保您的凹形保持不变,但不相关的额外点会被删除。

【讨论】:

    【解决方案4】:

    您要查找的术语是凹壳

    问题的最简单形式没有像凸包那样定义明确,因为覆盖给定点的凹多边形不是唯一的。但是有很多好的方法。

    最简单的方法之一是,您使用礼物包装算法,但不是考虑每一步的所有点,而是只考虑当前顶点的 k-最近邻。

    这里 k 是您要调整的超参数。如果 k 太高,你会得到凸包。如果 k 太低,则生成的多边形有很多凹面。


    以下是一些相关链接:

    【讨论】:

      猜你喜欢
      • 2010-10-03
      • 2016-12-14
      • 1970-01-01
      • 2012-04-15
      • 2019-10-23
      • 2014-03-13
      • 2013-05-26
      • 2012-03-21
      • 1970-01-01
      相关资源
      最近更新 更多