从排序集中删除对象

本文关键字:对象 删除 集中 排序 | 更新日期: 2023-09-27 18:30:15

我已经看了太久了,希望有人能帮忙。

一般的jist是;

  1. 我有一个玩家对象的 SortedSet (按 Y 位置排序),每个玩家都包含一个排序的"多边形"对象集,这些对象又包含三个点对象的列表,显然形成了一个三角形。

  2. 该多边形集按所述多边形的面积从小到大排序。

  3. 我想做的是遍历一组玩家和;

I. 将多边形 SortedSet 中第一个对象的索引 [1](三角形的"峰值")处的点分配给玩家内部的另一个变量。

II. 一旦将索引 [1] 处的点分配给玩家,我需要遍历每个玩家并删除包含 ElementAt(1) 处当前点的多边形的任何实例,以便"父"迭代中的后续玩家无法被分配包含该点的多边形。

需要注意的是,多边形点[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 淘汰了,它完全按照你的期望工作。

编辑 - 对于任何发现这一点寻找类似问题解决方案的人,不要浪费时间使用 sortedsets 对对象集合进行排序,您可以使用 OrderBy 通过列表实现相同的目标。

从排序集中删除对象

这是一个远景,但有时比较浮点数和双精度有点棘手,因为精度。例如,由于舍入误差,点 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 相等运算符会处理这个问题,但它可能不会