【问题标题】:Sort a list of points by distance between consecutive points按连续点之间的距离对点列表进行排序
【发布时间】:2013-01-13 15:22:49
【问题描述】:

我有一个 List(Of Point) - 可能有数十万个点。看来,要正确绘制某些东西,我可以使用它的唯一方法是按它们之间的距离对其进行排序。

[我在片场使用了 CCL 和凸包,但结果仍然是大量紧密的散列 - 或者如果我之后按中心的角度、斜率或其他东西对它们进行排序,则可以得到很好的辐射线]

有没有办法按连续点之间的距离对点列表进行排序?

我用过

Dim orderedByX As List(Of Point) = listOfPoints.OrderBy(Function(pt) pt.X).ToList()

【问题讨论】:

  • 你有所有点对之间的距离吗?
  • 我有一个点列表,所有点都是不同的。
  • 你到底想做什么?从无序点列表重建一个非凸多边形??
  • 将点列表转换为线列表,然后按线距离排序不是更有意义吗?
  • 在我看来,如果您应用凸包算法,您应该将点列表(构成凸包的点)保存在有序列表中。如果您在显示凸包时遇到问题,那么您的问题在于从纬度/经度到像素的转换。

标签: vb.net algorithm sorting distance point


【解决方案1】:

你首先需要构造point, distance 对。例如,您可以通过使用同一列表的移动版本压缩列表来做到这一点。然后按距离对序列进行排序,选择距离对应的点。

Dim sortedPoint = listOfPoints.Zip(listOfPoints.Skip(1), Function(p1, p2) New With { .Point = p2, .Distance = (p2 - p1).Length }).OrderBy(Function(v) v.Distance).Select(Function(v) v.Point)

我仍然认为这不是你真正想要的。我认为结果列表相当无用。

【讨论】:

  • 哇,这太棒了!我最终做到了这一点,通过找到最小距离,找到与每个点具有该距离的点 - 然后将其添加到新列表并将其从当前列表中删除......但是哇!我最终让它工作了,尽管我也一定会尝试这个。谢谢。
  • 这行代码很简单。首先,我们有一个点列表 - p[i]。然后我们将前一个点粘到每个点上,得到{p[i-1], p[i]} 的序列,我们立即将其转换为{Point=p[i], Distance=(p[i]-p[i-1]).Length}。然后我们按距离对序列进行排序并提取点。
  • :) Linq 中“简单”的定义是什么? (或者,有什么不能写成一行的吗?)
  • 嗯... LINQ 确实很不错 =) 严肃地说,LINQ 没有“分支”/“T-junctions”,因此任何分支都必须在多行中完成。我通过写listOfPoints 两次来绕过它,但如果它不是一个列表,而是来自数据库的一个流,我需要第二行和足够的内存来容纳所有点。
猜你喜欢
  • 1970-01-01
  • 2011-12-05
  • 1970-01-01
  • 1970-01-01
  • 2014-06-26
  • 1970-01-01
  • 2020-08-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多