从给定的点坐标集中找到边界坐标?


18

给定一组坐标,我们如何找到边界坐标。
一组坐标 <== 图1
给定上面设置的坐标,我如何获得红色边界上的坐标。边界是由顶点的输入坐标形成的多边形,以使其面积最大化的方式。

我正在开发一个应用程序,该应用程序可以搜索城市 “ x”英里内的房地产。我所拥有的是:

  1. 所有属性的坐标。
  2. 每个城市的一组坐标(我每个邮编都有一个坐标。由于大多数城市都有多个邮编,所以每个城市都有一组坐标)

我要求最大面积的原因是为了避免出现像下面这样的多边形:

弯曲的多边形 <== 图2

我需要的是一种算法,可以得出边界的坐标集。一种算法,可以让我得出图1的边界坐标。



4
不,不是重复的,这是凸包,不是凹包
NicklasAvén2011年

1
您在寻找特定现有软件环境中的代码,理论参考或解决方案吗?
WolfOdrade 2011年

1
@Khaja不,您不想最大化面积,您想要在包含点的所有多边形中最小化面积。(最大化面积的唯一方法是将整个世界用作包含多边形。)
whuber

1
@whuber是的,现在我明白了你的意思,我想要一个具有最小面积的凸多边形。我的最终目标是进行邻近搜索。我们希望我们的邻近搜索的工作方式是:在给定的城市(凸包),如果我们中的“x”英里搜索家庭(每个家庭有一个坐标),它应该给我所有的房屋它们要么里面的凸包 正交距离小于“ x”英里
Khaja Minhajuddin

Answers:


21

有很多算法可以解决此问题(Wikipedia“ Convex_hull_algorithms”):

  • 礼品包装(又称Jarvis游行)— O(nh):最简单的算法之一。它具有O(nh)时间复杂度,其中n是集合中的点数,h是船体中的点数。在最坏的情况下,复杂度为O(n2)。
  • 格雷厄姆(Graham)扫描-O(n log n):稍微复杂一些,但是效率更高。如果这些点已经按坐标之一或相对于固定向量的角度进行排序,则该算法将花费O(n)时间。[ 伪代码 ]
  • QuickHull:与快速排序算法一样,它具有预期的时间复杂度O(n log n),但在最坏的情况下可能退化为O(nh)= O(n2)。[ 图示说明 ]
  • 分而治之-O(n log n):该算法也适用于三维情况。
  • 单调链— O(n log n): Graham扫描的一种变体,按字典顺序对点进行坐标排序。输入已经排序后,该算法将花费O(n)时间。
  • 增量凸包算法— O(n log n)
  • 征服前结婚— O(n log h):最佳输出敏感算法。
  • Chan算法— O(n log h):更简单的最优输出敏感算法。

感谢您列出这些@underdark ...您选择哪个?
马林




1

如果您想要一种算法来执行此操作(而不是可以执行此操作的程序包),那么我认为您需要对数据进行三角剖分。或基本上定义了从每个点到每个其他点的线。然后,从(例如)Y值最高的点开始,沿着连接线以最小的外部角度/轴承在外部绕线。

您可以通过先丢弃相交的线来加快跟踪速度。外部边界不会有交叉点。

顺便说一句-FME也可以使用ConvexHullAccumulator或ConvexHullReplacer变压器来做到这一点!


1

如果您有兴趣查看以代码实现的现有算法,则NetTopologySuite可以提供一种算法来完成此任务

参见ConvexHull.cs

顺便说一下,NTS和其他许多库都包装在一个名为DotSpatial的很酷的项目中,在这里

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.