创建一个函数来生成平行四边形中的随机点。
希望有人能在这里帮我,我被要求为游戏的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
您可以使用类似于“纹理坐标”的东西,其范围在 [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,v2
,您需要进行向量减法:v1 = B - A
,v2 = 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 定义的平行四边形中
请注意,这将无法与您当前的布局一起使用 - 起点,宽度,高度。这些参数如何处理旋转?
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?
- addEventListener 返回 nil Lua
- Lua中获取用户配置主目录的跨平台方法
- 如何编写 Lua 模式将字符串(嵌套数组)转换为真正的数组?
用伪代码表示:
这将在平行四边形内产生坐标为x,y的随机点。
其思想在于,可以通过指定沿第一条边(a)方向和第二条边(b)方向走多远来指定平行四边形内的每个点。
例如,如果a = 0,b = 0,则不移动并仍停留在起点。
如果a = 1,b = 0,则移动到宽度。 如果a = 1,b = 1,则移动到对角线的另一端。