【问题标题】:XNA Find nearest Vector from playerXNA 查找离玩家最近的向量
【发布时间】:2011-08-03 00:11:14
【问题描述】:

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

这是我的变量:

List<Vector2> Positions;
Vector2 Player;

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

【问题讨论】:

  • Vector2.Distance (MSDN) 可能是一个不错的起点。

标签: c# vector xna


【解决方案1】:

由于您不需要确切的距离(只是相对比较),您可以跳过毕达哥拉斯距离公式中的平方根步骤:

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

【讨论】:

    【解决方案2】:

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

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

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

    在循环中:

    用Vector2.Distance获取距离,与distanceToPlayer对比,如果小于,则将物体的索引号存入nearestObject,新的距离存入distanceToPlayer。

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

    【讨论】:

    • 一个改进是在循环中获得平方距离,然后一旦你有了最小距离,就对其进行平方根。这样,您只需执行一次代价高昂的平方根运算(如果您需要的话)。
    【解决方案3】:

    我是凭记忆写的,因为我现在无法访问 XNA:

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

    小贴士: 在这个解决方案中,您可能可以使用 PLINQ 在距离计算方面获得一点加速。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-06
      • 1970-01-01
      • 2022-01-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多