JavaScript:函数返回最接近的值

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JavaScript:函数返回最接近的值相关的知识,希望对你有一定的参考价值。

我试图将最近的对象的值返回到函数中的位置。

我试图将实体放在一个数组中,而不是尝试使用for循环将最近的对象返回到我的位置,但它不起作用。我怎样才能做到这一点?

function getMyEntity() {
  return Game.currentGame.world.localPlayer.entity.getFromTick();
}

function getOtherEntity() {
  var MyPlayerEntity = getMyEntity();

  var entities = Game.currentGame.world.entities;
  for (var uid in entities) {
    // how i get closest entity to my player entity here?
    var gameObject = entities[uid].fromTick;

    console.log(entities[uid].fromTick.position, MyPlayerEntity.position)
    if (gameObject.entityClass == "Prop" && gameObject.uid !== MyPlayerEntity.uid) {
      return gameObject;
    }
  }
}

function aimAssist() {
  var MyPlayerEntity = getMyEntity();
  var OtherEntity = getOtherEntity();
  if (OtherEntity == undefined) return

  var aimPosition = {
    x: OtherEntity.position.x - MyPlayerEntity.position.x,
    y: OtherEntity.position.y - MyPlayerEntity.position.y
  }
  return aimPosition;
}
答案

我会给你一个糟糕的建议,因为现在它会起作用,因为游戏的增长会因为O(n ^ 2)的复杂性而变坏。阅读有关四叉树的信息,看看你是否能做到这一点。同时你可以比较欧氏距离,不需要取平方根:

Object.keys(entities)
.map(function(d,i){
  var dx = entities[d].fromTick.position.x - MyPlayerEntity.position.x, 
       dy = entities[d].fromTick.position.y - MyPlayerEntity.position.y,
       result = {D:(dx * dx) + (dy + dy), obj:entities[d] , valueOf: function(){return this.D};
  return result;
}).sort(function(a,b){
    return a-b;
})[0].obj; //this returns the closest one

所以你原来的功能变成了:

function getOtherEntity() {
  var MyPlayerEntity = getMyEntity();

  var entities = Game.currentGame.world.entities;
  return Object.keys(entities)
    .map(function(d,i){
      var dx = entities[d].fromTick.position.x - MyPlayerEntity.position.x, 
           dy = entities[d].fromTick.position.y - MyPlayerEntity.position.y,
           result = {D:(dx * dx) + (dy + dy), obj:entities[d] , valueOf: function(){return this.D};
      return result;
    }).sort(function(a,b){
        return a-b;
    })[0].obj; //this returns the closest one
}
另一答案

我将创建一个包含Object-ID和distance的对象数组,并按距离对其进行排序。第一个数组项最接近玩家。

该阵列可能看起来像[{uid: 1234, distance: 12}, {uid: 1235, distance: 16}, ...]

您可以使用arrayName.sort(sortingFunction)对数组进行排序

另一答案

假设您可以从gameObject.positionMyPlayerEntity.position获得x和y坐标,您可以使用一些Pitagoras:c ^ 2 = a ^ 2 + b ^ 2,其中c是距离

let a = gameObject.position.x - MyPlayerEntity.position.x;
let b = gameObject.position.y - MyPlayerEntity.position.y;
let distanceSquared = a*a + b*b;

由于您似乎不需要精确的距离并且sqrt()很昂贵,您可以使用distanceSquared中的值以及在循环外部声明的其他变量来跟踪

let closestDistance;
let closest;

进行适当的比较

if(distanceSquared < closestDistance){
    closestDistance = distanceSquared;
    closest = gameObject;
}

循环遍历数组后,最接近的实体引用应为:

return closest;

以上是关于JavaScript:函数返回最接近的值的主要内容,如果未能解决你的问题,请参考以下文章

在数组中查找匹配或最接近的值

Math.round() 函数返回一个数字四舍五入后最接近的整数。

二叉搜索树遍历 - 查找最接近的值

C++:查找数组中最接近的值

Java:查找最接近特定负数的数组列表中的值

组件&Props