使用新数据集将n顶点多边形展开为n顶点多边形

时间:2009-09-08 14:52:56

标签: geometry 2d polygon

有一个带有n个顶点的简单多边形P1,n很小,比方说8.这个多边形应代表某些2D点的周长。

接下来,我们有另一个多边形,我们称之为P2,也有最大顶点数n。 P2接近P1,因此绘制一个新的多边形P3是有意义的,它将同时描述P1和P2的区域。

我正在寻找选择新多边形P3的点的算法。我想描述(仍然,有n点!)尽可能好的P1 + P2的形状:用于创建仍然在新多边形P3内的多边形的点的数量应最大化,但是P3尽可能小。

扩展多边形的过程将在我的应用程序中重复调用。

2 个答案:

答案 0 :(得分:2)

如果我正确地阅读这个问题,那是不可能的。考虑一个“半圆”,由沿曲线的N个点定义,而在直边上没有。设P1和P2为两个这样的半圆,它们的直边彼此相对:(| |)。显然,唯一包含它们的多边形都包含所有2N点。

更简单的问题(引入一个新顶点并选择一个旧顶点逐出)也是不可能的:考虑一个三角形,以及一个靠近边缘中间的新点。

如果我们放弃了内部任何一个都不会丢失的要求,那么问题就可以解决,但并不完美。我建议您尝试其中一些,看看哪个套房最合适。

  • 只需将P1和P2组合成一个2N多边形,然后消除每个其他顶点(d.h.保持顶点2,4,6 ......)。原油,但也许足够好。
  • 将两个最近的邻居合并为一个。重复,直到你只剩下N.
  • 消除“直线”顶点,直到只剩下N为止。
  • 从2N多边形开始,然后通过获取其两个边的交叉积来测量每个顶点对该区域的贡献。如果是正的,则该顶点是凸的并且“保护”大部分内部。如果为负,则这是一个凹面顶点,“排除”大部分外部。现在消除最不重要的顶点。请注意,这是一种完美的方法,因为消除两个邻居可能会造成比分数所示更多的伤害。

答案 1 :(得分:1)

听起来你正试图找到一组具有可接受的点密度的多边形。你考虑过构建一系列convex hulls吗?向外增长,每次添加点时都会构建新的凸包。找到新船体的密度。如果不可接受,请删除该点并选择其他点。达到目标区域或总点数时停止。

这也可以反过来应用。您可以使用初始多边形P1和P2来种植凸包,然后考虑扔掉一个点并计算新的密度。最有用的去除点是最大化密度增加的点。重复直到满意为止。

简单的 O(n log n) convex hull algorithms存在于两个维度。 Qhull是一个不错的C实现。