public Octree(int Niveles, Caja3D Caja) { if (Niveles > 1) { mNiveles = Niveles; mSectorRaiz = new SectorOctree(Niveles, Caja); } else { throw new ExcepcionGeometrica3D("OCTREE (NEW): Un octree debe tener al menos dos niveles:" + Constants.vbNewLine + "Niveles=" + Niveles); } }
public Segmento3D(Punto3D P1, Punto3D P2) { mExtremoInicial = P1; mExtremoFinal = P2; mLongitud = Math.Sqrt((Math.Pow((P1.X + P2.X), 2)) + (Math.Pow((P1.Y + P2.Y), 2))); mRecta = new Recta3D(P1, P2); mCaja = new Caja3D(P1, new Vector3D(P2.X - P1.X, P2.Y - P1.Y, P2.Z - P1.Z)); }
//SOLO PARA EL NODO RAIZ: public SectorOctreeGrafico(int Niveles, Caja3D Espacio) { if (Niveles > 1) { mNivel = 0; mNiveles = Niveles; mIndice = 0; mEspacio = Espacio; mPadre = null; mVacio = true; if (mNivel < mNiveles - 1) { mHijos = ObtenerSubSectores(this); } } else { throw new ExcepcionPrimitiva3D("SECTOROCTREEGRAFICO (NEW_RAIZ): Un octree necesita al menos dos niveles." + Constants.vbNewLine + "Niveles=" + Niveles.ToString()); } }
public static int Pertenece(ref SectorOctree Sector, ref Caja3D Caja) { if (!Sector.EsHoja && Caja.Dimensiones < Sector.Espacio.Dimensiones / 2) { //LA CAJA PERTENECE A ALGUNO DE LOS HIJOS DEL SECTOR: for (int i = 0; i <= 7; i++) { if (Sector.Hijos[i].Espacio.Colisionan(Caja)) { return i; } } } else { if (Caja.Dimensiones < Sector.Espacio.Dimensiones && Sector.Espacio.Colisionan(Caja)) { //LA CAJA PERTENECE AL SECTOR: return -1; } else { //LA CAJA NO PERTENECE AL SECTOR: return -2; } } }
//SOLO PARA EL NODO RAIZ: public SectorOctree(int Niveles, Caja3D Espacio) { if (Niveles > 1) { mNivel = 0; mNiveles = Niveles; mIndice = 0; mEspacio = Espacio; mPadre = null; if (mNivel < mNiveles - 1) { mSubSectores = ObtenerHijos(this); } } else { throw new ExcepcionGeometrica3D("SECTOROCTREE (NEW_RAIZ): Un octree necesita al menos dos niveles." + Constants.vbNewLine + "Niveles=" + Niveles.ToString()); } }
public SectorOctree(ref SectorOctree Padre, int Indice, Caja3D Caja) { if (Padre.Niveles > 1) { if (Nivel >= 0 && Nivel < Padre.Niveles) { if (Indice >= 0 && Indice <= 7) { mNivel = Padre.Nivel + 1; mNiveles = Padre.Niveles; mIndice = Indice; mEspacio = Caja; mPadre = Padre; if (mNivel < mNiveles - 1) { mSubSectores = ObtenerHijos(this); } } else { throw new ExcepcionGeometrica3D("SECTOROCTREE (NEW): El indice de un sector de Octree debe estar comprendido entre 0 y 3." + Constants.vbNewLine + "Indice=" + Indice.ToString()); } } else { throw new ExcepcionGeometrica3D("SECTOROCTREE (NEW): El nivel de un sector de Octree debe estar entre 0 y el número de niveles del Octree menos uno." + Constants.vbNewLine + "Niveles del Octree=" + Niveles.ToString() + Constants.vbNewLine + "Nivel del sector=" + Nivel.ToString()); } } else { throw new ExcepcionGeometrica3D("SECTOROCTREE (NEW): Un Octree debe tener al menos dos niveles." + Constants.vbNewLine + "Niveles del Octree=" + Niveles.ToString()); } }
public int Pertenece(ref Caja3D Caja) { return Pertenece(ref this, Caja); }
public void EstablecerAltoFrustum(double Alto) { mFrustum = new Caja3D(-(mFrustum.Ancho / 2), -mFrustum.Largo / 2, mDistancia, mFrustum.Ancho, mFrustum.Largo, Alto); if (Modificado != null) { Modificado(this); } }
public SectorOctree Sector(Caja3D Caja) { return Sector(this, Caja); }
public void RecalcularCajaSRC() { mCajaSRC = ObtenerCajaSRC(); }
public void EstablecerLargoFrustum(double Largo) { mFrustum = new Caja3D(-(mFrustum.Ancho / 2), -Largo / 2, mDistancia, mFrustum.Ancho, Largo, mFrustum.Alto); mRelacionAspecto = new Punto2D(mResolucionPantalla.X / mFrustum.Ancho, mResolucionPantalla.Y / mFrustum.Largo); if (Modificado != null) { Modificado(this); } }
public bool Colisionan(Caja3D Caja) { return Colisionan(this, Caja); }
private void CalculoTransformacion() { mVertical = mVertical.VectorUnitario; RecalcularCentro(); RecalcularDatosCaras(); if (mAutoRecalcularCajas) mCajaSUR = ObtenerCajaSUR(); if (AutoReclcNorms) RecalcularNormalesVertices(); if (Modificado != null) { Modificado(this); } if (TransformacionCompletada != null) { TransformacionCompletada(this); } }
public static Punto3D PuntoCorteRecta(Caja3D Caja, Recta3D Recta) { if (Recta.VectorDirector.X == 0) { if (Recta.VectorDirector.Y == 0) { return Recta.ObtenerPunto(Caja.Centro.Z, EnumEjes.EjeZ); } else { return Recta.ObtenerPunto(Caja.Centro.Y, EnumEjes.EjeY); } } else { return Recta.ObtenerPunto(Caja.Centro.X, EnumEjes.EjeX); } }
public static bool Pertenece(Caja3D Caja, Recta3D Recta) { double PosicionA = Recta.PrimerPlano.SignoPosicionRelativa(Caja.Vertices[0]); double PosicionB = 0; bool PlanoA = false; if (PosicionA == Recta.PrimerPlano.SignoPosicionRelativa(Caja.Vertices[1])) { if (PosicionA == Recta.PrimerPlano.SignoPosicionRelativa(Caja.Vertices[2])) { if (PosicionA == Recta.PrimerPlano.SignoPosicionRelativa(Caja.Vertices[3])) { if (PosicionA == Recta.PrimerPlano.SignoPosicionRelativa(Caja.Vertices[4])) { if (PosicionA == Recta.PrimerPlano.SignoPosicionRelativa(Caja.Vertices[5])) { if (PosicionA == Recta.PrimerPlano.SignoPosicionRelativa(Caja.Vertices[6])) { if (PosicionA == Recta.PrimerPlano.SignoPosicionRelativa(Caja.Vertices[7])) { return false; } else { PlanoA = true; } } else { PlanoA = true; } } else { PlanoA = true; } } else { PlanoA = true; } } else { PlanoA = true; } } else { PlanoA = true; } } else { PlanoA = true; } if (PlanoA) { PosicionB = Recta.SegundoPlano.SignoPosicionRelativa(Caja.Vertices[0]); if (PosicionB == Recta.SegundoPlano.SignoPosicionRelativa(Caja.Vertices[1])) { if (PosicionB == Recta.SegundoPlano.SignoPosicionRelativa(Caja.Vertices[2])) { if (PosicionB == Recta.SegundoPlano.SignoPosicionRelativa(Caja.Vertices[3])) { if (PosicionB == Recta.SegundoPlano.SignoPosicionRelativa(Caja.Vertices[4])) { if (PosicionB == Recta.SegundoPlano.SignoPosicionRelativa(Caja.Vertices[5])) { if (PosicionB == Recta.SegundoPlano.SignoPosicionRelativa(Caja.Vertices[6])) { if (PosicionB == Recta.SegundoPlano.SignoPosicionRelativa(Caja.Vertices[7])) { return false; } else { return true; } } else { return true; } } else { return true; } } else { return true; } } else { return true; } } else { return true; } } else { return true; } } else { return false; } }
public static bool Colisionan(Caja3D C1, Caja3D C2) { Caja3D R = new Caja3D(C1.Posicion.X - C2.Ancho, C1.Posicion.Y - C2.Largo, C1.Posicion.Z - C2.Alto, C1.Ancho + C2.Ancho, C1.Largo + C2.Largo, C1.Alto + C2.Alto); return Pertenece(R, C2.Posicion); }
public static bool Pertenece(Caja3D Caja, Punto3D Punto) { return (Punto.X >= Caja.Left && Punto.X <= Caja.Right && Punto.Y >= Caja.Top && Punto.Y <= Caja.Bottom && Punto.Z >= Caja.Down && Punto.Z <= Caja.Up); }
public Camara3D() { mTransformacion = new Transformacion3D(); mInversa = new Transformacion3D(); mPosicion = new Punto3D(); mPuntodeMira = new Punto3D(0, 0, 1); mVectorDireccion = new Vector3D(0, 0, 1); mDistancia = 1000; mFrustum = new Caja3D(-50000, -50000, 1000, 100000, 100000, 100000); mResolucionPantalla = new Punto2D(800, 600); mRelacionAspecto = new Punto2D(mResolucionPantalla.X / mFrustum.Ancho, mResolucionPantalla.Y / mFrustum.Largo); mPantalla = new Caja2D(-ResolucionPantalla.X / 2, -ResolucionPantalla.Y / 2, ResolucionPantalla.X, ResolucionPantalla.Y); }
public void RecalcularCajaSUR() { mCajaSUR = ObtenerCajaSUR(); }
private void RecalcularDatos() { mRecta = new Recta3D(mExtremoInicial, mExtremoFinal); mCaja = new Caja3D(mExtremoInicial, new Vector3D(mExtremoFinal.X - mExtremoInicial.X, mExtremoFinal.Y - mExtremoInicial.Y, mExtremoFinal.Z - mExtremoInicial.Z)); mLongitud = Math.Sqrt((Math.Pow((mExtremoInicial.X + mExtremoFinal.X), 2)) + (Math.Pow((mExtremoInicial.Y + mExtremoFinal.Y), 2))); }
public void RecalcularRepresentaciones(Camara3D Camara) { for (int i = 0; i <= mVertices.GetUpperBound(0); i++) { mVertices[i].CoodenadasSRC = Camara.TransformacionSURtoSRC * mVertices[i].CoodenadasSUR; mVertices[i].Representacion = Camara.Proyeccion(mVertices[i].CoodenadasSRC, true); } if (NormalesCentro) { for (int i = 0; i <= mCaras.GetUpperBound(0); i++) { mCaras[i].RecalcularBaricentroSRC(mVertices); mCaras[i].NormalSRC = new Vector3D(mCentroSRC, mCaras[i].BaricentroSRC).VectorUnitario; } } else { for (int i = 0; i <= mCaras.GetUpperBound(0); i++) { mCaras[i].RecalcularBaricentroSRC(mVertices); mCaras[i].NormalSRC = Cara.VectorNormalSRC(mCaras[i], mVertices); } } mCentroSRC = Camara.TransformacionSURtoSRC * mCentroSUR; if (mAutoRecalcularCajas) mCajaSRC = ObtenerCajaSRC(); }
public static SectorOctree Sector(Octree Octree, Caja3D Caja) { int Resultado = Octree.SectorRaiz.Pertenece(ref Caja); SectorOctree S = Octree.SectorRaiz; //PARA ENTENDER EL ALGORITMO, IR A FUNCION PERTENECE DE SECTORQUADTREE. if (Resultado != -2) { if (Resultado == -1) { return Octree.SectorRaiz; } else { do { if (Resultado != -2) { if (Resultado == -1) { return S; } else { S = S.Hijos[Resultado]; } } else { return S.Padre; } Resultado = S.Pertenece(ref Caja); } while (Resultado != -2 && Resultado != -1); return S; } } else { throw new ExcepcionGeometrica3D("OCTREE (PERTENECE): La caja especificada no pertenece al espacio dominado por el quadtree." + Constants.vbNewLine + "Caja=" + Caja.ToString() + Constants.vbNewLine + "Espacio=" + Octree.Espacio.ToString()); } }