【问题标题】:Finding Remote Points in 2D在 2D 中查找远程点
【发布时间】:2009-09-25 00:09:44
【问题描述】:

我在无限(嗯,双精度)二维平面上有一组点。

给定这个集合的凸包,如何在凸包的内部找到一些与输入集合中所有点相对较远的点?

在下图中,黑点是原始集合的一部分,阴影区域表示如果我们以半径 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

【问题讨论】:

  • 你有描述这个表面的方程吗?听起来您要求的是 3D 解决方案,因为橙色圆点位于内部。
  • 这是对问题的准确改写吗? “我有一组点;我希望对它们进行排序,按距离下降到集合中最近的其他点,然后从我的排序中丢弃凸包上的任何点”。然后,您可以从该列表中取出前 n 项。
  • 我认为橙色点是他想要确定的可能点,而不是集合中的点。
  • @Eric,没有。我有一组点,我想找到新点,从离其他所有点最远的点开始。
  • 啊,明白了。在“Voronoi 图”上进行网络搜索。我认为这可能会对你有所帮助。我敢打赌,最大的 voronoi 区域与其边缘与您希望确定的集合之间存在关系。

标签: c# 2d point


【解决方案1】:

这是可以使用KD-Trees 解决的问题的一个很好的例子...在数字食谱第三次添加中有一些很好的注释。

如果您试图找到相对孤立的点位置...也许最大的四边形元素的中心是一个不错的候选者。

创建 KD-Tree 的复杂度为 O(n log^2 n)……而创建四边形大小的排序列表的复杂度为 O(n Log n)。即使是大量的点似乎也是合理的(当然,取决于您的要求)。

【讨论】:

  • 有趣。我会追求这个,这听起来肯定很有希望。在 Kd 或 Quad 树中找到空矩形,或者在 Delaunay 三角剖分中找到大三角形的中心。
  • 另一件事可能是该区域可能会产生误导......您可能有一个又高又瘦的盒子,所以它实际上会接近一个点。可能更好的度量是四边形的最小边长,并找到最大化该度量的四边形。
【解决方案2】:

这是一个幼稚的算法:

  1. 获取凸形内的点列表。
  2. 其中,找出到任何其他点的最短距离。
  3. 根据各自的 R 值对所有点进行排名
  4. 选择前 x 个点。

对于(2),将其视为半径搜索仍然意味着您最终会计算每个点到另一个点的距离,因为找出一个点是否位于另一个点的给定半径内与找到点之间的距离。

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

【讨论】:

  • 这仅适用于事先知道“橙色”点的情况 - 我认为他正在尝试查找/生成不接近其他点的点。
  • 我可以使用 QuadTree 结构快速找到最近的点,该代码我已经准备好了。问题是凸包内的点数是巨大的。为了获得我需要的那种准确性,需要数以百万计的搜索。该图像显示了一个相当不错的分布,但有时这些点非常聚集在遥远的星系中。我需要它非常快,因为它是在 GUI 中调用的,并且我需要将刷新率保持在每秒 30 帧以上。我很欣赏这个答案,但这不行。
  • @Reed:我的算法将 每个 点与 每个其他 点进行比较,因此它会自动识别哪些点(基于一些“TOP x " 样式的阈值应被视为“橙色”。
猜你喜欢
  • 2012-09-16
  • 1970-01-01
  • 1970-01-01
  • 2015-10-17
  • 2011-09-25
  • 2017-10-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多