Exemplo n.º 1
0
		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);
			}
		}
Exemplo n.º 2
0
		//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());
			}
		}
Exemplo n.º 3
0
		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;
				}
			}
		}
Exemplo n.º 4
0
		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;
				}
			}
		}
Exemplo n.º 5
0
		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);
			}
		}
Exemplo n.º 6
0
		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());
			}
		}
Exemplo n.º 7
0
		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);
			}
		}