我希望有人可以在这里帮助我,我被要求为游戏编写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,因为任何较小的小数似乎对最终结果没有影响。同样,实际上,最终使用时,起始宽度和高度可以是任何方向。
有没有人和患者一起解释我需要做些什么来使这项工作,我的数学非常基础,所以请保持温和。
感谢阅读和期待回复。 伊恩
答案 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]
,并获得您想要的随机点。
为了更好地解释这一点,这是一张图片:
基数由向量v1
和v2
组成。四个点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
。当您为随机点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
请注意,这不适用于您当前的布局 - 开始,宽度,高度。您希望如何使用这些参数处理旋转?