【问题标题】:Ordering points in concave hull - algorithm凹壳中的排序点 - 算法
【发布时间】:2015-07-11 03:00:54
【问题描述】:

我实现了一种算法来查找一组点的 alpha 形状。 alpha 形状是一组点的凹壳,其形状取决于决定哪些点组成壳的参数 alpha。

我已经解决了凹壳中的点集。这些点构成一个凹多边形。我想按顺时针顺序排列这些点。

当它是凸形时,顺时针排序点很简单。凹的东西怎么做到这一点?背后是什么算法?我查看了“非交叉最短路径”算法、“最短非交叉哈密顿路径”算法。这是正确的方法吗?

【问题讨论】:

  • 如果你已经有一个多边形,是不是说明你已经有订单了,只需要判断是顺时针还是逆时针?还是您只有一组没有特定顺序的点,并希望它们按顺序排列以形成一个多边形?
  • 我以前从未这样做过,但我想你可以计算形状的质心,然后获得从质心到每个点的向量的角位移(使用 arctan)。如果您有一些代码,我可以尝试添加它。
  • 其实,忽略我上面的 atan 建议。使用@user1929959 链接的已接受答案中的优秀方法。获得质心后,根据从质心到每个点的向量的叉积是正(ccw 旋转)还是负(cw 旋转)来比较点。第三维为 0 时的叉积就是二维行列式。

标签: algorithm sorting


【解决方案1】:

这个答案非常有价值https://gamedev.stackexchange.com/questions/13229/sorting-array-of-points-in-clockwise-order,因为在凹形外壳和任何一组点中排序点都是一样的,排序的参考是点的重心(或外壳内的任何点!)

你的问题不够准确。一个点数组只是 « 顺时针 » 或 « 逆时针 » 相对于参考点。 否则,任何三个点的数组总是可以是 CW 或 CCW。 见下图:左边,点是有序的 顺时针;在右边,完全相同的点被排序 逆时针。

顺时针或逆时针

在您的情况下,我相信使用点的重心作为 参考点是合理的。

对于未知点数的好方法可能是以下 一:

让 P[0], P[1], ... P[n-1] 是要排序的点列表让 M 是 所有点的重心

计算 a[0], a[1], ... a[n-1] 使得 a[i] = atan2(P[i].y - M.y, P[i].x - M.x);

相对于它们的 a 值对点进行排序,例如使用 qsort。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-01-26
    • 2018-04-30
    • 1970-01-01
    • 2014-05-21
    • 2011-12-22
    • 2011-03-27
    • 1970-01-01
    • 2010-09-10
    相关资源
    最近更新 更多