矢量三角洲和移动未知领域

时间:2010-05-08 08:27:56

标签: math vector euclidean-distance

我需要一些小数学帮助,似乎无法找到答案,任何文档链接都会非常感激。

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

我已经获得了2个属性,我的翻译速度从0到1,我的旋转速度从-1到1. -1非常左,+1非常正确。这些是速度而不是角度,这就是我的问题所在。如果我给出0作为翻译速度和0.2我将继续以慢速向右转。

如何根据这两个变量找出偏移量?每次我采取“步骤”,我都可以存储它。

我只需要根据平移和旋转速度计算x和y项的偏移量。和轮换到达那些点。

感谢任何帮助。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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_xd_y)是当前方向向量,omega是您拥有的旋转速度。 delta_t显然是你的时间步,v是你的速度。

将它分成两个不同的阶段可能太天真了。我不确定我是否真的没有考虑过它并且没有测试过它但是如果有效的话请告诉我!