1

我需要一些我似乎无法找到答案的数学帮助,任何指向文档的链接将不胜感激。

这是我的情况,我不知道我在这个迷宫中的什么位置,但我需要四处走动,找到回到起点的路。我正在考虑实施一个航点列表,其中列出了我从 0,0 开始偏移的地方。这是一个二维笛卡尔平面。

我获得了 2 个属性,我的平移速度从 0-1 和我的旋转速度从 -1 到 1。-1 非常左,+1 非常右。这些是速度而不是角度,所以这就是我的问题所在。如果给我 0 作为翻译速度,给我 0.2 我会不断地以缓慢的速度向右转。

给定这两个变量,我如何计算出偏移量?每次迈出“一步”时,我都可以存储它。

我只需要在给定平移和旋转速度的情况下计算出 x 和 y 项的偏移量。以及到达这些点的轮换。

任何帮助表示赞赏。

4

2 回答 2

4

你的问题有几点不清楚,所以我必须做出一些假设:

  1. 在每个时间间隔内,平移速度和旋转速度是恒定的。
  2. 您知道每个时间间隔中这些变量的值(并且您知道可用单位的旋转速度,例如每秒弧度,而不仅仅是“非常左”)。
  3. 你知道初始航向。
  4. 您可以保持足够的精度,舍入误差不是问题。

鉴于此,有一个确切的解决方案。首先是简单的部分:

delta_angle = omega * delta_t

其中 omega 是角速度。行进的距离(可能沿着曲线)是

dist = speed * delta_t

曲线的半径为

radius = dist / delta_angle

(当角速度接近零时,这会变得很大——我们稍后会处理这个问题。)如果角度(在间隔的开始处)为零,定义为指向 +x 方向,那么在间隔很简单,我们称它为 deta_x_0 和 delta_y_0:

delta_x_0 = radius * sin(delta_angle)
delta_y_0 = radius * (1 - cos(delta_angle))

由于我们希望能够处理非常小的 delta_angle 和非常大的半径,我们将展开 sin 和 cos,并且仅在角速度接近于零时使用它:

dx0 = r * sin(da)     = (dist/da) * [ da - da^3/3! + da^5/5! - ...]
                     =  dist     * [  1 - da^2/3! + da^4/5! - ...]

dy0 = r * (1-cos(da)) = (dist/da) * [ da^2/2! - da^4/4! + da^6/6! - ...]
                     =  dist     * [   da/2! - da^3/4! + da^5/6! - ...]

但是角度通常不等于零,所以我们必须旋转这些位移

dx = cos(angle) * dx0 - sin(angle) * dy0
dy = sin(angle) * dx0 - cos(angle) * dy0
于 2010-05-09T03:11:02.543 回答
1

你可以分两个阶段来做。首先计算出方向的变化,得到一个新的方向向量,然后再用这个新的方向计算出新的位置。就像是

angle = angle + omega * delta_t;

const double d_x = cos( angle );
const double d_y = sin( angle );

x = x + d_x * delta_t * v;
y = y + d_y * delta_t * v;

angle您在每个步骤中存储当前输出的位置。( d_x, d_y) 是当前方向向量,omega是您拥有的旋转速度。delta_t显然是你的时间步长,v是你的速度。

这可能太天真,无法将其分为两个不同的阶段。我不确定我没有真正考虑过太多,也没有测试过,但如果它有效,请告诉我!

于 2010-05-08T09:04:54.437 回答