сортировка множества PointF

Мог любой помогать мне с созданием алгоритма, 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}

То, чего я хотел бы достигнуть:

  • first are elements with lowest Y and X
  • still elements with lowest Y but X would get bigger
  • then as the highest possible X at this lowest Y get achieved it would go, all elements with this X, but with bigger and bigger Y
  • as the top Y and top X get achieved, it would go from elements with top X and top Y, to elements still with top Y, but with lower and lower 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}

Значение, которые в конце, если я должен был потянуть эти пункты, используя Графику. DrawPolygon() я получил бы закрытый многоугольник (в этом случае прямоугольник) без линий, пересекающих друг друга.

Спасибо в течение вашего времени

2
nl ja de
Нет не домашняя работа, я работаю над проектом для моего сам. Я попытался создать некоторые методы с петлями, но я просто косяк думаю о способе заставить это работать...
добавлено автор user1806687, источник
Запахи как домашняя работа?
добавлено автор Soner Gönül, источник
Так, вы хотите устроить некоторые пункты в закрытый многоугольник, по упрощенному, чтобы думать об этом как о сортировке.
добавлено автор Jodrell, источник
en.wikipedia.org/wiki/Hamiltonian_path
добавлено автор Jodrell, источник
Многоугольник должен пересечь каждый пункт или просто содержать каждый пункт?
добавлено автор Jodrell, источник
@Jodrell: Я думаю, что плакат хочет выпуклую оболочку, не гамильтониан.
добавлено автор Eric Lippert, источник
IComparer isn' t собирающийся работать, поскольку это определяет, является ли один пункт меньше, чем, равный, или больше, чем другой пункт без ведома каких-либо других пунктов.
добавлено автор juharr, источник

1 ответы

Алгоритм, который вы хотите, является Просмотром Грэма. Можно читать об этом здесь:

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

комментарий juharr правилен; вы не собираетесь быть способными сделать это с IComparable , потому что это не проблема вида сравнения . Для вида сравнения, чтобы работать, необходимо быть в состоянии сравнить любые два элемента для относительного размера.

Более-легкий-но-медленнее алгоритм - алгоритм обертывания подарка:

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

К вашему сведению форму, которую вы ищете, называют выпуклой оболочкой . Это поможет вам, ища алгоритмы.

7
добавлено
Да, это походит на вещь, которую я ищу. Но я не то, что очень goot в английском языке, особенно не в математике, написанной на английском языке. И с тех пор нет никакого перевода на мой язык. Вы могли сделать быстрое резюме статьи? Пожалуйста...
добавлено автор user1806687, источник
Я предполагаю you' право ре, я должен буду просто прочитать это, непока я не понимаю достаточно, чтобы создать своего рода метод, который сделал бы это.
добавлено автор user1806687, источник
Хорошо, так как я написал бы резюме на математическом английском языке, это wouldn' t помогают вам очень. Возможно, можно найти информацию об алгоритмах выпуклой оболочки на родном языке.
добавлено автор Eric Lippert, источник
Microsoft Stack Jobs
Microsoft Stack Jobs
1 788 участник(ов)

Work & freelance only Microsoft Stack. Feed https://t.me/Microsoftstackjobsfeed Чат про F#: @Fsharp_chat Чат про C#: @CSharpChat Чат про Xamarin: @xamarin_russia Чат общения:@dotnettalks

Microsoft Developer Community Chat
Microsoft Developer Community Chat
584 участник(ов)

Чат для разработчиков и системных администраторов Microsoft Developer Community. __________ Новостной канал: @msdevru __________ Баним за: оскорбления, мат, рекламу, флуд, флейм, спам, NSFW контент, а также большое количество оффтоп тем. @banofbot