我想看看红色无人机是否进入绿色无人机的安全区域,反之亦然。 我的问题是调试显示drone0进入drone1安全区域而drone1进入drone0安全区域。我只想检查一次。
如何排除重复,所以我只需要检查一次?
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的安全区域
答案 0 :(得分:3)
您只需要修改循环,这适用于您不需要重复条件的任何组合:
for(int i = 0; i < drone.Length - 1; i++)
{
for(int j = i+1; j < drone.Length; j++)
{
// etc.
上面的循环将限制i
和j
的迭代,以便j
总是大于i
,因此您也可以删除if (i == j) continue;
。< / p>
与您的问题没有直接关系的几个笔记。
答案 1 :(得分:0)
无人机课程:
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");