找到两点之间的距离[效率]

时间:2015-01-24 21:01:52

标签: java performance math

而不是全部输入,这里有一张图片供您查看我想要的内容。你知道他们说什么,一张图片胜过千言万语。

img

我拥有的是p1Θd以及速度s的投射物。

速度

我可以使用公式p2p1.x * speed来推断p1.y * speedp2|dx| + |dy|的共同定义。由此我可以使用等式p2计算距离。

距离

但是,如果我没有获得速度,我怎么能仅使用Θp1d来计算 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 {
{1}} {
{1}}

不确定这是否有效。对此问题的任何建议,只是重复:我有变量s = t(|dx| + |dy|)thetap1d,我必须找到t

效率>>>精度

3 个答案:

答案 0 :(得分:1)

如果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中的角度。

答案 1 :(得分:0)

  

你知道他们说什么,一张图片胜过千言万语。

enter image description here

答案 2 :(得分:0)

如果你想要效率,那么实际上比使用trig操作要好得多。基本上,由于您已经拥有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]

HashMap查找和乘法比单个触发操作更有效。初步测试让我加速了~10倍,但YMMV。