Forum » Programiranje » 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.
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.
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.
Tako naj bi potovala zanka.
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…
- spremenil: RobertDev ()
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?
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 ...
Tema | Ogledi | Zadnje sporočilo | |
---|---|---|---|
Tema | Ogledi | Zadnje sporočilo | |
» | The Thing ( Frozen Hell - Who Goes There)Oddelek: Sedem umetnosti | 4213 (1417) | 2dark |
» | Men in Black InternationalOddelek: Sedem umetnosti | 4525 (2158) | c3p0 |
» | Odpuščeni računalničarji se zatekajo v kiberkriminalOddelek: Novice / Varnost | 4611 (2900) | MacQ |
» | Uslužbenec, ki ga ni mogoče odpustitiOddelek: Novice / Zasebnost | 6748 (3180) | Jst |
» | Vaša ... naj ... GROOOZLJIVKA :-)Oddelek: Sedem umetnosti | 2675 (2145) | Kaboom |