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