代码之家  ›  专栏  ›  技术社区  ›  dekz

矢量三角洲和未知区域的移动

  •  1
  • dekz  · 技术社区  · 15 年前

    我需要一些数学上的帮助,我似乎找不到答案,任何链接到文档都会非常感谢。

    这就是我的处境,我不知道我在这个迷宫里的位置,但我需要四处走动,找到回到起点的路。我正在考虑实现一个路径点列表,其中列出了我从0.0开始被抵消的地方。这是一个二维笛卡尔平面。

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

    在给定这两个变量的情况下,如何计算偏移量?每次我走一步,我都能把它存起来。

    我只需要在给定的平移和旋转速度下,用x和y来计算偏移量。旋转到这些点。

    感谢您的帮助。

    2 回复  |  直到 15 年前
        1
  •  4
  •   Beta    15 年前

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

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

    鉴于此, 有一个确切的解决办法 . 首先简单的部分:

    delta_angle = omega * delta_t
    

    ω是角速度。行驶的距离(可能沿着曲线)是

    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))
    

    因为我们希望能够处理非常小的三角角和非常大的半径,所以我们将扩展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
    
        2
  •  1
  •   Troubadour    15 年前

    你可以分两个阶段完成。首先求出方向的变化量,得到新的方向矢量,然后用这个新方向求出新的位置。类似的东西

    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 就是你的速度。

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

    推荐文章