2012-02-17 189 views
0

我希望有人能帮助我,我被要求为一个游戏编写一些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 Height_Y = -536.169

Width_X = 128.089 Width_Y = -513.825

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

有没有人与病人解释我需要做些什么来得到这个工作,我的数学是非常基本的,所以请温柔。

感谢您的阅读和预期的答复。 伊恩

回答

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)的方向走多远。

例如,如果您有a = 0和b = 0,那么您根本不会移动并仍处于开始位置。
如果你有a = 1,b = 0,那么你移动到宽度。 如果你有a = 1,b = 1,那么你移动到对面的角落。

+0

嗨,彼得,谢谢你的回复,但我没有在出生时得到一个数学头的幸运,我对前两行感到困惑。 你是说a和b可以是0或1,或者我需要在坐标值之间生成一个像start_x和height_x之间的随机数。诚实地说,我没有得到0 <= a <= 1位,请你解释一下。 – Ian 2012-02-18 10:27:25

+0

您需要为一个可以是0.0到1.0范围内的任意数字(例如0.0 0.23,0.7等)的随机数产生一个随机数。通常有一个标准函数为您执行此操作,如math.random() – 2012-02-19 09:41:33

0

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

为了解释这更好,这里是一个图:

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 - A,v2 = C - A。当为随机点r生成随机坐标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  

注意,这不会影响您当前的布局工作 - 开始,宽度,高度。你想如何处理这些参数的旋转?