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 一对 vx
和 vy
速度分量的小函数:
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 和 2π 之间的随机角度,并将速度矢量作为单位矢量。然后角度的余弦将是 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即可。
我想在 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 一对 vx
和 vy
速度分量的小函数:
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
不过,我们可以做得更好。正如
这种方法还有一个好处是代码更简单:
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即可。