对PointF数组进行排序

时间:2013-02-25 18:04:24

标签: c# sorting

任何人都可以帮我创建一个algoritm,IComparer或一些方法来排序PointF元素的数组或列表。假设我的数组中有以下PointF个元素:

  • [0] { X = 50.0 Y = 0.0}
  • [1] { X = 100.0 Y = 100.0}
  • [2] { X = 0.0 Y = 100.0}
  • [3] { X = 100.0 Y = 0.0}
  • [4] { X = 0.0 Y = 0.0}
  • [5] { X = 100.0 Y = 50.0}
  • [6] { X = 50.0 Y = 100.0}

我想要达到的目标是:

  • 首先是 Y X
  • 最低的元素
  • 仍然是 Y 最低但 X 的元素会变得更大
  • 然后在最低 Y 达到最高可能 X 时,它会变为所有元素 X ,但是更大且更大 Y
  • 当顶部 Y 和顶部 X 获得时,它将来自顶部 X 和顶部 Y ,仍然具有顶部 Y 的元素,但具有较低和较低的 X

所以这个排序的数组看起来像这样:

  • [4] { X = 0.0 Y = 0.0}
  • [0] { X = 50.0 Y = 0.0}
  • [3] { X = 100.0 Y = 0.0}
  • [5] { X = 100.0 Y = 50.0}
  • [1] { X = 100.0 Y = 100.0}
  • [6] { X = 50.0 Y = 100.0}
  • [2] { X = 0.0 Y = 100.0}

意思是,最后,如果我使用Graphics.DrawPolygon()绘制这些点,我会得到一个封闭的多边形(在这种情况下是一个矩形),没有相互交叉的线。

感谢您的时间

1 个答案:

答案 0 :(得分:7)

您想要的算法是格雷厄姆扫描。你可以在这里阅读:

http://en.wikipedia.org/wiki/Graham_scan

juharr的评论是正确的;您无法使用IComparable执行此操作,因为这不是比较排序问题。要使比较排序起作用,您需要能够比较任何两个元素的相对大小。

礼品包装算法是一种更简单但更慢的算法:

http://en.wikipedia.org/wiki/Gift_wrapping_algorithm

仅供参考,您正在寻找的形状称为凸包。这将有助于您搜索算法。