在2D中查找远程点

时间:2009-09-25 00:09:44

标签: c# 2d point

我在无限(良好,双精度)2D平面上有一组点。

考虑到该组的凸包,如何在凸包的上找到一些距离输入集中所有点相对较远的点?

在下图中,黑点是原始集合的一部分,阴影区域表示如果我们用半径R“增长”它们,所有点占用的空间。

橙色点是我想要的例子。它们究竟在哪里并不重要,只要它们距离所有黑点都相对较远。

Furthest Point Search http://en.wiki.mcneel.com/content/upload/images/point_far_search.png


更新:使用delaunay算法查找大空三角形似乎是一个很好的方法: Delaunay Solution http://en.wiki.mcneel.com/content/upload/images/DelaunaySolutionToInternalFurthestPoints.png

2 个答案:

答案 0 :(得分:1)

这是一个天真的算法:

  1. 获取凸形内的点列表。
  2. 其中,找到与任何其他点的最小距离。
  3. 按各自的R值对所有点进行排名
  4. 选择前x个点。
  5. 对于(2),将其视为半径搜索仍然意味着你最终计算从每个点到另一个点的距离,因为找出一个点是否位于另一个点的给定半径内是与找到点之间的距离。

    要优化搜索,您可以将空间划分为网格,并将每个点分配到网格位置。然后,您搜索上面的(2)将首先在同一个方格周围检查周围的8个方格。如果到另一个点的最小距离在相同方格内,则返回该值。如果它来自8中的一个并且距离使得9之外的点可以更近,那么你必须检查那些9之外的网格位置的下一个轮廓,比9中的那些更接近。冲洗/重复

答案 1 :(得分:1)

这是一个可以使用KD-Trees解决的问题的一个很好的例子...在Numerical Recipes 3rd Addition中有一些好的注释。

如果你试图找到相对孤立的点位置......也许最大四元素的中心将是一个很好的候选者。

创建KD树的复杂度为O(n log ^ 2 n)...并且创建四元组大小的排序列表将为O(n Log n)。即使是大量的积分也是合理的(当然,这取决于您的要求)。