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 int Pertenece(ref Figura2D Figura2D) { return Pertenece(ref this, ref Figura2D); }
public bool AñadirFigura2D(ref Figura2D Figura2D) { if (mObjetos == null) { mObjetos = new Figura2D[1]; mObjetos[0] = Figura2D; } else { if (!mObjetos.Contains(Figura2D)) { Array.Resize(ref mObjetos, mObjetos.GetUpperBound(0) + 2); mObjetos[mObjetos.GetUpperBound(0)] = Figura2D; } else { return false; } } return true; }
public static bool Colisionan(Figura2D F1, Figura2D F2, int NivelesBSP, bool BSP = false) { if (Caja2D.Colisionan(F1.Caja, F2.Caja)) { for (int i = 0; i <= F1.Lados.GetUpperBound(0); i++) { if (Caja2D.Colisionan(F1.Lados[i].Caja, F2.Caja)) { for (int j = 0; j <= F2.Lados.GetUpperBound(0); j++) { if (Caja2D.Colisionan(F1.Caja, F2.Lados[j].Caja)) { if (Segmento2D.Colisionan(F1.Lados[i], F2.Lados[j], NivelesBSP, BSP)) { return true; } } } } } } return false; }
public SectorQuadtree Sector(Figura2D Figura2D) { return Sector(this, Figura2D); }
public static SectorQuadtree Sector(Quadtree Quadtree, ref Figura2D Figura2D) { int Resultado = Quadtree.SectorRaiz.Pertenece(ref Figura2D); SectorQuadtree S = Quadtree.SectorRaiz; //PARA ENTENDER EL ALGORITMO, IR A FUNCION PERTENECE DE SECTORQUADTREE. if (Resultado != -2) { if (Resultado == -1) { return Quadtree.SectorRaiz; } else { do { if (Resultado != -2) { if (Resultado == -1) { return S; } else { S = S.SubSectores[Resultado]; } } else { return S.Padre; } Resultado = S.Pertenece(ref Figura2D); } while (Resultado != -2 && Resultado != -1); return S; } } else { throw new ExcepcionGeometrica2D("OCTREE (PERTENECE): La figura especificada no pertenece al espacio dominado por el quadtree." + Constants.vbNewLine + "Figura2D=" + Figura2D.ToString() + Constants.vbNewLine + "Espacio=" + Quadtree.Espacio.ToString()); } }