问题:在笛卡尔坐标系(仅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%。就程序和性能而言,这是垃圾。有什么想法在这里做什么?
救援基本物理学
花费的总旅行时间=距离/速度
顺便说一句Math.hypot(limitX,limitY)比Math.sqrt(Math.pow(limitX, 2) + Math.pow(limitY, 2))
Math.hypot(limitX,limitY)
Math.sqrt(Math.pow(limitX, 2) + Math.pow(limitY, 2))
虽然实际上是while循环中您应该重构