XNA从播放器中查找最近的矢量

时间:2011-08-03 00:11:15

标签: c# vector xna

我有一个向量列表和一个PlayerVector我只想知道如何在我的列表中找到最接近我的PlayerVector的Vector。

以下是我的变数:

List<Vector2> Positions;
Vector2 Player;

变量已经声明了所有,我只需要一个简单的代码来搜索我的播放器最近的位置。是不是有一个简单的方法?

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:2)

创建一个名为distanceToPlayer的int,将其设置为0。

创建一个名为nearestObject的int,将其设置为0。

使用for循环遍历所有对象。它比foreach循环略快,在这种情况下更有用。

在循环中:

使用Vector2.Distance获取距离,并根据distanceToPlayer进行检查,如果更少,则将对象的索引号存储在nearestObject中,并将新距离存储在distanceToPlayer中。

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

答案 2 :(得分:0)

我是从内存中写的,因为我现在无法访问XNA:

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

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