2017-08-08 2 views
0

J'ai une table qui est créée en ajoutant aléatoire x, y et r (rayon), que j'utilise pour dessiner des cercles. D'abord, ils sont testés pour s'assurer que les nouveaux cercles ne chevauchent pas ceux qui existent déjà. Ces cercles se développent ensuite lentement au fil du temps. J'essaye de trouver comment tester ma table d'anneaux quand ils se développent tellement qu'ils se croisent.Comment faire pour vérifier Tableau de cercles ne pas entrer en collision à mesure qu'ils grandissent

Je ne trouve pas un moyen de tester le premier par rapport à tous les autres dans la table, puis le second par rapport à tous les autres, etc. Supprimez tout chevauchement.

Commencé avec ceci mais réalisé qu'il ne fonctionnera pas au mieux il se comparera au prochain cercle seulement mais écraser quand à la fin de la 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 

Répondre

1
-- 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 
+0

Vive fonctionne comme un charme. Je n'ai jamais vu cette construction avant [[pour k = #rings, 1, -1 do]] –