Java 一种沿直线匀速移动鸵鸟的有效算法

Java 一种沿直线匀速移动鸵鸟的有效算法,java,algorithm,performance,Java,Algorithm,Performance,问题:在笛卡尔坐标系中以恒定速度沿直线移动对象(仅限x,y)。更新速度不稳定。移动速度必须接近精确,物体必须非常接近目的地。线路的来源和目的地可能在任何地方 给定:源地址和目标地址(x0、x1、y0、y1)以及任意值的速度 助理:关于这一点,SO上有一个答案,这是好的,但它假定花费在旅行上的总时间是给定的 以下是我得到的: x0=127; y0=127; x1=257; y1=188; 速度=127; ostrich.x=x0//加上沿线的一些距离; 鸵鸟。y=y0//加上沿着线路的一些距离;

问题:在笛卡尔坐标系中以恒定速度沿直线移动对象(仅限x,y)。更新速度不稳定。移动速度必须接近精确,物体必须非常接近目的地。线路的来源和目的地可能在任何地方

给定:源地址和目标地址(x0、x1、y0、y1)以及任意值的速度

助理:关于这一点,SO上有一个答案,这是好的,但它假定花费在旅行上的总时间是给定的

以下是我得到的:

x0=127;
y0=127;
x1=257;
y1=188;
速度=127;
ostrich.x=x0//加上沿线的一些距离;
鸵鸟。y=y0//加上沿着线路的一些距离;
//任意大的值,以便每次迭代都将距离增加一分钟
速度=1000;
xdisperativation=(x1-x0)/SPEED_VAR;
Y气流速度=(y1-y0)/速度值;
距离旅行=//毕达哥拉斯定理
limitX=limit1=0//确定何时停止while循环

//每秒被呼叫40-60次 无效更新(){ //不断增加鸵鸟的位置 while(limitX 拯救地球的基础物理学

行驶总时间=距离/速度

顺便说一句,Math.hypot(limitX,limitY)
比Math.sqrt(Math.pow(limitX,2)+Math.pow(limitY,2))快。


虽然实际上while循环需要重构,但需要改进的一点是:

不需要在每次调用update函数时计算平方根。您可以使用平方
distanceTraveled


类似地,
Math.abs(xDistpublation)
Math.abs(yDistpublation)
不要在每次调用更新时都更改,您可以保存这些值并取消对绝对值函数的调用,以节省更多的计算时间。

update
每秒调用40-60次,对吗?换句话说,每帧调用一次。那么为什么在它内部有
循环呢

此外,每帧执行
sqrt
一次和
pow
两次也是不必要的。
只要将距离的平方设为
d2
就行了,当
limitX*limitX+limitY*limitY
超过时就停下来。

这要么是作业,要么是你在一家养有训练有素的鸵鸟的动物园里工作:-)你说的“一条斜率变化的直线”是什么意思?@paxdiablo-Nah,不是HW。我的MS程序没有指定有趣的问题。@takteek指出。你能至少把这个答案链接起来,这样我们就可以看到它是如何被使用/修改的吗?我知道一个更有效的算法——等等,你是说鸵鸟还是鸸鹋?我已经用了几百次了。哇。@farm Math.pow(x,2)也比(x*x)慢得多(不过这取决于底层实现,有些人会检查exp arg中的低整数值并对其进行优化,但不要指望它)谢谢你的提示。一切都很好。我不敢相信我错过了……我得了1-3分,但距离/速度比我差一点。谢谢你的指点。都是真的。不过,环路才是杀手。 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 }