public Interseccion (Calle norte, Calle oeste, Calle sur, Calle este, double posicion_x, double posicion_y)
			: base (posicion_x, posicion_y)
		{
			this.norte = norte;
			this.oeste = oeste;
			this.sur = sur;
			this.este = este;
			this.ancho = 36;
		}
		public static bool estaSobre(Calle elemento)
		{
			int x = (int)elemento.X;
			int y = (int)elemento.Y;
			int xR = Modificar.posX;
			int yR = Modificar.posY;
			int largo = elemento.Largo;
			int ancho = elemento.Ancho;

			if (elemento.obtenerOrientacionSimple () == Elemento.HORIZONTAL && xR >= x && xR <= x + largo && yR >= y && yR <= y + ancho) {
				sobreCalle = elemento;
				idElementoEliminar = elemento.Id;
				if (!Modificar.eliminarCalles) {
					if (yR < y + ancho / 2)
						carril = Elemento.CARRIL1;
					else
						carril = Elemento.CARRIL2;
				}
				return true;
			}
			if (elemento.obtenerOrientacionSimple () == Elemento.VERTICAL && xR >= x && xR <= x + ancho && yR >= y && yR <= y + largo) {
				sobreCalle = elemento;
				idElementoEliminar = elemento.Id;
				if (!Modificar.eliminarCalles) {
					if (xR < x + ancho / 2)
						carril = Elemento.CARRIL2;
					else
						carril = Elemento.CARRIL1;
				}
				return true;
			}
			if (sobreCalle != null && sobreCalle.Id == elemento.Id) {
				carril = -1;
				idElementoEliminar = -1;
				sobreCalle = null;
			}
			return false;
		}
		private void dibujarCalle(Graphics grafico, Calle calle)
		{
			int x = (int)calle.X;
			int y = (int)calle.Y;

			Color colorBorde = Configuracion.COLORBORDE;
			Color colorLinea = Configuracion.COLORLINEA;
			Color colorFlecha = Configuracion.COLORFLECHA;

			if (Modificar.eliminarCalles && Modificar.estaSobre(calle)) {
				colorBorde = Configuracion.COLORRESALTAR;
				colorLinea = Configuracion.COLORRESALTAR;
				colorFlecha = Configuracion.COLORRESALTAR;
			}

			if (Modificar.modificando != Modificar.eliminarCalles) {
				Modificar.estaSobre (calle);
			}

			//Dibuja las Calles
			if (calle.Orientacion == Elemento.HORIZONTAL) {
				grafico.FillRectangle (new SolidBrush (Configuracion.COLORCALLE), x, y, calle.Largo, calle.Ancho);
				grafico.DrawRectangle (new Pen (colorBorde, 2), x, y, calle.Largo, calle.Ancho);
				for(int xc=0; xc<calle.Largo; xc=xc+8) {
					grafico.FillRectangle (new SolidBrush (colorLinea), x+xc, y+17, 4, 2);
				}
			} else {
				grafico.FillRectangle (new SolidBrush (Configuracion.COLORCALLE), x, y, calle.Ancho,calle.Largo);
				grafico.DrawRectangle (new Pen (colorBorde, 2), x, y, calle.Ancho, calle.Largo);
				//grafico.FillRectangle (new SolidBrush (Configuracion.COLORBORDE), x+17, y, 2, 600);
				for(int yc=0; yc<calle.Largo-4; yc=yc+8) {
					grafico.FillRectangle (new SolidBrush (colorLinea), x+17, y+yc, 2, 4);
				}
			}

			//Escribe el nombre de la calle
			if(calle.Orientacion == Elemento.HORIZONTAL)
				grafico.DrawString(calle.Nombre,new Font("Arial", 10, FontStyle.Bold),
					new SolidBrush(Configuracion.COLORNOMBRE),
					new RectangleF(x+(calle.Largo/2)-50,y-19,200,20));
			else {
				StringFormat vertical = new StringFormat ();
				vertical.FormatFlags = StringFormatFlags.DirectionVertical;
				grafico.DrawString(calle.Nombre,new Font("Arial", 10, FontStyle.Bold),
					new SolidBrush(Configuracion.COLORNOMBRE),
					new RectangleF(x+40,y+(calle.Largo/2)-50,20,400),
					vertical);
			}


			//Dibuja las Flechas que indican la direccion de las calles
			if (calle.obtenerOrientacionSimple () == Elemento.HORIZONTAL) {
				if (calle.SentidoCarril1 == Elemento.DE1A2)
					dibujarFlecha (grafico, colorFlecha, DERECHA, Elemento.CARRIL1, 0, calle.Ancho, calle.Largo, x, y);
				else if (calle.SentidoCarril1 == Elemento.DE2A1)
					dibujarFlecha (grafico, colorFlecha, IZQUIERDA, Elemento.CARRIL1, 0, calle.Ancho, calle.Largo, x, y);
				if (calle.SentidoCarril2 == Elemento.DE1A2)
					dibujarFlecha (grafico, colorFlecha, DERECHA, Elemento.CARRIL2, calle.Id, calle.Ancho, calle.Largo, x, y);
				else if (calle.SentidoCarril2 == Elemento.DE2A1)
					dibujarFlecha (grafico, colorFlecha, IZQUIERDA, Elemento.CARRIL2, calle.Id, calle.Ancho, calle.Largo, x, y);
			}
			else if (calle.obtenerOrientacionSimple () == Elemento.VERTICAL) {
				if (calle.SentidoCarril1 == Elemento.DE1A2)
					dibujarFlecha (grafico, colorFlecha, ABAJO, Elemento.CARRIL1, 0, calle.Ancho, calle.Largo, x, y);
				else if (calle.SentidoCarril1 == Elemento.DE2A1)
					dibujarFlecha (grafico, colorFlecha, ARRIBA, Elemento.CARRIL1, 0, calle.Ancho, calle.Largo, x, y);
				if (calle.SentidoCarril2 == Elemento.DE1A2)
					dibujarFlecha (grafico, colorFlecha, ABAJO, Elemento.CARRIL2, calle.Id, calle.Ancho, calle.Largo, x, y);
				else if (calle.SentidoCarril2 == Elemento.DE2A1)
					dibujarFlecha (grafico, colorFlecha, ARRIBA, Elemento.CARRIL2, calle.Id, calle.Ancho, calle.Largo, x, y);
			}
		}
		public void unirCalle(Interseccion interseccion, Calle calle)
		{
			//Une la interseccion con la calle, basandose en las coordenadas
			double xI = interseccion.X;
			double yI = interseccion.Y;
			double xC = calle.X;
			double yC = calle.Y;

			if (yI > yC) {
				//Indica que se conecta por el norte
				interseccion.Norte = calle;
				calle.Salida2 = interseccion;
			} else if(yI < yC) {
				//Indica que se conecta por el sur
				interseccion.Sur = calle;
				calle.Salida1 = interseccion;
			} else if(xI > xC) {
				//Indica que se conecta por el oeste
				interseccion.Oeste = calle;
				calle.Salida2 = interseccion;
			} else if(xI < xC) {
				//Indica que se conecta por el este
				interseccion.Este = calle;
				calle.Salida1 = interseccion;
			}

		}