如果给定时间,我如何编写一个从point1移动到point2的函数?
例如:
Point move(Point point1, Point point2, long timeInMilliseconds, int speedPerSecond)
{
// basic stuff
int pointsMoved = speedPerSecond * 1000 / timeInMilliseconds;
if (point1.x == point2.x && point1.y > point2.y)
return (new Point(point1.x, Math.min(point2.y, point1.y + pointsMoved)));
...
}
是的,这就是我悲伤的数学技能结束的地方。 如果运动不是对角线或垂直,我该如何移动?如果有角度?
顺便说一句,我打算根据point1和point2重新计算当前点,我不会从调用者那里更新point1和point2,所以调用者看起来像这样:
Point currentPoint = move(originalPoint, finalPoint, getCurrentTime() - originalTime, 10);
该功能的签名不一定是我提到的。它可以很好地使用度数,但如果我必须使用度数,这将是另一件事。
答案 0 :(得分:3)
以下是一般动作公式:
p =k⟨p 2 - p 1 ⟩+ p 1
p 1 是初始位置。 p 2 是最终位置。 p 是当前位置。 k 是一个比率,通常介于0和1之间,用于确定我们覆盖的p 2 的距离。
您的函数接收 t n ,当前时间, v ,来自p 1 的速度到p 2 。因此,我们需要一个额外的部分来计算k:从p 1 到p 2 的距离。 t n 以时间单位( t ),距离| p 2 - p 1 |是以距离为单位( d ),速度是每时间单位的距离( d / t )。 k是无单位的,所以我们必须中和三个值中的单位。
d /( d / t )/ t
= d / d · t / t
= 1
我们的单位被中和了。
所以我们有:
k = | p 2 - p 1 | / v / t n
通过毕达哥拉斯定理很容易确定距离,给我们k。从那里我们将通用公式分解为其组成部分:
p x = k(x 2 - x 1 )+ x 1
p y = k(y 2 - y 1 )+ y 1
k,尽管包含具有组件的元素,但仍然是无单元的,不会被分解。