» »

c# QuadTree Indexing

c# QuadTree Indexing

RobertDev ::

Pozdravljeni, jaz imam pa en problem z quadtree, ki ga uporabljam v igrici. Drevo je ustvarjeno rekurzivno, prvi root node je na globini 0, naslednji štirje na 1, in naslednjih šestnajst na 2. Sedaj bi pa rabil metodo, ki mi rekurzivno določi številke na globini 2. Od 0 do 15, za vsak node posebaj. Izgledalo naj bi takole
za boljšo predstavitev problema...
Problem je v tem, da ne morem uporabiti static spremenljivke, saj so potem vrednosti napačne. Zakaj? Problem je v tem, da ustvarjam subnode v vrstnem redu, zgoraj levo, zgoraj desno, spodaj levo, spodaj desno, in tako naprej na vsakem, kar mi da napačne razultate.. Rad bi imel neko funkcijo, da bi podal globino, v tem primeru 2, in bi mi določila avtomatsko številke od 0 do kolikor je pač node'ov na tej globini.

Spura ::

Nodeov je 4 na globina.

Zgodovina sprememb…

  • spremenil: Spura ()

RobertDev ::

To že, samo jaz rabim številke tako kot so na sliki, iz leve proti desni, in tako naprej navzdol. Število nodov ni problem izračunat.

Childs[0].Childs[0].vertexBufferId = 0;
            Childs[0].Childs[1].vertexBufferId = 1;
            Childs[1].Childs[0].vertexBufferId = 2;
            Childs[1].Childs[1].vertexBufferId = 3;
            Childs[0].Childs[2].vertexBufferId = 4;
            Childs[0].Childs[3].vertexBufferId = 5;
            Childs[1].Childs[2].vertexBufferId = 6;
            Childs[1].Childs[3].vertexBufferId = 7;
            Childs[2].Childs[0].vertexBufferId = 8;
            Childs[2].Childs[1].vertexBufferId = 9;
            Childs[3].Childs[0].vertexBufferId = 10;
            Childs[3].Childs[1].vertexBufferId = 11;
            Childs[2].Childs[2].vertexBufferId = 12;
            Childs[2].Childs[3].vertexBufferId = 13;
            Childs[3].Childs[2].vertexBufferId = 14;
            Childs[3].Childs[3].vertexBufferId = 15;


Tako naj bi potovala zanka.

Zgodovina sprememb…

RobertDev ::

        public void SetBufferId(int at)
        {
            if (depth == 0)
            {
                Childs[0].SetBufferId(0);
                Childs[1].SetBufferId(0);
                Childs[0].SetBufferId(2);
                Childs[1].SetBufferId(2);

                Childs[2].SetBufferId(0);
                Childs[3].SetBufferId(0);
                Childs[2].SetBufferId(2);
                Childs[3].SetBufferId(2);
            }
            else if (depth == 1)
            {
                Childs[at + 0].SetBufferId(0);
                Childs[at + 1].SetBufferId(0);
            }
            else if (depth == 2)
            {
                VBid = vbCount++;
            }
        }

Rešil začasno nekako takole.

Vesoljc ::

zakaj pa rabis tak layout?

globina je max 2?
Abnormal behavior of abnormal brain makes me normal...

RobertDev ::

Ne vem kaj je layout. Trenutno je globina max 2, pozneje bo več, tako da rabimo kodo, kjer bom poljubno določil na kateri globini hočem šteti node. Če se ti, da spisat kaj al pa namig, kako naj napišem, bom vesel.

Genetic ::

Childe od quadtree-ja imas shranjene v 1D arrayu, kljub temu pa moras vedeti, v kateri vrsti in stolpcu se nahaja. Zato si sproti, ko se sprehajas po drevesu, izracunas koordinate trenutnega childa in jih prenasas kot argumente v rekurzivni funkciji. Na koncu ves velikost 2D arraya na nivoju n, koordinate childa na nivoju n, in lahko izracunas, kaksen bi bil childov index, ce bi imel vse te childe na nivoju n shranjene v 1D arrayu in ravno to je to.

//izracunaj in postavi VBId-je vsem childom root-a v globini depth
public static void populateVBId(QuadTree root, int depth)
{
  //root ima 1 vrstico in 1 stolpec (je en sam), koordinate (0,0)
  populateVBId(root,depth,1,1,0,0);
}

public static void populateVBId(QuadTree qt, int depth, int nRows, int nCols, int row, in col)
{
  if (depth>0)
  {
    //izracunamo stevilo vrstic in stolpcev za naslednji nivo (2x vec)
    //iz indexa childa in koordinat od parenta izracunamo koordinate childa
    //ter vse to podamo kot argumente rekurzivni funkciji 
    nRows*=2; nCols*=2; depth-=1;
    for(int i=0; i<4;++i)
    {
      populateVBId(gt.Childs[i], depth, nRows, nCols, row*2+(i/2), col*2+(i%2));
    }
  }
  else
  {
    //prisli smo do nivoja, kjer zelimo postavljati VBid-je: pretvorba iz vrstice in stolpca v 
    //index 1D arraya, ki predstavlja vse childe na n-tem nivoju
    qt.vertexBufferId = nCols * row + col;
  }
} 

RobertDev ::

Točno to sem rabil, ne vem zakaj sem začel komplicirat, ko sem hotel to na koncu izračunat, ko je drevo že ustvarjeno, če se pa da lepo sproti vse, najlepša ti hvala Genetic.


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

The Thing ( Frozen Hell - Who Goes There)

Oddelek: Sedem umetnosti
433591 (795) 2dark
»

Men in Black International

Oddelek: Sedem umetnosti
314256 (1889) c3p0
»

Odpuščeni računalničarji se zatekajo v kiberkriminal

Oddelek: Novice / Varnost
194458 (2747) MacQ
»

Uslužbenec, ki ga ni mogoče odpustiti

Oddelek: Novice / Zasebnost
406593 (3025) Jst
»

Vaša ... naj ... GROOOZLJIVKA :-)

Oddelek: Sedem umetnosti
342541 (2011) Kaboom

Več podobnih tem