如何检查圆形表在扩大时不会发生碰撞

我有一个通过添加随机的x、y和半径r(半径)创建的表,用于绘制圆形。首先,它们会被测试以确保新圆形不会与现有圆形重叠。然后这些圆形慢慢地随着时间的推移而增长。我正在尝试解决如何测试我的环形表,以便在它们增长到相交的时候进行检测。

我无法找到一种方式来测试第一个圆形与表中的所有其他圆形,然后测试第二个圆形与所有剩余的圆形等等,以消除任何重叠。

从这里开始,但实现起来的问题很大,在最好的情况下只会将自身与下一个圆形进行比较,但在表的末尾崩溃。

local function newRing()
    while true do -- 无限循环来创建新的环形
        for i, v in ipairs(rings) do
          --[[ 对表中所有环进行碰撞计算,直到检测到碰撞使用勾股定理计算距离]]
            if not collides then
               rX= v.x
               rY = v.y
               rR = v.r
            local dx = rX - rings[i+1].x
            local dy = rY - rings[i+1].y
            local distCalc = dx * dx + dy * dy
            if distCalc <= ((rings[i+1].r + ringWidth) + (rR + ringWidth))^2 then
                collides = true
                break -- 一旦发现一个碰撞,重新启动while循环
            end -- end if distCalc block
        end -- i,v block
          break
      end -- end if not collides block
    end -- end while loop
  end
点赞
用户6834680
用户6834680

移除所有碰撞的圆环

for k = #rings, 1, -1 do
   local rX = rings[k].x
   local rY = rings[k].y
   local rR = rings[k].r
   local collides
   for j = k + 1, #rings do
      local dx = rX - rings[j].x
      local dy = rY - rings[j].y
      local distCalc = dx * dx + dy * dy
      if distCalc <= ((rings[j].r + ringWidth) + (rR + ringWidth))^2 then
         collides = true
         break
      end
   end
   if collides then
      -- 在这里执行某些操作(从屏幕上删除ring[k],等等)
      table.remove(rings, k)
   end
end
2017-08-08 07:11:51