public Quadtree(int Niveles, Caja2D Caja) { if (Niveles > 1) { mNiveles = Niveles; mSectorRaiz = new SectorQuadtree(Niveles, Caja); } else { throw new ExcepcionGeometrica2D("OCTREE (NEW): Un octree debe tener al menos dos niveles:" + Constants.vbNewLine + "Niveles=" + Niveles); } }
//SOLO PARA EL NODO RAIZ: public SectorQuadtree(int Niveles, Caja2D Espacio) { if (Niveles > 1) { mNivel = 0; mNiveles = Niveles; mIndice = 0; mEspacio = Espacio; mPadre = null; if (mNivel < mNiveles - 1) { mSubSectores = ObtenerSubSectores(this); } } else { throw new ExcepcionGeometrica2D("SECTORQUADTREE (NEW_RAIZ): Un octree necesita al menos dos niveles." + Constants.vbNewLine + "Niveles=" + Niveles.ToString()); } }
public static int Pertenece(ref SectorQuadtree Sector, ref Figura2D Figura2D) { if (!Sector.EsHoja && Figura2D.Caja.Dimensiones < Sector.Espacio.Dimensiones / 2) { //LA CAJA PERTENECE A ALGUNO DE LOS HIJOS DEL SECTOR: for (int i = 0; i <= 3; i++) { if (Sector.SubSectores[i].Espacio.Colisionan(Figura2D.Caja)) { return i; } } } else { if (Figura2D.Caja.Dimensiones < Sector.Espacio.Dimensiones && Sector.Espacio.Colisionan(Figura2D.Caja)) { //LA CAJA PERTENECE AL SECTOR: Sector.AñadirFigura2D(ref Figura2D); return -1; } else { //LA CAJA NO PERTENECE AL SECTOR: return -2; } } }
public static int Pertenece(ref SectorQuadtree Sector, ref Recta2D Recta) { if (!Sector.EsHoja) { for (int i = 0; i <= 3; i++) { if (Sector.SubSectores[i].Espacio.Pertenece(Recta)) { return i; } } } else { if (Sector.Espacio.Pertenece(Recta)) { return -1; } else { return -2; } } }
public static SectorQuadtree[] ObtenerSubSectores(SectorQuadtree Sector) { if (Sector.Nivel < Sector.Niveles - 1) { SectorQuadtree[] Retorno = new SectorQuadtree[4]; Punto2D Tamaño = new Punto2D(Sector.Espacio.Ancho / 2, Sector.Espacio.Alto / 2); Retorno[0] = new SectorQuadtree(Sector, 0, new Caja2D(Sector.Espacio.Posicion, Tamaño)); Retorno[1] = new SectorQuadtree(Sector, 1, new Caja2D(new Punto2D(Sector.Espacio.Left + Tamaño.X, Sector.Espacio.Top), Tamaño)); Retorno[2] = new SectorQuadtree(Sector, 2, new Caja2D(new Punto2D(Sector.Espacio.Left + Tamaño.X, Sector.Espacio.Top + Tamaño.Y), Tamaño)); Retorno[3] = new SectorQuadtree(Sector, 3, new Caja2D(new Punto2D(Sector.Espacio.Left, Sector.Espacio.Top + Tamaño.Y), Tamaño)); return Retorno; } else { throw new ExcepcionGeometrica2D("SECTORQUADTREE (NEW): No se pueden generar subsectores de un sector cuyo nivel es máximo." + Constants.vbNewLine + "Niveles del Quadtree=" + Sector.Niveles.ToString() + Constants.vbNewLine + "Nivel del sector=" + Sector.Niveles); } }
public SectorQuadtree(ref SectorQuadtree Padre, int Indice, Caja2D Caja) { if (Padre.Niveles > 1) { if (Nivel >= 0 && Nivel < Padre.Niveles) { if (Indice >= 0 && Indice <= 3) { mNivel = Padre.Nivel + 1; mNiveles = Padre.Niveles; mIndice = Indice; mEspacio = Caja; mPadre = Padre; if (mNivel < mNiveles - 1) { mSubSectores = ObtenerSubSectores(this); } } else { throw new ExcepcionGeometrica2D("SECTORQUADTREE (NEW): El indice de un sector de Quadtree debe estar comprendido entre 0 y 3." + Constants.vbNewLine + "Indice=" + Indice.ToString()); } } else { throw new ExcepcionGeometrica2D("SECTORQUADTREE (NEW): El nivel de un sector de Quadtree debe estar entre 0 y el número de niveles del Quadtree menos uno." + Constants.vbNewLine + "Niveles del Quadtree=" + Niveles.ToString() + Constants.vbNewLine + "Nivel del sector=" + Nivel.ToString()); } } else { throw new ExcepcionGeometrica2D("SECTORQUADTREE (NEW): Un Quadtree debe tener al menos dos niveles." + Constants.vbNewLine + "Niveles del Quadtree=" + Niveles.ToString()); } }
public static void InterseccionRecta(Recta2D Recta, SectorQuadtree Sector, ref List<SectorQuadtree> ListaRetorno) { if (!Sector.EsHoja) { foreach (SectorQuadtree Hijo in Sector.SubSectores) { if (Hijo.Espacio.Pertenece(Recta)) { InterseccionRecta(Recta, Hijo, ref ListaRetorno); } } } else { if (Sector.Espacio.Pertenece(Recta)) ListaRetorno.Add(Sector); } }