我已经看了很长时间,希望有人可以提供帮助。
一般的jist是;
我有一个玩家对象的SortedSet(按Y位置排序),每个玩家都包含一个<多边形'的排序集。对象又包含三个点对象的列表,显然形成一个三角形。
此多边形集按所述多边形的面积排序,从最小到最大。
我想做的是遍历一组玩家;
予。将索引[1]处的点(三角形的“峰值”)从多边形SortedSet中的第一个对象分配给播放器内的另一个变量。
II。一旦索引[1]上的点被分配给一个玩家,我需要遍历每个玩家并删除包含ElementAt(1)当前点的多边形的任何实例,这样就没有父母的后续玩家& #39;可以为迭代分配包含该点的多边形。
可能需要注意的是,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,它的确如你所期望的那样。
编辑 - 对于发现此问题寻找类似问题解决方案的人,不要浪费时间使用排序集对对象集合进行排序,您可以使用OrderBy来实现列表也一样。
答案 0 :(得分: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相等运算符会处理它,但它可能不是