计算避开障碍物的圆angular
我正在制作一个名为Ogar的项目,一个用Node.js编写的Agar.io服务器实现。
这个机器人有一个障碍,一个叫做病毒的绿色尖刺细胞(见插图)。 我需要编程这个机器人,以避免这个障碍,但我没有运气。 由于插图中有很多目标,所以基于更新。
这是我到目前为止的代码。
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
对于这种计算有很多有用的function。 看到这个链接 。
我不需要任何寻路争吵,只是这个简单的避免措施。
有一个替代方法来做你想做的事情。 该方法是使用吸引子来描述系统中的实体。 你的“机器人”是agent
,它有一个位置,它知道世界上其他实体和它们的吸引力。 说你的目的地有+1 attraction
和障碍有-X attraction
,有效地排斥“机器人”( agent
)。
这是一个伪代码的决定:
/** * @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; }
这是一个很大的启发,但是如果你想保持这种逻辑,那么考虑到笛卡尔距离病毒的距离,因为你显然可以访问他们的位置。
该函数是BotPlayer.prototype.getDist
或BotPlayer.prototype.getAccDist
您可以使用一个阈值DIST_MIN
和一个简单的if
或使用像angle/distance
(更好)的函数来减less远程病毒对angular度的影响。