Function 创建函数以生成平行四边形中的随机点

Function 创建函数以生成平行四边形中的随机点,function,lua,Function,Lua,我希望有人能在这里帮助我,我被要求为一个游戏的Lua脚本编写一些代码。首先,我不是Lua的编剧,我也不是数学家 我需要做的是在一个平行四边形内生成随机点,随着时间的推移,整个平行四边形都被填满了。我曾经玩过脚本编写,并成功地将平行四边形(矩形)放置在垂直上下或90度的位置上。当平行四边形旋转时,我的问题来了 如图所示,地图区域中心的坐标使情况变得更糟,平行四边形可以放置在地图区域内的任何位置。平行四边形本身由3对坐标定义,即起点X和起点Y、高度X和高度Y以及最后的宽度X和宽度Y。生成的随机点需要

我希望有人能在这里帮助我,我被要求为一个游戏的Lua脚本编写一些代码。首先,我不是Lua的编剧,我也不是数学家

我需要做的是在一个平行四边形内生成随机点,随着时间的推移,整个平行四边形都被填满了。我曾经玩过脚本编写,并成功地将平行四边形(矩形)放置在垂直上下或90度的位置上。当平行四边形旋转时,我的问题来了

如图所示,地图区域中心的坐标使情况变得更糟,平行四边形可以放置在地图区域内的任何位置。平行四边形本身由3对坐标定义,即起点X和起点Y、高度X和高度Y以及最后的宽度X和宽度Y。生成的随机点需要在这些坐标的范围内,而不考虑位置或方向

坐标的一个例子是

起点X=122.226 起始值Y=-523.541

高度X=144.113 高度Y=-536.169

宽度X=128.089 宽度Y=-513.825

在我的脚本测试中,我将小数点减少到了.5,因为任何较小的小数点似乎对最终结果没有影响。此外,在最终使用时,起始宽度和高度可以是任何方向

有没有人和病人一起解释我需要做些什么才能让这项工作正常进行,我的数学很基础,所以请温柔一点

感谢阅读并期待回复。 伪代码中的Ian

a= random number with 0<=a<=1
b= random number with 0<=b<=1
x= Start_X + a*(Width_X-Start_X) + b*(Height_X-Start_X)
y= Start_Y + a*(Width_Y-Start_Y) + b*(Height_Y-Start_Y)

a=random number with 0您可以使用类似“纹理坐标”的东西,它在
[0,1]
范围内,为平行四边形内的点生成X,Y。然后,您可以从范围
[0,1]
生成随机数
(u,v)
,并获得所需的随机点

为了更好地解释这一点,以下是一张图片:

基底由向量
v1
v2
构成。四个点
A、B、C、D
代表平行四边形的角。你可以看到括号中点的“纹理坐标”(我称之为
u,v
),例如
A
(0,0)
D
(1,1)
。平行四边形内的每个点的坐标在
(0,0)
(1,1)
范围内,例如,平行四边形的中心具有坐标
(0.5,0.5)

要获得向量,需要进行向量减法:
v1=B-A
v2=C-A
。当你为一个随机点生成随机坐标
u,v
,你可以用这个向量公式得到X,Y:
r=a+u*v1+v*v2

在Lua中,可以按如下方式执行此操作:

 -- let's say that you have A,B,C,D defined as the four corners as {x=...,y=...}
 -- (actually, you do not need D, as it is D=v1+v2)

 -- returns the vector a+b
 function add(a,b)
   return {x = a.x + b.x, y = a.y + b.y} end
 end
 -- returns the vector a-b
 function sub(a,b)
   return {x = a.x - b.x, y = a.y - b.y} end
 end
 -- returns the vector v1*u + v2*v
 function combine(v1,u,v2,v)
   return {x = v1.x*u + v2.x*v, y = v1.y*u + v2.y*v}
 end
 -- returns a random point in parallelogram defined by 2 vectors and start
 function randomPoint(s,v1,v2)
   local u,v = math.random(), math.random() -- these are in range [0,1]
   return add(s, combine(v1,u,v2,v))
 end

 v1 = sub(B,A) -- your basis vectors v1, v2
 v2 = sub(C,A)
 r = randomPoint(A,v1,v2) -- this will be in your parallelogram defined by A,B,C     

请注意,这将不适用于当前布局-起点、宽度和高度。您想如何使用这些参数处理旋转?

嗨,彼得,谢谢您的回答,但我出生时没有数学头脑,我对前两行感到困惑。你是说a和b可以是0或1,还是我需要在坐标值之间生成一个随机数,比如起点和高度。老实说,我没有得到0,你需要为一个可以是0.0到1.0(例如0.0 0.23,0.7等)范围内的任何数字生成一个随机数。通常有一个标准函数为你这样做,称为math.random()