【问题标题】:Finding center of a set of points to sort them clockwise?找到一组点的中心以顺时针排序?
【发布时间】:2011-10-24 14:59:11
【问题描述】:

我想按顺时针顺序对点向量进行排序以形成多边形,但我需要正确的中心才能这样做。我已经尝试过平均方法,但有些点根本没有正确排序。以顺时针方式对点进行排序时找到中心的正确方法是什么?

凹面部分不合格

谢谢

这是一张图片:

绿色圆圈是中心。

它应该看起来更像这样:

【问题讨论】:

  • 鉴于多边形仅由其点定义并且是非凸的,我不确定是否存在没有进一步限制的解决方案。不清楚多边形是唯一定义的。

标签: c++ algorithm geometry computational-geometry


【解决方案1】:

请参阅Barycenter。可能这就是你要找的东西

【讨论】:

    【解决方案2】:

    任意点为中心,应该可以确定到集合中所有点的距离和角度,然后按角度排序就很简单了。但是,您选择作为中心的点会影响排序顺序,因此在您选择一个点作为中心之前,很难知道“正确”的顺序应该是什么。

    因此,如果您选择质心作为中心(似乎是一个不错的选择),但有些点相对于该点的排序不正确,那么我会说您的排序代码有问题。或者,如果您对算法未满足的排序顺序有一个期望,那么我会说您的假设之​​一(排序顺序或中心位置)是不正确的。

    【讨论】:

    • 查看我的图片以更深入地了解该问题。
    • 您的排序是正确的。问题是不能按角度排序生产奶牛。
    • 那么什么样的算法可以做到这一点呢?现在我只是从图片本身中得到轮廓顶点,但它们是按扫描线顺序排列的。
    • 看起来你有很多点,所以你可以尝试从任何点开始,画一条线到最近的邻居。它并不完美,但它应该适用于奶牛。
    【解决方案3】:

    如果您没有预定义的中心点,则“按顺时针顺序排序”的概念没有明确定义。

    如果你只有一堆需要排序的点,而且你事先不知道中心,那么这个问题通常没有单一的解决方案。该问题有许多替代解决方案,每种解决方案都会为您提供不同的多边形结果。

    此外,找到一个允许您通过 CW(或 CCW)排序重新创建原始多边形的中心仅适用于特殊类别的多边形:所谓的star-shaped 多边形。星形多边形的主要属性是可以在多边形内部找到一个点,从该点开始,多边形的整个内部都是“可观察的”(我希望在没有定义的情况下清楚“可观察”的含义)。

    如果你的多边形不是星形的,那么这样的中心点根本就不存在。并且,由于这个原因,不可能通过 CW 排序重新创建原始多边形。

    图片中的牛轮廓显然不是星形多边形,这意味着您将永远无法通过围绕某个中心、任何中心对点进行排序来重新创建原始牛轮廓。没有“正确的方法”。这是不可能的。

    【讨论】:

    • 那么什么样的算法才能让我成为原来的牛?
    • @Milo:想象一个更简单的多边形,例如一个 5 角星。如果你抹掉这些线,只看点,至少有两种可能的重建:一颗星星,或者两个同心的五边形,每边都有一条缺失的边,由两条线连接。擦除线条会丢弃有价值的信息,并且无法可靠地解决问题。 (巧合的是,正如 Andrey 所说,星星恰好适合您已经尝试过的算法,但牛不是星星。)
    • @Milo:如果轮廓上的点非常密集(尤其是在弯曲部分),那么您可以通过从一个点跳到下一个最近点来重新创建奶牛。但是,如果这些点不够密集,那么在某些地方可能会出现错误。在一般情况下,根本不可能从无序的点集重新创建原始轮廓。正如我上面所说,可以从一组点构建许多不同的轮廓。由于您无法决定哪个是正确的,因此您无法重新创建它。
    • 图片 2 是用一个叫 PhisicsEditor 的程序创建的,他们是怎么做到的?
    • @Milo:嗯,你的点集很可能拥有一些重要的属性,允许人们重新创建原始图片。您只是没有告诉我们该属性是什么(或者您自己不知道)。虽然 PhisicsEditor 知道该属性并利用它。例如,它可以做我上面提到的事情:只是从一个点跳到它的近邻。
    【解决方案4】:

    我认为最可靠的策略(除了重新设计您的程序/系统以便一开始就不会出现此问题)是最小化多边形的总周长。

    这不是一个简单的问题,但这里有一个应该很好用的启发式方法:

    1. 对于每个点,找到下一个最近的点。这定义了一组潜在的连接。
    2. 将最长的潜在连接添加到多边形。
    3. 重复 1-2,但忽略已经建立的连接和已经有两个连接的点。

    这只是一种启发式方法,而不是解决方案。我不确定它是否能保证生成多边形。

    【讨论】:

      猜你喜欢
      • 2011-10-16
      • 1970-01-01
      • 1970-01-01
      • 2011-10-22
      • 1970-01-01
      • 2010-09-19
      • 2018-12-07
      • 1970-01-01
      • 2015-07-17
      相关资源
      最近更新 更多