2

アルゴリズム、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}

私が達成したいことは次のとおりです。

  • 最初はYXが最小の要素です
  • 最低のYを持つ要素を維持しますが、Xは大きくなります
  • 次に、この最低のYで可能な限り最高のXが達成されると、すべての要素がこのXになりますが、 Yはどんどん大きくなります
  • top Yと top Xが達成されると、 top Xと top Yを持つ要素から、まだ top 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()と、線が互いに交差しない閉じた多角形 (この場合は長方形) が得られます。

お時間をいただきありがとうございます

4

1 に答える 1

7

必要なアルゴリズムはグラハムスキャンです。あなたはここでそれについて読むことができます:

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

juharrのコメントは正しいです。これは比較ソートの問題ではないIComparableため、これを行うことはできません。比較ソートが機能するには、相対的なサイズについて任意の2つの要素を比較できる必要があります。

より簡単ですが遅いアルゴリズムは、ギフトラッピングアルゴリズムです。

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

参考までに、あなたが探している形は凸包と呼ばれています。これは、アルゴリズムを検索するときに役立ちます。

于 2013-02-25T18:19:06.107 に答える