创建一个函数来生成平行四边形中的随机点。

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

我需要做的是在平行四边形内生成随机点,因此随着时间的推移,整个平行四边形将被填满。我已经尝试了脚本,并在直立或者在90度上放置的平行四边形(矩形)上取得了一些成功。当平行四边形被旋转时,我的问题就出现了。

正如您在这张图片中看到的,坐标源自地图面积的中心,并且平行四边形可以放置在地图面积的任何位置。平行四边形本身由3对坐标定义,即Start_X和Start_Y,Height_X和Height_Y以及Width_X和Width_Y。生成的随机点需要在这些坐标的范围内,无论位置或方向如何。

地图坐标和示例平行四边形

坐标示例为…

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,因为任何更小的数似乎对最终结果没有影响。而在实际使用中,起始宽度和高度可能以任何方向存在。

是否有人有耐心解释我需要做什么才能使它正常运行,我的数学相当基础,请温柔点。

谢谢阅读和期待回复。 Ian

原文链接 https://stackoverflow.com/questions/9334970

点赞
stackoverflow用户1139393
stackoverflow用户1139393

用伪代码表示:

a= 0<=a<=1的随机数
b= 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,则移动到对角线的另一端。

2012-02-17 20:36:54
stackoverflow用户221509
stackoverflow用户221509

您可以使用类似于“纹理坐标”的东西,其范围在 [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 - Av2 = C - A。当您为随机点 r 生成随机坐标 u,v 时,您可以使用此向量公式获取 X,Y:r = A + u*v1 + v*v2

在 Lua 中,您可以这样做:

-- 假设您将 A、B、C、D 定义为四个角落,如 {x=...,y=...}
--(事实上,您不需要 D,因为 D=v1+v2)

-- 返回向量a+b
function add(a,b)
  return {x = a.x + b.x, y = a.y + b.y}end
end
-- 返回向量a-b
function sub(a,b)
  return {x = a.x - b.x, y = a.y - b.y}end
-- 返回向量 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
-- 返回由 2 个向量和起点确定的平行四边形中的随机点
function randomPoint(s,v1,v2)
  local u,v = math.random(), math.random()-- 这些在范围 [0,1] 中
  return add(s, combine(v1,u,v2,v))
end

v1 = sub(B,A)-- 您的基于 v1、v2 的向量
v2 = sub(C,A)
r = randomPoint(A,v1,v2)-- 这将在由 A,B,C 定义的平行四边形中

请注意,这将无法与您当前的布局一起使用 - 起点,宽度,高度。这些参数如何处理旋转?

2012-02-18 10:06:21