Concave Hull在边界上获取多边形的所有点

时间:2017-07-19 05:34:31

标签: c++ mathematical-optimization convex-hull

在我的工作中,我必须在边界中包含一些随机的点组。凸形船体占据了额外的空间而且没有最紧凑的形状,所以我修改它以便以下列方式放松边缘:

i)绘制给定点数的凸包。

ii)现在对于凸包边界上的每个点,检查它是否可以添加到边界(当然这会改变边界整形),同时确保没有任何给定的点位于在新的多边形外面。 (以多边形算法表示)

iii)如果所有点都位于多边形内部,则重复步骤2以获得其他点。

iv)如果边界上不能包含更多的点,请停止。

现在,问题在于任何样本测试集,所有点都包含在边界中。我的怀疑是:

i)这是一个凹形船体吗?

ii)如果我只是按逆时针顺序排列给定的点并通过所有这些点绘制多边形而不是先绘制一个凸包,那么这有什么不同?

iii)对于任何给定数量的点,我是否可以通过它们绘制非自相交多边形,这样所有点都位于多边形的边界上?

enter image description here

enter image description here

enter image description here

enter image description here

1 个答案:

答案 0 :(得分:0)

假设您对2D多面体感兴趣(它可以是nD;它更容易解释和可视化2D!),您需要找到一组点的四个Pareto frontiers,这导致'你正在寻找的非支配的船体。为什么有四个边界?考虑下面的例子

Four Pareto frontier example

请注意,您需要四个边界(最大与最大,最小与最大,最大与最小,最小与最小)才能完全定义多面体的边缘。此外,请注意船体是否凸起取决于您的要点。上面的例子显示了一个不凸而不连续的边界,因此,多面体不是凸的而且也不是连续的。四个帕累托边界的集合包括完整的多面体形状。

如果您希望自己实现这一点,那就不是太糟糕了,只需要将每个点与每个点进行比较以比较它们的轴并确定哪个点使两个轴向有利的方向前进。这称为成对比较。

对于C ++中已编码的解决方案,这应该是启动https://github.com/kevinduh/pareto

的好地方