创建一个函数以在平行四边形中生成随机点

时间:2012-02-17 20:31:14

标签: function lua

我希望有人可以在这里帮助我,我被要求为游戏编写Lua脚本的代码。首先,我不是Lua Scripter,我绝对不是数学家。

我需要做的是在平行四边形内生成随机点,因此随着时间的推移,整个平行四边形将被填充。我玩过脚本并且在平行四边形(矩形)上直线上下或90度时取得了一些成功。旋转平行四边形时出现问题。

正如您在图像中看到的那样,通过源自地图区域中心的坐标会使事情变得更糟,并且平行四边形可以定位在地图区域内的任何位置。平行四边形本身由3对坐标定义,start_X和Start_Y,Height_X和Height_Y,最后是Width_X和Width_Y。无论位置或方向如何,生成的随机点都必须在这些坐标的范围内。

Map coordinates and example parallelogram

坐标的一个例子是......

Start_X = 122.226 Start_Y = -523.541

Height_X = 144.113 高度_Y = -536.169

Width_X = 128.089 宽度_Y = -513.825

在我的脚本测试中,我已将小数消除为.5,因为任何较小的小数似乎对最终结果没有影响。同样,实际上,最终使用时,起始宽度和高度可以是任何方向。

有没有人和患者一起解释我需要做些什么来使这项工作,我的数学非常基础,所以请保持温和。

感谢阅读和期待回复。 伊恩

2 个答案:

答案 0 :(得分:0)

在伪代码中

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)

这应该在平行四边形内的坐标x,y处做一个随机点

我们的想法是,平行四边形内的每个点都可以通过说明从第一条边的方向(a)到开始的距离以及在第二条边的方向(b)的距离来指定。

例如,如果你有一个= 0,而b = 0,那么你根本就不动,而且仍处于开始状态。
如果您有一个= 1,并且b = 0,那么您将移动到宽度。 如果你有一个= 1,而b = 1,那你就移到了对面的角落。

答案 1 :(得分:0)

你可以使用类似“纹理坐标”的东西,它们在[0,1]范围内,为平行四边形内的一个点生成X,Y。然后,您可以从范围(u,v)生成随机数[0,1],并获得您想要的随机点。

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

enter image description here

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

要获取向量v1,v2,您需要进行向量减法:v1 = B - Av2 = C - A。当您为随机点u,v生成随机坐标r时,您可以使用此向量公式返回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     

请注意,这不适用于您当前的布局 - 开始,宽度,高度。您希望如何使用这些参数处理旋转?