2011-08-03 39 views
1

我有一个向量列表和一个PlayerVector我只是想知道如何找到我的PlayerVector在我的列表中最近的向量。XNA查找最接近的向量从玩家

这里是我的变量:

List<Vector2> Positions; 
Vector2 Player; 

变量已经声明,所有的,我只需要一个简单的代码,将针对最近的位置,我的播放器进行搜索。没有简单的方法吗?

+0

'Vector2.Distance'([MSDN](http://msdn.microsoft.com/en-us/library/bb196336.aspx))可能是一个很好的开始。 –

回答

2

创建一个名为distanceToPlayer INT,将其设置为0

创建一个名为nearestObject INT它通过所有for循环的对象设置为0

循环。它比foreach循环稍快,在这种情况下更有用。

在循环:

获取与Vector2.Distance的距离,并检查它反对distanceToPlayer,如果少了,然后存储在nearestObject对象的索引号,并存储在distanceToPlayer新的距离。

循环完成后,您将获得整个像素的距离,并且存储列表中项目的索引。您可以使用职位[索引]访问该项目。

+1

一个改进是获得循环内的平方距离,然后一旦你有最小距离,它是平方根。这样你只需要做一次昂贵的平方根操作(如果你需要的话)。 –

7

因为你并不需要的确切距离(只是一个相对比较),你可以跳过毕达哥拉斯距离公式的平方根步:

Vector2? closest = null; 
var closestDistance = float.MaxValue; 
foreach (var position in Positions) { 
    var distance = Vector2.DistanceSquared(position, Player); 
    if (!closest.HasValue || distance < closestDistance) { 
     closest = position; 
     closestDistance = distance; 
    } 
} 


// closest.Value now contains the closest vector to the player 
0

我从记忆写的,因为我没有访问XNA现:

Vector2 nerrest = Positions.Select(vect => new { distance= vect.Distance(Player), vect}) 
    .OrderBy(x => x.distance) 
    .First().vect; 

小提示: 在这个解决方案,你可能可以使用PLINQ获得的距离计算小加速。