gpt4 book ai didi

Lua Separation Steering 算法将重叠的房间分成一个角

转载 作者:行者123 更新时间:2023-12-01 05:19:12 25 4
gpt4 key购买 nike

我正在尝试实现一个地牢生成算法( presented heredemo-ed here ),该算法涉及生成随机数量的相互重叠的单元格。然后将电池推开/分离,然后连接。现在,原发帖者/作者描述他正在使用分离指导算法,以便在一个区域内均匀分布单元格。我对植绒算法和/或分离转向行为没有太多经验,因此我转向谷歌寻求解释(并找到 this )。我的实现(基于最后提到的文章)如下:

function pdg:_computeSeparation(_agent)
local neighbours = 0
local rtWidth = #self._rooms
local v =
{
x = self._rooms[_agent].startX,
y = self._rooms[_agent].startY,
--velocity = 1,
}

for i = 1, rtWidth do
if _agent ~= i then
local distance = math.dist(self._rooms[_agent].startX,
self._rooms[_agent].startY,
self._rooms[i].startX,
self._rooms[i].startY)
if distance < 12 then
--print("Separating agent: ".._agent.." from agent: "..i.."")
v.x = (v.x + self._rooms[_agent].startX - self._rooms[i].startX) * distance
v.y = (v.y + self._rooms[_agent].startY - self._rooms[i].startY) * distance
neighbours = neighbours + 1
end
end
end


if neighbours == 0 then
return v
else
v.x = v.x / neighbours
v.y = v.y / neighbours
v.x = v.x * -1
v.y = v.y * -1
pdg:_normalize(v, 1)
return v
end
end

self._rooms 是一个表格,其中包含房间在网格中的原始 X 和 Y 位置,以及它的宽度和高度(endX,endY)。

问题是,它不是在网格上整齐地排列单元格,而是将重叠的单元格移动到从 1,1 到距离+2,距离+2( as seen in my video [youtube] )的区域中

我试图理解为什么会发生这种情况。

如果需要,这里我解析网格表,分离并填充分离后的单元格:
function pdg:separate( )
if #self._rooms > 0 then
--print("NR ROOMS: "..#self._rooms.."")

-- reset the map to empty
for x = 1, self._pdgMapWidth do
for y = 1, self._pdgMapHeight do
self._pdgMap[x][y] = 4
end
end

-- now, we separate the rooms
local numRooms = #self._rooms
for i = 1, numRooms do
local v = pdg:_computeSeparation(i)
--we adjust the x and y positions of the items in the room table
self._rooms[i].startX = v.x
self._rooms[i].startY = v.y
--self._rooms[i].endX = v.x + self._rooms[i].endX
--self._rooms[i].endY = v.y + self._rooms[i].endY
end


-- we render them again
for i = 1, numRooms do
local px = math.abs( math.floor(self._rooms[i].startX) )
local py = math.abs( math.floor(self._rooms[i].startY) )

for k = self.rectMinWidth, self._rooms[i].endX do
for v = self.rectMinHeight, self._rooms[i].endY do
print("PX IS AT: "..px.." and k is: "..k.." and their sum is: "..px+k.."")
print("PY IS AT: "..py.." and v is: "..v.." and their sum is: "..py+v.."")
if k == self.rectMinWidth or
v == self.rectMinHeight or
k == self._rooms[i].endX or
v == self._rooms[i].endY then
self._pdgMap[px+k][py+v] = 1
else
self._pdgMap[px+k][py+v] = 2
end
end
end
end
end

最佳答案

我也实现了这个生成算法,我或多或少遇到了同样的问题。我所有的矩形都出现在左上角。

我的问题是我正在归一化长度为零的速度向量。如果将这些归一化,则除以零,结果为 NaN。

您可以通过简单地检查您的速度长度是否为零来解决此问题,然后再将其用于任何进一步的计算。

我希望这有帮助!

关于Lua Separation Steering 算法将重叠的房间分成一个角,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17819658/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com