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; }