问题:在笛卡尔坐标系中以恒定速度沿直线移动对象(仅限x,y)。更新率不稳定。移动速度必须接近精确,物体必须非常靠近目的地。该行的来源和目的地可能在任何地方。
给定:源地址和目标地址(x0,x1,y0,y1)和任意值的速度。
一个帮助:关于这个问题,SO有一个答案,这很好,但是它假定花费了总的旅行时间。
这是我得到的:
x0 = 127;
y0 = 127;
x1 = 257;
y1 = 188;
speed = 127;
ostrich.x=x0 //plus some distance along the line;
ostrich.y=y0 // plus some distance along the line;
//An arbitrarily large value so that each iteration increments the distance a minute amount
SPEED_VAR = 1000;
xDistPerIteration = (x1 - x0) / SPEED_VAR;
yDistPerIteration = (y1 - y0) / SPEED_VAR;
distanceToTravel = ;//Pythagorean theorum
limitX = limit1 = 0; //determines when to stop the while loop
//get called 40-60 times per second
void update(){
//Keep incrementing the ostrich' location
while (limitX < speed && limitY < speed) {
limitX += Math.abs(xDistPerIteration);
limitY += Math.abs(yDistPerIteration);
ostrich.x += xDistPerIteration;
ostrich.y += yDistPerIteration;
}
distanceTraveled -= Math.sqrt(Math.pow(limitX, 2) + Math.pow(limitY, 2));
if (distanceTraveled <=0)
//ostrich arrived safely at the factory
}
此代码完成了工作,但它在CPU密集型程序中仅占用了18%的程序时间。它是垃圾,编程和性能方面。关于该怎么做的任何想法?
答案 0 :(得分:2)
一个帮助:有一个答案 关于这一点,这很好, 但它假设总时间 花在旅行上。
救援的基本物理
旅行所花费的总时间=距离/速度
btw Math.hypot(limitX,limitY)
比Math.sqrt(Math.pow(limitX, 2) + Math.pow(limitY, 2))
虽然真的是while循环你应该重构
答案 1 :(得分:1)
要改进的一件事是:
无需在每次调用更新函数时计算平方根。您可以改为使用平方distanceTraveled
。
同样地,Math.abs(xDistPerIteration)
和Math.abs(yDistPerIteration)
在每次更新调用时都不会更改,您可以保存这些值并去掉对绝对值函数的调用,以便稍微保存一点计算时间。
答案 2 :(得分:1)
Update
每秒被召唤40-60次,对吗?换句话说,每帧一次。那么为什么里面有一个while
循环呢?
此外,每帧执行sqrt
一次,pow
两次,不需要每帧。
只需让d2
为距离平方,并在limitX*limitX+limitY*limitY
超过它时停止。