C# - 从for循环中排除成员

时间:2017-02-14 11:20:23

标签: c#

我想看看红色无人机是否进入绿色无人机的安全区域,反之亦然。 我的问题是调试显示drone0进入drone1安全区域而drone1进入drone0安全区域。我只想检查一次。

enter image description here

如何排除重复,所以我只需要检查一次?

 for(int i=0; i<drone.Length;i++)
        {
            for(int j=0;j<drone.Length;j++)
            {
                if (i == j) continue;

                else if(drone[i].pos_atual().X <= drone[j].pos_atual().X +distancia &&
                   drone[i].pos_atual().X >= drone[j].pos_atual().X - distancia &&
                   drone[i].pos_atual().Y <= drone[j].pos_atual().Y + distancia &&
                   drone[i].pos_atual().Y >= drone[j].pos_atual().Y - distancia)
                {
                    Debug.WriteLine(i + "joined " + j +"safe area");
                }
            }
        }

变量:int distancia是20 pos_atual表示实际位置

编辑:

回答的问题总是让我觉得drone0进入了drone1的安全区域,即使是drone1进入了drone0的安全区域

2 个答案:

答案 0 :(得分:3)

您只需要修改循环,这适用于您不需要重复条件的任何组合:

for(int i = 0; i < drone.Length - 1; i++)
{
    for(int j = i+1; j < drone.Length; j++)
    {
        // etc.

上面的循环将限制ij的迭代,以便j总是大于i,因此您也可以删除if (i == j) continue;。< / p>

与您的问题没有直接关系的几个笔记。

  • 对于无人机而言,矩形安全区并没有多大意义。
  • 此检查仅适用于所有元素的安全区域具有相同的大小,形状和方向。

答案 1 :(得分:0)

  1. 我建议你继续检查当前无人机安全区域内的其他无人机是否为无人机舱。
  2. 我还要坚持只进行坐标验证。即稍后你将能够检查是否有任何其他物体在无人机的安全区域。
  3. 验证安全区域时,不应检查矩形。我认为它应该是圆圈。
  4. 无人机课程:

    public class Drone
    {
        public int Id { get; }
        public Point Location { get; }
        public int SafeAreaRange { get; } // can be constant
    
        public bool SafeAreaContains(Point location)
        {
            var dx = Math.Abs(Location.X - location.X);
            var dy = Math.Abs(Location.Y - location.Y);
            var distance = Math.Sqrt(Math.Pow(dy, 2) + Math.Pow(dx, 2));
            return distance < SafeAreaRange;
        }
    }
    

    现在,如果您有无人机列表,并想检查哪些是无人机安全区域。第一种情况 - 所有无人机都有相同大小的安全区域。这意味着如果无人机A在无人机B的安全区域,那么无人机B也在无人机A的安全区域。您可以在这里跳过第二次检查。正如@Manfred所说:

     for(int i = 0; i < drones.Count - 1; i++)
     {
         for(int j = i + 1; j < drones.Count; j++)
         {
             if (drones[i].SafeAreaContains(drones[j].Location))
                Debug.WriteLine($"{i} joined {j} safe area");
         }
     }
    

    如果无人机可以有不同的安全区域大小:

     for(int i = 0; i < drones.Count; i++)
     {
         for(int j = 0; j < drones.Count; j++)
         {
             if (i == j)
                 continue;
    
             if (drones[i].SafeAreaContains(drones[j].Location))
                Debug.WriteLine($"{i} joined {j} safe area");
         }
     }
    

    最后 - 如果您将Id分配给无人机而不是依赖列表中的索引,那么您的代码可以是

     var intersections = from a in drones
                         from b in drones
                         where a.Id != b.Id && a.SafeAreaContains(b)
                         select new { DroneId = a.Id, InvaderId = b.Id };
    
     foreach(var i in intersections)
         Debug.WriteLine($"{i.InvaderId} joined {i.DroneId} safe area");