void encontrarCamino(Vertice origen, Vertice destino) { listaCamino.Add(destino); //< Añado el vertice destino, la lista empieza al reves Vertice temp = destino; //< Iterador en la lista while (temp.getId() != origen.getId()) //< Mientras el Id del temporal no sea el del origen { foreach (elementoDij e_d in elementoDList) { if (e_d.getVEDJ() == temp) // Busco el elementoDij que lo contiene y lo añado al camino y muevo el temporal { listaCamino.Add(e_d.getProv()); temp = e_d.getProv(); break; } } } listaCamino.Reverse(); //< Le doy la vuelta a la lista para que esten en orden }
void ButtonPRIMClick(object sender, EventArgs e) { numericUpPRIM.Maximum = graf.getLV().Count; Vertice origen = new Vertice(); int vertice = 0; vertice = (int)numericUpPRIM.Value; foreach (Vertice v in graf.getLV()) { if (v.getId() == vertice) { origen = v; break; } } //KruskalPrim prim = new KruskalPrim(graf, imgGrafo); hazPrim(origen); //Falta vertice origen }
public void setVertice(Vertice v) { this.vertice = v; }
public void setVerticeProv(Vertice v) { this.proveniente = v; }
void animarParticulas() { if (!esDijk) { bool vuelta = false; int vueltas = 0; Graphics graphics = Graphics.FromImage(iTransp); Brush brochaP = new SolidBrush(Color.BlueViolet); Brush brochaD = new SolidBrush(Color.Gold); Point point = new Point(); Particula p = new Particula(); while (lParticulas.Count > 0) { if (vueltas == 2) { vuelta = true; } for (int i = 0; i < lParticulas.Count; i++) { p = lParticulas[i]; p.setIndPos(p.getContador()); Arista a = new Arista(); Vertice ori = p.getLVertices()[p.getCOri()]; Vertice des = p.getLVertices()[p.getCDes()]; for (int j = 0; j < ori.getLA().Count; j++) { if (ori.getLA()[j].getDestino().getId() == des.getId()) { a = ori.getLA()[j]; break; } } if (p.getIndPos() < a.getListaP().Count) //Si la particula no ha terminado los puntos en la arista donde esta { Point po = a.getListaP()[p.getIndPos()]; if (p.esDepre() == true) { point.X = po.X; point.Y = po.Y; p.setPosActual(point); graphics.FillEllipse(brochaD, po.X - p.getR(), po.Y - p.getR(), 2 * p.getR(), 2 * p.getR()); } else { point.X = po.X; point.Y = po.Y; p.setPosActual(point); graphics.FillEllipse(brochaP, po.X - p.getR(), po.Y - p.getR(), 2 * p.getR(), 2 * p.getR()); } //COMPROBAR COLISIONES if (vuelta) { Particula p1 = new Particula(); Particula p2 = new Particula(); for (int z = 0; z < lParticulas.Count; z++) { for (int x = 0; x < lParticulas.Count; x++) { if (z < lParticulas.Count && x < lParticulas.Count) { p1 = lParticulas[z]; // Es depredadora p2 = lParticulas[x]; // Es presa } if (p1.esDepre() && !p2.esDepre()) { if (p1.getPosActual() == p2.getPosActual() || (p1.getPosActual().X - 3 == p2.getPosActual().X&& p1.getPosActual().Y == p2.getPosActual().Y) || (p1.getPosActual().X + 3 == p2.getPosActual().X&& p1.getPosActual().Y == p2.getPosActual().Y) || (p1.getPosActual().X + 2 == p2.getPosActual().X&& p1.getPosActual().Y == p2.getPosActual().Y) || (p1.getPosActual().X - 2 == p2.getPosActual().X&& p1.getPosActual().Y == p2.getPosActual().Y) || //Aqui ya captura en x lineal (p1.getPosActual().X - 4 == p2.getPosActual().X&& p1.getPosActual().Y == p2.getPosActual().Y) || (p1.getPosActual().X + 4 == p2.getPosActual().X&& p1.getPosActual().Y == p2.getPosActual().Y) || (p1.getPosActual().X + 1 == p2.getPosActual().X&& p1.getPosActual().Y == p2.getPosActual().Y) || (p1.getPosActual().X - 1 == p2.getPosActual().X&& p1.getPosActual().Y == p2.getPosActual().Y) || (p1.getPosActual().X == p2.getPosActual().X&& p1.getPosActual().Y + 1 == p2.getPosActual().Y) || (p1.getPosActual().X == p2.getPosActual().X&& p1.getPosActual().Y + 2 == p2.getPosActual().Y) || (p1.getPosActual().X == p2.getPosActual().X&& p1.getPosActual().Y + 3 == p2.getPosActual().Y) || (p1.getPosActual().X == p2.getPosActual().X&& p1.getPosActual().Y + 4 == p2.getPosActual().Y) || //Aqui ya captura en Y lineal (p1.getPosActual().X == p2.getPosActual().X&& p1.getPosActual().Y - 1 == p2.getPosActual().Y) || (p1.getPosActual().X == p2.getPosActual().X&& p1.getPosActual().Y - 2 == p2.getPosActual().Y) || (p1.getPosActual().X == p2.getPosActual().X&& p1.getPosActual().Y - 3 == p2.getPosActual().Y) || (p1.getPosActual().X == p2.getPosActual().X&& p1.getPosActual().Y - 4 == p2.getPosActual().Y) || (p1.getPosActual().Y + 1 == p2.getPosActual().Y&& p1.getPosActual().X - 1 == p2.getPosActual().X) || (p1.getPosActual().Y + 2 == p2.getPosActual().Y&& p1.getPosActual().X - 2 == p2.getPosActual().X) || (p1.getPosActual().Y + 3 == p2.getPosActual().Y&& p1.getPosActual().X - 3 == p2.getPosActual().X) || (p1.getPosActual().Y + 4 == p2.getPosActual().Y&& p1.getPosActual().X - 4 == p2.getPosActual().X) || (p1.getPosActual().Y - 1 == p2.getPosActual().Y&& p1.getPosActual().X + 1 == p2.getPosActual().X) || (p1.getPosActual().Y - 2 == p2.getPosActual().Y&& p1.getPosActual().X + 2 == p2.getPosActual().X) || (p1.getPosActual().Y - 3 == p2.getPosActual().Y&& p1.getPosActual().X + 3 == p2.getPosActual().X) || (p1.getPosActual().Y - 4 == p2.getPosActual().Y&& p1.getPosActual().X + 4 == p2.getPosActual().X) || (p1.getPosActual().Y + 1 == p2.getPosActual().Y&& p1.getPosActual().X + 1 == p2.getPosActual().X) || (p1.getPosActual().Y + 2 == p2.getPosActual().Y&& p1.getPosActual().X + 2 == p2.getPosActual().X) || (p1.getPosActual().Y + 3 == p2.getPosActual().Y&& p1.getPosActual().X + 3 == p2.getPosActual().X) || (p1.getPosActual().Y + 4 == p2.getPosActual().Y&& p1.getPosActual().X + 4 == p2.getPosActual().X) || (p1.getPosActual().Y - 1 == p2.getPosActual().Y&& p1.getPosActual().X - 1 == p2.getPosActual().X) || (p1.getPosActual().Y - 2 == p2.getPosActual().Y&& p1.getPosActual().X - 2 == p2.getPosActual().X) || (p1.getPosActual().Y - 3 == p2.getPosActual().Y&& p1.getPosActual().X - 3 == p2.getPosActual().X) || (p1.getPosActual().Y - 4 == p2.getPosActual().Y&& p1.getPosActual().X - 4 == p2.getPosActual().X) || (p1.getPosActual().Y - 1 == p2.getPosActual().Y&& p1.getPosActual().X - 1 == p2.getPosActual().X) || (p1.getPosActual().Y - 2 == p2.getPosActual().Y&& p1.getPosActual().X - 2 == p2.getPosActual().X) || (p1.getPosActual().Y - 3 == p2.getPosActual().Y&& p1.getPosActual().X - 3 == p2.getPosActual().X) || (p1.getPosActual().Y - 4 == p2.getPosActual().Y&& p1.getPosActual().X - 4 == p2.getPosActual().X) ) { p1.setR(p1.getR() + 5); lParticulas.Remove(p2); //i--; } } } } } } else //si ya termino cambio el origen { p.setCOri(p.getCOri() + 1); p.setCDes(p.getCDes() + 1); p.setContador(0); if (p.getCDes() == p.getLVertices().Count) //Si el destino es el ultimo en la lista elimino la particula { point.X = 0; point.Y = 0; p.setPosActual(point); lParticulas.Remove(p); i--; } } p.setContador(p.getContador() + 5); } pictureImageGrafo.Refresh(); graphics.Clear(Color.Transparent); vueltas++; } totalVertices = disponibles = g.getLV().Count; //< Reinicio el contador para insertar más vOcupados.Clear(); } else { bool vuelta = false; bool viva = true; bool refresh = true; int vueltas = 0; //labelLlego.Text = "--"; Graphics graphics = Graphics.FromImage(iTransp); Brush brochaP = new SolidBrush(Color.BlueViolet); Brush brochaD = new SolidBrush(Color.Gold); Point point = new Point(); Particula p = new Particula(); while (lParticulas.Count > 0) { if (vueltas == 2) { vuelta = true; } if (!viva) { MessageBox.Show("-=LA PARTICULA FUE DEVORADA=-"); totalVertices = disponibles = g.getLV().Count; //< Reinicio el contador para insertar más vOcupados.Clear(); break; } for (int i = 0; i < lParticulas.Count; i++) { p = lParticulas[i]; p.setIndPos(p.getContador()); Arista a = new Arista(null, null, double.MaxValue, null); Vertice ori = p.getLVertices()[p.getCOri()]; Vertice des = p.getLVertices()[p.getCDes()]; for (int j = 0; j < ori.getLA().Count; j++) { if (ori.getLA()[j].getDestino() == des) { a = ori.getLA()[j]; break; } } if (p.getIndPos() < a.getListaP().Count) //Si la particula no ha terminado los puntos en la arista donde esta { Point po = a.getListaP()[p.getIndPos()]; if (p.esDepre() == true) { point.X = po.X; point.Y = po.Y; p.setPosActual(point); graphics.FillEllipse(brochaD, po.X - p.getR(), po.Y - p.getR(), 2 * p.getR(), 2 * p.getR()); } else { point.X = po.X; point.Y = po.Y; p.setPosActual(point); graphics.FillEllipse(brochaP, po.X - p.getR(), po.Y - p.getR(), 2 * p.getR(), 2 * p.getR()); } //COMPROBAR COLISIONES if (vuelta) { Particula p1 = new Particula(); Particula p2 = new Particula(); for (int z = 0; z < lParticulas.Count; z++) { for (int x = 0; x < lParticulas.Count; x++) { if (z < lParticulas.Count && x < lParticulas.Count) { p1 = lParticulas[z]; // Es depredadora p2 = lParticulas[x]; // Es presa } if (p1.esDepre() && !p2.esDepre()) { if (p1.getPosActual() == p2.getPosActual() || (p1.getPosActual().X - 3 == p2.getPosActual().X&& p1.getPosActual().Y == p2.getPosActual().Y) || (p1.getPosActual().X + 3 == p2.getPosActual().X&& p1.getPosActual().Y == p2.getPosActual().Y) || (p1.getPosActual().X + 2 == p2.getPosActual().X&& p1.getPosActual().Y == p2.getPosActual().Y) || (p1.getPosActual().X - 2 == p2.getPosActual().X&& p1.getPosActual().Y == p2.getPosActual().Y) || //Aqui ya captura en x lineal (p1.getPosActual().X - 4 == p2.getPosActual().X&& p1.getPosActual().Y == p2.getPosActual().Y) || (p1.getPosActual().X + 4 == p2.getPosActual().X&& p1.getPosActual().Y == p2.getPosActual().Y) || (p1.getPosActual().X + 1 == p2.getPosActual().X&& p1.getPosActual().Y == p2.getPosActual().Y) || (p1.getPosActual().X - 1 == p2.getPosActual().X&& p1.getPosActual().Y == p2.getPosActual().Y) || (p1.getPosActual().X == p2.getPosActual().X&& p1.getPosActual().Y + 1 == p2.getPosActual().Y) || (p1.getPosActual().X == p2.getPosActual().X&& p1.getPosActual().Y + 2 == p2.getPosActual().Y) || (p1.getPosActual().X == p2.getPosActual().X&& p1.getPosActual().Y + 3 == p2.getPosActual().Y) || (p1.getPosActual().X == p2.getPosActual().X&& p1.getPosActual().Y + 4 == p2.getPosActual().Y) || //Aqui ya captura en Y lineal (p1.getPosActual().X == p2.getPosActual().X&& p1.getPosActual().Y - 1 == p2.getPosActual().Y) || (p1.getPosActual().X == p2.getPosActual().X&& p1.getPosActual().Y - 2 == p2.getPosActual().Y) || (p1.getPosActual().X == p2.getPosActual().X&& p1.getPosActual().Y - 3 == p2.getPosActual().Y) || (p1.getPosActual().X == p2.getPosActual().X&& p1.getPosActual().Y - 4 == p2.getPosActual().Y) || (p1.getPosActual().Y + 1 == p2.getPosActual().Y&& p1.getPosActual().X - 1 == p2.getPosActual().X) || (p1.getPosActual().Y + 2 == p2.getPosActual().Y&& p1.getPosActual().X - 2 == p2.getPosActual().X) || (p1.getPosActual().Y + 3 == p2.getPosActual().Y&& p1.getPosActual().X - 3 == p2.getPosActual().X) || (p1.getPosActual().Y + 4 == p2.getPosActual().Y&& p1.getPosActual().X - 4 == p2.getPosActual().X) || (p1.getPosActual().Y - 1 == p2.getPosActual().Y&& p1.getPosActual().X + 1 == p2.getPosActual().X) || (p1.getPosActual().Y - 2 == p2.getPosActual().Y&& p1.getPosActual().X + 2 == p2.getPosActual().X) || (p1.getPosActual().Y - 3 == p2.getPosActual().Y&& p1.getPosActual().X + 3 == p2.getPosActual().X) || (p1.getPosActual().Y - 4 == p2.getPosActual().Y&& p1.getPosActual().X + 4 == p2.getPosActual().X) || (p1.getPosActual().Y + 1 == p2.getPosActual().Y&& p1.getPosActual().X + 1 == p2.getPosActual().X) || (p1.getPosActual().Y + 2 == p2.getPosActual().Y&& p1.getPosActual().X + 2 == p2.getPosActual().X) || (p1.getPosActual().Y + 3 == p2.getPosActual().Y&& p1.getPosActual().X + 3 == p2.getPosActual().X) || (p1.getPosActual().Y + 4 == p2.getPosActual().Y&& p1.getPosActual().X + 4 == p2.getPosActual().X) || (p1.getPosActual().Y - 1 == p2.getPosActual().Y&& p1.getPosActual().X - 1 == p2.getPosActual().X) || (p1.getPosActual().Y - 2 == p2.getPosActual().Y&& p1.getPosActual().X - 2 == p2.getPosActual().X) || (p1.getPosActual().Y - 3 == p2.getPosActual().Y&& p1.getPosActual().X - 3 == p2.getPosActual().X) || (p1.getPosActual().Y - 4 == p2.getPosActual().Y&& p1.getPosActual().X - 4 == p2.getPosActual().X) || (p1.getPosActual().Y - 1 == p2.getPosActual().Y&& p1.getPosActual().X - 1 == p2.getPosActual().X) || (p1.getPosActual().Y - 2 == p2.getPosActual().Y&& p1.getPosActual().X - 2 == p2.getPosActual().X) || (p1.getPosActual().Y - 3 == p2.getPosActual().Y&& p1.getPosActual().X - 3 == p2.getPosActual().X) || (p1.getPosActual().Y - 4 == p2.getPosActual().Y&& p1.getPosActual().X - 4 == p2.getPosActual().X)) { p1.setR(p1.getR() + 5); lParticulas.Clear(); //TODO: Si se comieron la presa detengo todo el proceso numericUpPosPresa.Enabled = true; viva = false; MessageBox.Show("-=LA PARTICULA FUE DEVORADA=-"); totalVertices = disponibles = g.getLV().Count; //< Reinicio el contador para insertar más vOcupados.Clear(); pictureImageGrafo.Refresh(); graphics.Clear(Color.Transparent); } } } } } } else //si ya termino cambio el origen { p.setCOri(p.getCOri() + 1); p.setCDes(p.getCDes() + 1); p.setContador(0); int auxPos = p.getLVertices()[p.getCDes() - 1].getId(); if (p.getCDes() == p.getLVertices().Count) //Si el destino es el ultimo en la lista elimino la particula { point.X = 0; point.Y = 0; p.setPosActual(point); lParticulas.Clear(); //TODO: Si llego al final el vertice final será el nuevo origen, deberia cambiar los numericUp viva = false; //MessageBox.Show("La presa llego a su destino, seleccione uno nuevo"); numericUpPosPresa.Value = auxPos; numericUpPosPresa.Enabled = false; refresh = false; MessageBox.Show("-=LA PARTICULA LLEGO A SU DESTINO=-"); totalVertices = disponibles = g.getLV().Count; //< Reinicio el contador para insertar más vOcupados.Clear(); buttonDepre.Enabled = false; } } p.setContador(p.getContador() + 5); } if (refresh) { pictureImageGrafo.Refresh(); graphics.Clear(Color.Transparent); } vueltas++; } } }
private void rAmplitudCompleto(Vertice origen) { Queue <Vertice> cola = new Queue <Vertice>(); camino = new List <Vertice>(); Vertice [] provenientes = new Vertice[graf.getLV().Count + 1]; List <Vertice> visitados = new List <Vertice>(); //Para cada deprededadora cola.Enqueue(origen); visitados.Add(origen); //provenientes[x] = new Vertice(); provenientes[origen.getId() - 1] = null; Vertice v_o = new Vertice(); Vertice v_d = new Vertice(); Vertice auxv_o = new Vertice(); Vertice auxv_d; // = new Vertice(); List <Vertice> camino1 = new List <Vertice>(); List <Vertice> camino2 = new List <Vertice>(); Stack <Vertice> pilaAux = new Stack <Vertice>(); while (visitados.Count != graf.getLV().Count) { foreach (Arista a_i in origen.getLA()) { Vertice dest = a_i.getDestino(); if (!visitados.Contains(dest)) { cola.Enqueue(dest); visitados.Add(dest); provenientes[dest.getId()] = origen; while (auxv_o != null) { if (provenientes[auxv_o.getId()] != null) { camino1.Add(provenientes[auxv_o.getId()]); } auxv_o = provenientes[auxv_o.getId()]; } auxv_d = dest; while (provenientes[auxv_d.getId()] != null) { pilaAux.Push(provenientes[auxv_d.getId()]); auxv_d = provenientes[auxv_d.getId()]; } while (pilaAux.Count != 0) //Voltea el camino { camino2.Add(pilaAux.Pop()); } //solo si existen dos caminos if (camino1.Count != 0) { if (camino2.Count != 0) { camino.AddRange(combinaCaminos(camino1, camino2)); } else { camino.AddRange(camino1); } } else { camino.AddRange(camino2); } camino.Add(dest); //Add camino1.Clear(); camino2.Clear(); auxv_o = auxv_d; } } cola.Dequeue(); origen = cola.First(); } }
public List <Vertice> getRecorridoProfundidad(Vertice origen) { recorridoProfundidad(origen); return(recorrido); }
public List <Vertice> getRecorridoAmplitud(Vertice origen) { rAmplitudCompleto(origen); rAmptermina(); return(camino); }
public void insertaArista(Vertice destino, Vertice origen, double distanciaA, List <Point> lpo) { Arista a = new Arista(destino, origen, distanciaA, lpo); la.Add(a); }
void hazPrim(Vertice origen) { double pesoTotal = 0; bmpGrafo = new Bitmap(imgGrafo); List <Arista> C = new List <Arista>(graf.getLA()); //< Candidatos, con la lista de aristas List <Arista> PSolucion = new List <Arista>(); //< Solucion con las posibles aristas List <Vertice> visitados = new List <Vertice>(); //< Vertices que ya fueron visitados visitados.Add(origen); if (C.Count == 0) { return; } C.Sort( delegate(Arista p1, Arista p2) { return(p1.getDistancia().CompareTo(p2.getDistancia())); } ); while (visitados.Count < graf.getLV().Count) { Arista a = new Arista(); a = aristaSaliente(visitados, C); //Me regresa la arista menor //Si me regresa una arista dummy es porque termino una isla y no hay más vertices if (a.getDistancia() == double.MaxValue) { visitados.Add(buscarIsla(visitados, C)); //Busco una "isla", que me regresa un vertice y lo añado a visitadis continue; } PSolucion.Add(a); // Añado a mi solucion la arista //Añado el vertice de la arista dependiendo de cual haga falta if (visitados.Contains(a.getOrigen())) { visitados.Add(a.getDestino()); } else { visitados.Add(a.getOrigen()); } } //Dibujo las aristas de un color diferente y sumo las distancias de todas mis aristas para marcar el peso total del arbol Graphics gra = Graphics.FromImage(bmpGrafo); Pen lapiz = new Pen(Color.Blue, 10); for (int i = 0; i < PSolucion.Count; i++) { try{ gra.DrawLine(lapiz, PSolucion[i].getOrigen().getCircle().getP().X, PSolucion[i].getOrigen().getCircle().getP().Y, PSolucion[i].getDestino().getCircle().getP().X, PSolucion[i].getDestino().getCircle().getP().Y); }catch (Exception ex) {} } foreach (Arista a in PSolucion) { pesoTotal += a.getDistancia(); } listBoxPRIM.DataSource = null; listBoxPRIM.DataSource = PSolucion; labelPesoPRIM.Text = "Peso Total: " + Math.Round(pesoTotal, 4); pictureImagePRIM.Image = bmpGrafo; }