public Segmento2D(Punto2D P1, Punto2D P2) { Inicio = P1; Fin = P2; Modulo = Math.Sqrt((Math.Pow((P1.X + P2.X), 2)) + (Math.Pow((P1.Y + P2.Y), 2))); mRecta = new Recta2D(P1, P2); Rectangulo = new Caja2D(P1, new Punto2D(P2.X - P1.X, P2.Y - P1.Y)); }
public static Matriz[] RepresentacionMatricial(Recta2D Recta) { Matriz[] Retorno = new Matriz[2]; Retorno[0] = Recta.PuntoDiretor.Matriz; Retorno[1] = Recta.PuntoDeMira.Matriz; return Retorno; }
public static Punto2D Interseccion(Recta2D R1, Recta2D R2) { PosicionRelativa2D m = PosicionRelativa(R1, R2); if (m.Tipo == TipoPosicionRelativa2D.Secante) { return m.Interseccion; } else { throw new ExcepcionGeometrica2D("RECTA2D (INTERSECCION): No se puede obtener la intersección de dos rectas que no son secantes." + Constants.vbNewLine + "Posición relativa: " + m.ToString()); } }
public static PosicionRelativa2D PosicionRelativa(Recta2D R1, Recta2D R2) { PosicionRelativa2D Retorno = null; SistemaEcuaciones Sis = null; Sis = new SistemaEcuaciones(R1.ObtenerEcuacion(), R2.ObtenerEcuacion()); switch (Sis.Solucion.TipoSolucion) { case TipoSolucionSistema.SistemaCompatibleDeterminado: Retorno = new PosicionRelativa2D(new Punto2D(Sis.Solucion.ValorSolucion[0], Sis.Solucion.ValorSolucion[1])); break; case TipoSolucionSistema.SistemaCompatibleIndeterminado: Retorno = new PosicionRelativa2D(TipoPosicionRelativa2D.Coincidente); break; default: Retorno = new PosicionRelativa2D(TipoPosicionRelativa2D.Paralelo); break; } return Retorno; }
public PosicionRelativa2D PosicionRelativa(Recta2D Recta) { return PosicionRelativa(this, Recta); }
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 int Pertenece(ref Recta2D Recta) { return Pertenece(ref this, ref Recta); }
public bool Pertenece(Recta2D Recta) { double Posicion = Recta.SignoPosicionRelativa(EsquinaArribaIzquierda); double P = 0; P = Recta.SignoPosicionRelativa(EsquinaArribaDerecha); if (P == Posicion) { P = Recta.SignoPosicionRelativa(EsquinaAbajoDerecha); if (P == Posicion) { P = Recta.SignoPosicionRelativa(EsquinaAbajoIzquierda); if (P == Posicion) { return false; } else { return true; } } else { return true; } } else { return true; } }
public SectorQuadtree[] Sectores(Recta2D Recta) { return Sectores(this, Recta); }
public SectorQuadtree Sector(Recta2D Recta) { return Sector(this, Recta); }
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); } }
public static SectorQuadtree[] Sectores(Quadtree Quadtree, Recta2D Recta) { SectorQuadtree S = Quadtree.SectorRaiz; List<SectorQuadtree> Retorno = new List<SectorQuadtree>(); if (Quadtree.SectorRaiz.Espacio.Pertenece(Recta)) { InterseccionRecta(Recta, S, ref Retorno); return Retorno.ToArray(); } else { throw new ExcepcionGeometrica2D("OCTREE (PERTENECE): La recta especificado no pertenece al espacio dominado por el quadtree." + Constants.vbNewLine + "Recta=" + Recta.ToString() + Constants.vbNewLine + "Espacio=" + Quadtree.Espacio.ToString()); } }
public static SectorQuadtree Sector(Quadtree Quadtree, Recta2D Recta) { int Resultado = 0; SectorQuadtree S = Quadtree.SectorRaiz; Resultado = Quadtree.SectorRaiz.Pertenece(ref Recta); if (Resultado != -2) { if (Resultado == -1) { return S; } else { while (Resultado != -2 && Resultado != -1) { Resultado = S.Pertenece(ref Recta); if (Resultado != -2) { if (Resultado == -1) { return S; } else { S = S.SubSectores[Resultado]; } } else { return S.Padre; } } return S; } } else { throw new ExcepcionGeometrica2D("OCTREE (PERTENECE): La recta especificada no pertenece al espacio dominado por el quadtree." + Constants.vbNewLine + "Punto=" + Recta.ToString() + Constants.vbNewLine + "Espacio=" + Quadtree.Espacio.ToString()); } }
private void RecalcCaja() { mRecta = new Recta2D(Inicio, Fin); Rectangulo = new Caja2D(Inicio, new Punto2D(Fin.X - Inicio.X, Fin.Y - Inicio.Y)); Modulo = Math.Sqrt((Math.Pow((Inicio.X + Fin.X), 2)) + (Math.Pow((Inicio.Y + Fin.Y), 2))); }