예제 #1
0
		public Grafo (List<Calle> calles)
		{
			nodos = new Hashtable();

			//Se agregan todos los nodos aun sin conectar
			Nodo nodo;
			for(int x=0; x<calles.Count; x++)
			{
				nodo = new Nodo (calles[x].Id, calles[x].Largo);
				nodos.Add (calles[x].Id, nodo);
			}

			nodo = null;
			//Se conectan los nodos
			for(int x=0; x<calles.Count; x++)
			{
				Calle calle;
				Interseccion[] salida = new Interseccion[2];
				salida [0] = calles [x].Salida1;
				salida [1] = calles [x].Salida2;

				for (int y = 0; y < salida.Length; y++) {
					if (salida [y] != null && ((y == 0 && (calles [x].SentidoCarril1 == Elemento.DE2A1 || calles [x].SentidoCarril2 == Elemento.DE2A1)) ||
						(y == 1 && (calles [x].SentidoCarril1 == Elemento.DE1A2 || calles [x].SentidoCarril2 == Elemento.DE1A2)))) {
						if (salida [y].Norte != null) {
							calle = salida [y].Norte;//Calle al norte
							if (calles [x].Id != calle.Id && (calle.SentidoCarril1 == Elemento.DE2A1 || calle.SentidoCarril2 == Elemento.DE2A1)) {
								nodo = (Nodo)nodos [calles [x].Id];
								nodo.agregarNodoAdyacente ((Nodo)nodos [calle.Id]);
							}
						}
						if (salida [y].Sur != null) {
							calle = salida [y].Sur;//Calle al sur
							if (calles [x].Id != calle.Id && (calle.SentidoCarril1 == Elemento.DE1A2 || calle.SentidoCarril2 == Elemento.DE1A2)) {
								nodo = (Nodo)nodos [calles [x].Id];
								nodo.agregarNodoAdyacente ((Nodo)nodos [calle.Id]);
							}
						}
						if (salida [y].Este != null) {
							calle = salida [y].Este;//Calle al este
							if (calles [x].Id != calle.Id && (calle.SentidoCarril1 == Elemento.DE1A2 || calle.SentidoCarril2 == Elemento.DE1A2)) {
								nodo = (Nodo)nodos [calles [x].Id];
								nodo.agregarNodoAdyacente ((Nodo)nodos [calle.Id]);
							}
						}
						if (salida [y].Oeste != null) {
							calle = salida [y].Oeste;//Calle al oeste
							if (calles [x].Id != calle.Id && (calle.SentidoCarril1 == Elemento.DE2A1 || calle.SentidoCarril2 == Elemento.DE2A1)) {
								nodo = (Nodo)nodos [calles [x].Id];
								nodo.agregarNodoAdyacente ((Nodo)nodos [calle.Id]);
							}
						}
					}
				}
			}
		}
		private void dibujarInterseccion (Graphics grafico, Interseccion interseccion)
		{
			int x = (int)interseccion.X;
			int y = (int)interseccion.Y;

			Color colorBorde = Configuracion.COLORBORDE;

			if (Modificar.eliminarCalles && Modificar.estaSobre(interseccion)) {
				colorBorde = Configuracion.COLORRESALTAR;
			}

			grafico.FillRectangle (new SolidBrush (Configuracion.COLORCALLE), x, y, interseccion.Ancho, interseccion.Ancho);
			grafico.DrawRectangle (new Pen (Configuracion.COLORCALLE, 2), x, y, interseccion.Ancho, interseccion.Ancho);
			this.dibujarID (grafico, interseccion.Id, Elemento.HORIZONTAL, x+2, y+9);

			//Dibuja un pequeño punto en cada esquina de la interseccion
			//Para unir mejor las esquinas de las calles
			SolidBrush color = new SolidBrush (colorBorde);
			grafico.FillRectangle (color, x-1, y-1, 2, 2);
			grafico.FillRectangle (color, x-1, y+interseccion.Ancho-1, 2, 2);
			grafico.FillRectangle (color, x+interseccion.Ancho-1, y-1, 2, 2);
			grafico.FillRectangle (color, x+interseccion.Ancho-1, y+interseccion.Ancho-1, 2, 2);

			if (Modificar.interseccion) {
				SolidBrush resaltar = new SolidBrush (Configuracion.COLORRESALTAR);
				if (interseccion.Norte == null) 
					grafico.FillRectangle (resaltar, x-2, y-2, interseccion.Ancho+4, 4);
				if (interseccion.Sur == null)
					grafico.FillRectangle (resaltar, x-2, y+interseccion.Ancho-2, interseccion.Ancho+4, 4);
				if (interseccion.Este == null)
					grafico.FillRectangle (resaltar, x+interseccion.Ancho-2, y-2, 4, interseccion.Ancho+4);
				if (interseccion.Oeste == null)
					grafico.FillRectangle (resaltar, x-2, y-2, 4, interseccion.Ancho+4);
			}
		}
		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;
			}

		}
		public static bool estaSobre(Interseccion elemento)
		{
			int x = (int)elemento.X;
			int y = (int)elemento.Y;
			int xR = Modificar.posX;
			int yR = Modificar.posY;
			int ancho = elemento.Ancho;

			if (xR >= x && xR <= x + ancho && yR >= y && yR <= y + ancho) {
				idElementoEliminar = elemento.Id;
				return true;
			}
			if (idElementoEliminar == elemento.Id)
				idElementoEliminar = -1;
			return false;
		}