【问题标题】:Move an object based on acceleration根据加速度移动对象
【发布时间】:2014-04-04 14:40:18
【问题描述】:

我想使用加速算法来改变假设飞行器的速度,以便在 2D 环境中移动它。例如:

positionX = positionX + (speed based on acceleration);
positionY = positionY + (speed based on acceleration);

我的问题是,如果我这样做,结果,假设速度为 50,将是位置 += 50,这是完全错误的,因为我不想使用速度作为 X 移动的数量轴上。我希望速度成为轴数的某种基础。 例如,如果假设速度为 50,而 50 速度意味着每次移动 3 X,那么这意味着

positionX + speed = positionX+3;

我想在代码中创建它以及将速度提高一个百分比的加速方法。 所以我的问题是如何将速度作为参考点。

【问题讨论】:

  • 你需要速度和方向,或者只是简化这个并有两个​​ speex,一个用于 x 轴,另一个用于 Y 轴
  • 我希望速度相同,我已经有一个方向方法,但我想根据速度更改轴位置。我已经实现了所有这些,但使用简单的 x+3 或 y+3,我现在想实现速度
  • 我会使用离散时间步长并且在每一步中: 1. 如果加速度值发生变化,则计算它; 2.速度加加速度; 3.将速度转换为坐标增量(据我了解,您使用不同的单位来表示速度和坐标); 4. 按在步骤 3 中检索到的值增加坐标。顺便说一句,您可能还想计算速度矢量的角度,因为您有两个坐标并按速度值增加它们会产生 sqrt(2) 倍的速度比实际更大(毕达哥拉斯定理)。
  • 现在如果我能在代码中实现它会很棒。老实说,如果您能提供帮助,我将不胜感激,因为我对数学算法一无所知

标签: java performance math


【解决方案1】:

保持简单。物理不难。 “数学”并不比乘法和加法难。

您想要处理随时间增加的速度和位置变化。

位置、速度和加速度是矢量。在您的 2D 世界中,这意味着每个元素在 x 和 y 方向上都有一个分量。

所以如果你增加你的时间:

t1 = t0 + dt

如果速度在该时间增量 dt 内保持恒定,您的位置将像这样变化:

(ux1, uy1) = (ux0, uy0) + (vx0*dt, vy0*dt)

如果加速度在该时间增量 dt 内保持恒定,则速度会这样变化:

(vx1, vy1) = (vx0, vy0) + (ax0*dt, ay0*dt)

如果使用牛顿定律涉及力,请更新您的加速度:

(ax0, ay0) = (fx0/m, fy0/m) 

其中 m 是物体的质量。

在时间步结束时更新位置、速度和加速度并重复。

这假设在步骤开始时使用加速度和速度值是足够准确的。这将限制您使用相对较小的时间步长。 (称为“显式集成”。)

这是一个例子。你在 (x, y) = (0, 0) 有一个大炮,里面有一个质量为 20 lbm 的炮弹。大炮从水平方向向上倾斜 30 度。我们将忽略空气阻力,因此在 x 方向上没有作用在炮弹上的力。只有重力 (-32.2 ft/sec^2) 会作用于 y 方向。

当大炮响起时,它会以 40 英尺/秒的初始速度发射炮弹。 (vx, vy) 分量为 (40*cos(30 度), 40*sin(30 度)) = (34.64 ft/sec, 20 ft/sec)

因此,如果您以 0.1 秒的时间步长插入我们的方程:

(ax0, ay0) = (0, -32.2 ft/sec^2)
(vx1, vy1) = (vx0, vy0) + (ax0, ay0)*dt = (34.64 ft/sec, 20 ft/sec) + (0, -3.22 ft/sec) =  (34.64, 16.78)
(ux1, uy1) = (ux0, uy0) + (vx0, vy0)*dt = (3.464 ft, 1.678 ft)

以这些值作为开始,再采用 0.1 秒的时间步长。冲洗,重复....

您分别对 x 轴和 y 轴执行此操作。

您可以通过使炮弹的初始高度等于炮轮直径的一半来使这一点更加真实。

您可以在 x 方向添加一个小的负加速度来模拟风阻。

假设您的目标在 x 轴的右侧。

如果你用大炮直接向上射击,方程式将显示球向上,在到达顶点时减速,然后直接向下。没有命中,除了你的头和大炮。

如果你在大炮水平的情况下射击,方程式说球在 x 方向上以恒定速度移动,并且只会落到大炮的初始高度。你的敌人会嘲讽你:“气球!气球!”

因此,如果您希望球在目标位置的某个爆炸半径内与地面相交(也就是到达位置 y = 0),您必须使用初始速度和大炮与水平方向的角度.

【讨论】:

  • 好吧,这是非常简单的解释,谢谢。我不在乎质量,所以我们可以忽略它。现在只是为了确保,要在 java 中执行此操作,我基本上必须为 X 轴和 Y 轴单独执行此操作,对吗?还有是否可以告诉我如何找到我自己的 (x,y) 到目标的 (x,y) 的距离?我知道 (myX-targetX)+(myY-targetY) 是错误的,据我所知,我需要对连接两个点的直线的拐角做一些事情,但我不能在 java 中真正做到这一点。
【解决方案2】:

您只需要使用每个轴的运动方程:

x(t)= x0 + v0*t + 1/2*a*t^2 #其中x0是初始位置,v0是初始速度,a是你考虑的加速度,都相对于一个轴

现在您需要定义计算位置的时刻,并按照@markusw 的建议以正确的单位写入速度和加速度的值。

【讨论】:

  • 这就是我想要使用我的问题是在java代码中转换它。老实说,我数学很烂,所以这就是我需要帮助的地方。
  • @user3498565:你不需要 more 数学,一切都在那里。只是不要忘记使用double 0.5 而不是整数除法,并将t 的平方重写为t*t。那么它就是有效的 Java。
【解决方案3】:

像这样:

double calculateSpeed(double value) {
  return value / 16.66;
}

然后这样称呼它:

positionX = positionX + calculateSpeed(50);

【讨论】:

  • 不,因为 50 除以 16.66,实际上是 3
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多