求两点之间的距离【效率】

Finding the distance between two points [Efficency]

不用全部输入,这里有一张图片供您查看我想要的内容。你知道他们怎么说,一图胜一千字

我有的是弹丸的p1Θd和速度s

速度:

据此我可以使用方程 p1.x * speedp1.y * speed 推导出 p2,它们是 p2 的坐标。由此我可以使用方程 |dx| + |dy|.

计算距离

距离

但是,如果我没有速度,我怎么能仅使用 Θp1 和 [=13= 来计算 p2 的坐标]?


还有其他最有效的方法吗?


 public double getDistanceTraveled() {
    return Math.abs(x - oldX) + Math.abs(y - oldY); 
 }  //use Manhattan aproach as it is more efficent than Euclidean
 public double getSpeed() {
    return getDistanceTraveled() / level.TICKS_PER_SECOND; 
 }

是我目前正在使用的。我意识到我有可变时间,所以我能够使用这种方法推断出 p2

d = |dx| + |dy|
d = s / t
s = t(|dx| + |dy|)

但不确定这是否有效。对这个问题的任何建议,只是重复一下:我有变量 thetap1dt,我必须找到 p2

效率 >>> 准确度

如果theta是直线与y-axis的夹角。
然后你可以用下面的公式计算它。
令 P1 为点 (p1x, p1y)。 P2 是点 (p2x, p2y)

p2x = p1x + d * sin(theta)
p2y = p1y + d * cos(theta)

如果您使用 Math.sin(theta),请记住 theta 应该在 radians 中。您可以使用 Math.toRadian(degree)radians 中获取角度。

You know what they say, a picture is worth a thousand words.

如果你想要效率,实际上有比使用三角运算更好的方法。基本上,由于您已经有了 d,您唯一关心的是沿 xy 的相对移动,它由 theta 定义。

知道这一点,只需将单位向量存储在哈希图中所需的任何粒度并乘以 d

就很简单了

确定粒度后,只需像这样预先计算 HashMap

{0: [1, 0],
 0.01: [0.99, 0.001], etc...
}

然后四舍五入输入的数字,请参阅 this 问题以了解有关确保它符合您的粒度的详细信息。那么计算就是(伪代码):

x = p1[0] + d * <HashMap>.getKey(angle)[0]
y = p2[1] + d * <HashMap>.getKey(angle)[1]

A HashMap 查找和乘法甚至比单个三角运算更有效。初步测试使我获得了 ~10 倍的加速,但 YMMV。