Lua Love2d Quadtree рекурсия - PullRequest
0 голосов
/ 04 июня 2018

ОБНОВЛЕНИЕ - я понял это.Оказывается, я плох в математике и визуализации 2d баллов.Я неправильно устанавливал юг или восток.

Я пытался создать квадродерево для отслеживания точек в Love2d.У меня большая часть написанного кода, но я не думаю, что рекурсия работает должным образом.

Я довольно новичок в сцене кодирования, поэтому я действительно не знаю, с чего начать.

Кажется, что пропущены точки, входящие в юго-восточный квадрант.

Я думаю, что когда он рекурсивно входит в функцию вставки, он либо смотрит на массив родительских точек, либо, кажется, не входит во всефункции вставки.

local QuadTree = {}
QuadTree.__index = QuadTree
function QuadTree:new(boundary,capacity)
    local quadTemp = {}
    setmetatable(quadTemp, QuadTree)
    if (not boundary) then 
        print('No boundary given to new QuadTree') 
    end
    if (type(capacity) ~= 'number') then
        print('Boundary should be a number')
    end
    if (capacity < 1) then
        print('capacity should be greater than one')
    end
    quadTemp.boundary = boundary
    quadTemp.capacity = capacity
    quadTemp.points = {}
    quadTemp.hasDivided = false
    return quadTemp
end

function QuadTree:insert(p)
    --If this point doesnt belong in this spot dont add it
    if (not self.boundary:contains(p)) then
        return false
    elseif (#self.points<self.capacity) then
        table.insert(self.points,p) 
        return true
    elseif(not self.hasDivided) then
        self:subdivide()
    elseif(self.hasDivided) then
        return self.northeast:insert(p) or
                self.northwest:insert(p) or
                self.southeast:insert(p) or
                self.southwest:insert(p)
    end
end
function QuadTree:subdivide()
    local x = self.boundary.xpos
    local y = self.boundary.ypos
    local w = self.boundary.width / 2
    local h = self.boundary.height / 2

    local nw = Rectangle:new(x,y,w,h)
    self.northwest = QuadTree:new(nw,self.capacity)
    local ne = Rectangle:new(w,y,w,h)
    self.northeast = QuadTree:new(ne,self.capacity)
    local sw = Rectangle:new(x,h,w,h)
    self.southwest = QuadTree:new(sw,self.capacity)
    local se = Rectangle:new(w,h,w,h)
    self.southeast = QuadTree:new(se,self.capacity)
    self.hasDivided = true  
end
function QuadTree:query(range,found)
    --If we havent found any yet lets create a list incase we do
    if (not found) then found = {} end
    --If this cell doesnt contain the boundary then return an empty list
    if (not range:intersects(self.boundary)) then
        return found
    end
    for k,v in pairs(self.points) do
        if (range:contains(v)) then
            table.insert(found,v)
        end
    end
    --If the current cell has divided we need to check its children
    if (self.hasDivided) then
        self.northwest:query(range,found)
        self.northeast:query(range,found)
        self.southwest:query(range,found)
        self.southeast:query(range,found)
    end
    return found;
end
...