Lua分离导向算法将重叠的房间分组到一个角

Lua分离导向算法将重叠的房间分组到一个角,lua,cell,flock,procedural,Lua,Cell,Flock,Procedural,我正在尝试实现一个地下城生成算法(和),该算法涉及生成相互重叠的随机数个单元。然后将单元推开/分离,然后连接。现在,最初的海报/作者描述说,他正在使用分离导向算法,以便在一个区域上均匀分布单元。我对群集算法和/或分离控制行为没有太多经验,因此我转向谷歌寻求解释(并找到了答案)。我的实现(基于上一篇文章)如下: function pdg:_computeSeparation(_agent) local neighbours = 0 local rtWidth = #self._rooms

我正在尝试实现一个地下城生成算法(和),该算法涉及生成相互重叠的随机数个单元。然后将单元推开/分离,然后连接。现在,最初的海报/作者描述说,他正在使用分离导向算法,以便在一个区域上均匀分布单元。我对群集算法和/或分离控制行为没有太多经验,因此我转向谷歌寻求解释(并找到了答案)。我的实现(基于上一篇文章)如下:

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

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

我的问题是我用零长度标准化速度向量。如果将其规格化,则除以零,结果为NaN

在进行任何进一步计算之前,只需检查速度的长度是否为零,即可解决此问题


我希望这有帮助

嗯,我知道这是个老问题,但我注意到了一些东西,也许它对某些人有用,所以

我认为这里有一个问题:

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
为什么要把这些方程乘以距离? “
(self.\u rooms[\u agent].startX-self.\u rooms[i].startX)
”已包含(平方)距离! 另外,将所有内容乘以“
距离”
”可以修改以前存储在v中的结果! 如果至少将“v.x”放在括号外,结果会更高,normalize函数将修复它。虽然那是一些无用的计算

顺便说一下,我很确定代码应该是这样的:

v.x = v.x + (self._rooms[_agent].startX - self._rooms[i].startX)
v.y = v.y + (self._rooms[_agent].startY - self._rooms[i].startY)
我来举个例子。假设主代理位于(0,0),三个邻居位于(0,-2),(-2,0)和(0,2)。分离转向行为将使主剂朝X轴移动,标准化方向为(1,0)。 让我们只关注结果向量的Y分量

数学应该是这样的:

--Iteration 1
v.y = 0 + ( 0 + 2 )
--Iteration 2
v.y = 2 + ( 0 - 0 )
--Iteration 3
v.y = 2 + ( 0 - 2 )
--Result
v.y = 0
这与我们的理论是一致的。 这就是您的代码所做的:

(note that the distance is always 2)
--Iteration 1
v.y = ( 0 + 0 + 2 ) * 2
--Iteration 2
v.y = ( 4 + 0 - 0 ) * 2
--Iteration 3
v.y = ( 8 + 0 - 2 ) * 2
--Result
v.y = 12
如果我的分离转向行为正确,这就不可能是正确的

(note that the distance is always 2)
--Iteration 1
v.y = ( 0 + 0 + 2 ) * 2
--Iteration 2
v.y = ( 4 + 0 - 0 ) * 2
--Iteration 3
v.y = ( 8 + 0 - 2 ) * 2
--Result
v.y = 12