我有一个向量列表和一个PlayerVector我只是想知道如何找到我的PlayerVector在我的列表中最近的向量。XNA查找最接近的向量从玩家
这里是我的变量:
List<Vector2> Positions;
Vector2 Player;
变量已经声明,所有的,我只需要一个简单的代码,将针对最近的位置,我的播放器进行搜索。没有简单的方法吗?
我有一个向量列表和一个PlayerVector我只是想知道如何找到我的PlayerVector在我的列表中最近的向量。XNA查找最接近的向量从玩家
这里是我的变量:
List<Vector2> Positions;
Vector2 Player;
变量已经声明,所有的,我只需要一个简单的代码,将针对最近的位置,我的播放器进行搜索。没有简单的方法吗?
创建一个名为distanceToPlayer INT,将其设置为0
创建一个名为nearestObject INT它通过所有for循环的对象设置为0
循环。它比foreach循环稍快,在这种情况下更有用。
在循环:
获取与Vector2.Distance的距离,并检查它反对distanceToPlayer,如果少了,然后存储在nearestObject对象的索引号,并存储在distanceToPlayer新的距离。
循环完成后,您将获得整个像素的距离,并且存储列表中项目的索引。您可以使用职位[索引]访问该项目。
一个改进是获得循环内的平方距离,然后一旦你有最小距离,它是平方根。这样你只需要做一次昂贵的平方根操作(如果你需要的话)。 –
因为你并不需要的确切距离(只是一个相对比较),你可以跳过毕达哥拉斯距离公式的平方根步:
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
我从记忆写的,因为我没有访问XNA现:
Vector2 nerrest = Positions.Select(vect => new { distance= vect.Distance(Player), vect})
.OrderBy(x => x.distance)
.First().vect;
小提示: 在这个解决方案,你可能可以使用PLINQ获得的距离计算小加速。
'Vector2.Distance'([MSDN](http://msdn.microsoft.com/en-us/library/bb196336.aspx))可能是一个很好的开始。 –