Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!
Werbeanzeige
C#-Quelltext |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
using System;using System.Collections.Generic;using System.Linq;using System.Text; namespace QuadTree{ public class Node { public Node LT_Node; public Node RT_Node; public Node LB_Node; public Node RB_Node; public IntVector2 MidPos; public int Level; public Int16 Count; public bool Full; int[] Index = new int [Config.NodeParticleMaximum]; public int Size; public void SetUp(int NewLevel, int NewMidX, int NewMidY) { Level = NewLevel;//welches Level hat der Node MidPos.X = NewMidX; MidPos.Y = NewMidY; Size = Config.QuadTreeSize / (int)Math.Pow(2, Level-1); Full = false;//Ist er voll Count = -1;//wieviele Partikel sind drinne, falls es nicht voll ist. } public void AddParticle(int ParticleIndex, ParticleProvider ParticleProvider) { if (Full)//wenn schon voll in sub node AddToSubNode(ParticleIndex, ParticleProvider); else//Wenn nicht voll hier adden { Count++; if (Count < Config.NodeParticleMaximum) { Index[Count] = ParticleIndex; } else//Wenn es voll werden sollte: { Full = true;//Voll Markieren CreateSubnodes();//neue unterknoten anlegen for (int i = 0; i < Config.NodeParticleMaximum; i++)//Alte partzikel in die Subnodes AddToSubNode(Index[i], ParticleProvider); AddToSubNode(ParticleIndex, ParticleProvider);//und den neuen auch } } } private void CreateSubnodes() { LT_Node = new Node(); RT_Node = new Node(); LB_Node = new Node(); RB_Node = new Node(); int QuaterSize = Size / 4; LT_Node.SetUp(Level + 1, MidPos.X - QuaterSize, MidPos.Y - QuaterSize);//Mittelposition fehlt noch!!! RT_Node.SetUp(Level + 1, MidPos.X + QuaterSize, MidPos.Y - QuaterSize); LB_Node.SetUp(Level + 1, MidPos.X - QuaterSize, MidPos.Y + QuaterSize); RB_Node.SetUp(Level + 1, MidPos.X + QuaterSize, MidPos.Y + QuaterSize); } private void AddToSubNode(int ParticleIndex, ParticleProvider ParticleProvider) { if (ParticleProvider.Particle[ParticleIndex].Position.X < MidPos.X) if (ParticleProvider.Particle[ParticleIndex].Position.Y < MidPos.Y) LT_Node.AddParticle(ParticleIndex, ParticleProvider); else LB_Node.AddParticle(ParticleIndex, ParticleProvider); else if (ParticleProvider.Particle[ParticleIndex].Position.Y < MidPos.Y) RT_Node.AddParticle(ParticleIndex, ParticleProvider); else RB_Node.AddParticle(ParticleIndex, ParticleProvider); } }} |
Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »Horus« (29.10.2012, 12:32)
WIE FINDET MAN DIE QUADS DIE NEBEN DEM GERADE FOKUSSIERTEN QUAD BEFINDEN?
Ich will alle Quads durchgehen und Kollisionen im eigenen Quad und den neben liegenden prüfen.
Eine weitere Frage die sich Stellt ist, wie, mit der Positionsveränderung von Partikeln unzugehen ist. Muss ich für jeden Frame den Quadtree komplett neu aufbauen?
Oder prüfe ich "nur" ob Quads verlassen wurden und restrukturiere die Datenstruktur dann erneut?
Ja das ist nicht so schwer. Aber die Anderen!?! und wie ist es bei weiterer Unterteilung der Partnernodes?Zitat
Die benachbarten Nodes, auf der gleichen Ebene, sind immer die 0-3 übrigen Kinder des Parentnodes.
Als Alternative gäbe es die Möglichkeit ein Gitter zu benutzen. Aber Quadtrees sind ja effizienter?
WIE FINDET MAN DIE QUADS DIE NEBEN DEM GERADE FOKUSSIERTEN QUAD BEFINDEN?
Ich will alle Quads durchgehen und Kollisionen im eigenen Quad und den neben liegenden prüfen.
Eine weitere Frage die sich Stellt ist, wie, mit der Positionsveränderung von Partikeln unzugehen ist. Muss ich für jeden Frame den Quadtree komplett neu aufbauen?
Oder prüfe ich "nur" ob Quads verlassen wurden und restrukturiere die Datenstruktur dann erneut?
Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »dot« (29.10.2012, 21:17)
Ja aber wenn sich die Partikel bewegen, dann ändern sich die Quads man müsste über die Pointer auf die umliegenden Quads zugreifen und dort die Pointer updqaten. das wird mir zu bunt...Zitat
Das ist in der Tat ein Problem. Wofür genau brauchst du die benachbarten Quads? Du könntest natürlich z.B. in jedem Node Pointer auf seine Nachbarn speichern...
Ich habe eine neue Idee.
Eine Art Hybrid aus Gitter und Quadtree. Gibt es das schon? ist das neu? Ist das Unsinn?
C-/C++-Quelltext |
|
1 2 3 4 |
int main(int _argc, char** _argv) noexcept { asm volatile("lock cmpxchg8b %eax"); return 0; } // ::main |
Community-Fossil
Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer
Werbeanzeige