如何检查 Table 个圆圈在长大时不会发生碰撞
How to Check Table of Circles don't collide as they grow
我有一个 table,它是通过添加随机的 x、y 和 r(半径)创建的,我用它来画圆。首先对它们进行测试以确保新圆圈不会与现有圆圈重叠。随着时间的推移,这些圆圈会慢慢变大。我正在尝试弄清楚如何测试我的戒指 table 何时它们长得如此之大以至于它们相交。
我无法找到一种方法来测试第一个与 table 中的所有其他人,然后是第二个与所有剩余的人等。删除任何重叠。
从这个开始,但意识到它充其量不会工作,它只会将自己与下一个圆进行比较,但在 table 结束时崩溃。
local function newRing()
while true do -- infinite loop to create new rings
for i, v in ipairs(rings) do
--[[ collision calculations on all rings in table until a collision
is detected using Pythagoras to calculate distance]]
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 -- restarts while loop once one collision is found
end -- end if distCalc block
end -- i,v block
break
end -- end if not collides block
end -- end while loop
end
-- remove all collided rings
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
-- do something here (erase ring[k] from the screen, etc.)
table.remove(rings, k)
end
end
我有一个 table,它是通过添加随机的 x、y 和 r(半径)创建的,我用它来画圆。首先对它们进行测试以确保新圆圈不会与现有圆圈重叠。随着时间的推移,这些圆圈会慢慢变大。我正在尝试弄清楚如何测试我的戒指 table 何时它们长得如此之大以至于它们相交。
我无法找到一种方法来测试第一个与 table 中的所有其他人,然后是第二个与所有剩余的人等。删除任何重叠。
从这个开始,但意识到它充其量不会工作,它只会将自己与下一个圆进行比较,但在 table 结束时崩溃。
local function newRing()
while true do -- infinite loop to create new rings
for i, v in ipairs(rings) do
--[[ collision calculations on all rings in table until a collision
is detected using Pythagoras to calculate distance]]
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 -- restarts while loop once one collision is found
end -- end if distCalc block
end -- i,v block
break
end -- end if not collides block
end -- end while loop
end
-- remove all collided rings
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
-- do something here (erase ring[k] from the screen, etc.)
table.remove(rings, k)
end
end