求两点之间的距离【效率】
Finding the distance between two points [Efficency]
不用全部输入,这里有一张图片供您查看我想要的内容。你知道他们怎么说,一图胜一千字。
我有的是弹丸的p1
、Θ
、d
和速度s
。
速度:
据此我可以使用方程 p1.x * speed
、p1.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|)
但不确定这是否有效。对这个问题的任何建议,只是重复一下:我有变量 theta
、p1
、d
和 t
,我必须找到 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
,您唯一关心的是沿 x
和 y
的相对移动,它由 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。
不用全部输入,这里有一张图片供您查看我想要的内容。你知道他们怎么说,一图胜一千字。
我有的是弹丸的p1
、Θ
、d
和速度s
。
速度:
据此我可以使用方程 p1.x * speed
、p1.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|)
但不确定这是否有效。对这个问题的任何建议,只是重复一下:我有变量 theta
、p1
、d
和 t
,我必须找到 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
,您唯一关心的是沿 x
和 y
的相对移动,它由 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。