首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用避障法计算转角

用避障法计算转角
EN

Stack Overflow用户
提问于 2016-03-21 14:28:15
回答 2查看 430关注 0票数 1

我正在为一个名为Ogar的项目制作一个机器人,这是一个用Agar.io编写的Node.js服务器实现。

这个机器人有一个障碍,一个叫做病毒的绿色尖峰细胞(见图)。我需要给这个机器人编程以避免那个障碍,但我没有运气。由于有许多目标,如在插图中,它是基于更新。

这是我到现在为止得到的代码。

代码语言:javascript
复制
BotPlayer.prototype.avoidObstacles = function(cell, angle) {
    // Sum up all of the vector angles of obstacles to cell and react against it
    var angleSum = 0;
    var collided = this.collisionFromList(cell, this.obstacles);
    if (collided.length == 0) return angle; // Not to return NaN

    for (var i = 0; i < collided.length; i++) {
        angleSum += this.angle(cell.position, collided[i].position);
    }

    angleSum /= collided.length; // Average out the angle sum

    // TODO: Find closest available edge
    angleSum += Math.PI / 2;

    return angle + angleSum;
};

在大多数情况下,这是可行的,但机器人有时完全忽略了障碍(this.collisionFromList(cell, this.obstacles);是非常好的),并最终真的通过它(爆炸成许多细胞)。

对于这类计算,BotPlayer.prototype有许多有用的函数。见此链接

我不需要任何找路的争吵,只是这个简单的避免措施。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-03-21 15:07:55

对于你想要做的事情,有一种替代的方法。方法是使用吸引子来描述系统中的实体。你的“机器人”是agent,它有一个位置,它知道世界上其他的实体和它们的吸引力。假设你的目的地有+1 attraction力,障碍有-X attraction力,有效地击退了"bot“(agent)。

下面是一个决策伪代码:

代码语言:javascript
复制
/**
* @param {Array.<{position:Vector2, attraction:Number}>} entities
*/
Agent.prototype.calculateDirectionVector = function(entities){
    var agentPosition = this.position;
    var result = new Vector2(0,0);

    entities.forEach(function(entity){
         //calculate separation between agent and entity
         var displacement = entity.position.clone().sub(agentPosition);
         //figure out distance between entities
         var distance = displacement.length();
         //dampen influence of attraction linearly with distance
         var influence = entity.attraction/distance;
         //produce force vector exerted by this entity on the agent
         var force = displacement.normalize().multiplyScalar(influence);
         //add up forces on the entity
         result.add(force);
    });

    //normalize the resulting vector
    result.normalize();

    return result;
}
票数 1
EN

Stack Overflow用户

发布于 2016-03-21 14:46:51

这是一个很大的启发,但如果你想保持这种逻辑,然后考虑考虑笛卡尔距离病毒,因为你显然可以进入他们的位置。

函数为BotPlayer.prototype.getDistBotPlayer.prototype.getAccDist

您可以使用阈值DIST_MIN和简单的if,或者使用类似angle/distance的函数(更好)来减少远程病毒对角度的影响。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36133714

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档