2D 中的随机方向 lua

Random direction en 2D lua

我想在 Lua 2D 中为我的精灵创建一个随机方向。

所以,我试过了:

Sprite.x = Sprite.x + vx
Sprite.y = Sprite.y + vy

Sprite.vx = math.random(-1,1)
Sprite.vy = math.random(-1,1)

所以,我设法创建了一个随机方向,但我的问题是精灵的速度,与方向的数量直接相关。例如,如果我希望速度为 1,则它只能有 4 个方向。通过将随机速度设置在 -3 和 3 之间,我制作了一个更多的精灵,但它比我想要的要快。

我该怎么办?

我看过一些讨论随机方向的帖子,但描述不是关于 lua 的,我无法真正理解它..

谢谢!

如果我对问题的理解正确,您想为速度选择随机方向,但不希望速度发生变化。为此,您可以为 x- 和 y-directions 选择随机速度分量,然后通过将每个分量除以矢量的大小将其归一化为单位矢量。

此外,math.random(-1, 1) 只会给出 -1、0 或 1 的值。如果您想要更多的方向变化,请使用 math.random() 来获取 [0] 范围内的浮点值, 1).您可以随机选择使分量为负以获得完整的方向谱。

这是一个 returns 一对 vxvy 速度分量的小函数:

function rand_v_dir ()

   vx = math.random()
   vy = math.random()

   norm = math.sqrt(vx * vx + vy * vy)
   vx = vx / norm
   vy = vy / norm

   if math.random(0, 1) == 0 then
      vx = -vx
   end

   if math.random(0, 1) == 0 then
      vy = -vy
   end

   return vx, vy
end

下面是上述函数生成的十个随机速度向量:

> for i = 1, 10 do
vx, vy = rand_v_dir()
print("Velocity: ", vx, vy)
print("Speed: ", math.sqrt(vx * vx + vy * vy))
end

Velocity:   -0.70784982398251   0.70636295676368
Speed:  1.0
Velocity:   -0.28169296961382   -0.95950459658625
Speed:  1.0
Velocity:   0.71839382297246    -0.69563662577168
Speed:  1.0
Velocity:   0.29007205509751    0.9570048081653
Speed:  1.0
Velocity:   -0.40540707321421   0.91413626171807
Speed:  1.0
Velocity:   -0.7236198731718    0.69019872439091
Speed:  1.0
Velocity:   0.31888322750977    0.94779401096069
Speed:  1.0
Velocity:   -0.64427423170525   0.76479455696325
Speed:  1.0
Velocity:   -0.66481241135881   0.74701034644996
Speed:  1.0
Velocity:   -0.65843036923729   0.75264164704463
Speed:  1.0

不过,我们可以做得更好。正如 and 在评论中指出的那样,这种方法给出了偏向角落的方向。一个改进是 select 0 之间的随机角度,并将速度矢量作为单位矢量。然后角度的余弦将是 x-direction 中的速度分量,角度的正弦将是 y-direction 中的分量(测量相对于正 x-axis 的角度).

这种方法还有一个好处是代码更简单:

function rand_polar_dir ()

   dir = 2 * math.pi * (math.random())

   vx = math.cos(dir)
   vy = math.sin(dir)

   return vx, vy
end

这是用第二种方法生成的十个随机速度向量:

> for i = 1, 10 do
vx, vy = rand_polar_dir()
print("Velocity: ", vx, vy)
print("Speed: ", math.sqrt(vx * vx + vy * vy))
end
Velocity:   0.093304068605003   -0.99563766038743
Speed:  1.0
Velocity:   -0.31453683190827   -0.9492452693446
Speed:  1.0
Velocity:   0.72403297094833    0.68976536371416
Speed:  1.0
Velocity:   -0.39261186353618   -0.91970425931962
Speed:  1.0
Velocity:   -0.74523744965918   0.66679917788303
Speed:  1.0
Velocity:   0.15192428057379    -0.98839213522374
Speed:  1.0
Velocity:   0.93666276755405    -0.35023257969239
Speed:  1.0
Velocity:   0.86478573695856    -0.50214104507902
Speed:  1.0
Velocity:   0.64665884247741    -0.7627793530542
Speed:  1.0
Velocity:   0.2877390096936 0.95770886092828
Speed:  1.0

对于上述两种方法,速度向量的大小都是1。如果你想将速度加倍,只需将随机向量乘以2即可。