而不是全部输入,这里有一张图片供您查看我想要的内容。你知道他们说什么,一张图片胜过千言万语。
我拥有的是p1
,Θ
和d
以及速度s
的投射物。
我可以使用公式p2
,p1.x * speed
来推断p1.y * speed
,p2
是|dx| + |dy|
的共同定义。由此我可以使用等式p2
计算距离。
但是,如果我没有获得速度,我怎么能仅使用Θ
,p1
和d
来计算 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|)
,theta
,p1
和d
,我必须找到t
。
效率>>>精度
答案 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)
你知道他们说什么,一张图片胜过千言万语。
答案 2 :(得分:0)
如果你想要效率,那么实际上比使用trig操作要好得多。基本上,由于您已经拥有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]
HashMap
查找和乘法比单个触发操作更有效。初步测试让我加速了~10倍,但YMMV。