2014-11-13 3 views
0

Я слишком долго смотрел на это, надеюсь, кто-то может помочь.Удаление объектов из SortedSet

Общий трюк;

  1. У меня есть SortedSet игрок объектов (отсортированный по Y позиции), каждый игрок содержит SortedSet объектов «Polygon», который в своей очереди, содержит список из трех точечных объектов, очевидно, образуя треугольник.

  2. Этот набор полигонов сортируется по площади указанного многоугольника, от минимального до самого большого.

  3. Что я хочу сделать, это перебирать множество игроков и;

I. Назначить точку индекса [1] («пик» треугольника) из первого объекта в многоугольнике SortedSet другой переменной внутри проигрывателя.

II. Как только точка в индексе [1] была назначена игроку, мне нужно пройти через каждого игрока и удалить любой экземпляр многоугольника, который содержит текущую точку в ElementAt (1), поэтому последующие игроки в «родительской» итерации не могут назначается многоугольник, содержащий эту Точку.

Возможно, важно отметить, что точка в polygonPoints [1] основана на позиции противника, поэтому они совместимы со всеми игроками, поэтому я пытаюсь использовать ее в качестве точки ссылки для удаления любые объекты многоугольника, которые содержат указанную точку.

Это сложное объяснение, но, надеюсь, вы смогли следовать.

Прямо сейчас у меня есть первая часть, но вторая часть оказывается серьезной болью - я попытался удалить и удалить место (используя критерии, которые должны удалить все), и набор упрямо остается той же длины Неважно что я делаю.

Для справки - последняя итерация кода, с которой я борюсь.

List<PointF> duplicates = new List<PointF>(); 

foreach (Player p in playerSet) 
{ 
    //Assign lowest cost polygon to current player, then remove all polygons containing the point at p.triangleSet.ElementAt(0).polygonPoints[1] from every other player so it can't be assigned to any subsequent player. 
    p.currentAttackingPoint = p.triangleSet.ElementAt(0).polygonPoints[1]; 

    //I use this method to keep track of which 'attacking points' have been assigned. 
    add(p.currentAttackingPoint); 

    //Then, in theory, I use this method to remove all polygons that contain any point in the duplicates list from every other player. Obviously this is proving to be the troublesome aspect. 
    remove(duplicates); 
} 

... 

private void add(PointF i) 
{ 
    duplicates.Add(i); 
} 

private void remove(List<PointF> dupes) 
{ 
foreach(PointF p in dupes) 
{ 
    foreach (Player l in playerSet) 
    { 
     //Outputs 100 
     textBox3.AppendText(l.triangleSet.Count.ToString() + "\r\n"); 

     l.triangleSet.RemoveWhere(e => e.polygonPoints[1] == p); 
     //l.pressingTriangleSet.RemoveWhere(e => e.polygonPoints[1].X > 0);  --Doesn't work either, despite it being true of every point in the set. 

     //Still 100 
     textBox3.AppendText(l.triangleSet.Count.ToString() + "\r\n"); 
    } 
} 
} 

Пожалуйста примите во внимание, что множество многоугольников внутри каждого игрока, в то время как тот же длины все имеют в значительной степени различное содержание, они основаны на позиции игрока в положение противника и другим произвольным факт о состояние игры - поэтому я не могу просто удалить первый многоугольник из набора каждого игрока.

Я думаю о преобразовании каждого набора в список, как только они были созданы, потому что это причудливо, это должен быть некоторый порядок операций, который я пропускаю.

Чисто для моего собственного здравомыслия Я выбил это http://pastie.org/private/ikq5lhhacxxvfaoervauw, и он работает точно так, как вы ожидали.

EDIT - Для тех, кто считает, что это ищет решения подобной проблемы, не тратьте свое время, используя sortedsets отсортировать коллекцию объектов, вы можете использовать OrderBy для достижения тех же вещей со списками.

ответ

0

Это длинный снимок, но иногда сравнение поплавков и двойников немного сложно из-за точности. Например, точка 1.0 может быть представлена ​​как 1.0000001 из-за ошибок округления.Вполне возможно, что ваши очки не сравниваются правильно

Попробуйте что-то вроде

e.polygonPoints[1].X - p.X < 0.00001 
&& p.X - e.polygonPoints[1].X < 0.00001 
&& e.polygonPoints[1].Y - p.Y < 0.00001 
&& p.Y - e.polygonPoints[1].Y < 0.00001 

Я предположил бы, что оператор PointF равенство будет заботиться о том, что, но это не может

+0

Да, я думал, что это может что-то вроде этого, но у меня есть «удары», если утверждения - если (e.PolygonPoints [1] == point), и он соответствует штрафу. Если бы вы могли удалить из набора, перечислив его, теоретически я мог бы заставить его работать – user1006221

+0

Вы можете создать другой набор с удаляемыми точками, а затем удалить их после перечисления – Eric

+0

Можете ли вы попробовать RemoveAll вместо RemoveWhere? – Eric

Смежные вопросы