private void splitContainer1_Panel2_MouseDown(object sender, MouseEventArgs e) { if (Agregar) //si el usuario presiono el boton agregar { clsPunto punto = new clsPunto(); //creamos un objeto de la clase clspunto punto.P_id = contador; ////el objeto punto en su propiedad p_id le asignamos el valor de contador punto.Text = Convert.ToString(contador); //asignamos lo que se va a mostra de texto en el control punto.Width = 40; //establecemos el ancho del control punto.Height = 15; //establecemos el alto punto.P_acumulado = 0; //establecemos el valor acumulado por defaul es 0 punto.P_procedencia = 0; //establecemos la procedencia por default es 0 punto.Location = new Point(e.X, e.Y); //ponemos las coordenadas en las que se va amostrar el control punto.BackColor = Color.YellowGreen; //establecemos el color de fondo del control punto.Click += new System.EventHandler(this.label_click); //agregamos un nuevo evento (CLICK) el control creado Puntos[contador] = punto; //agregamos el objeto al arreglo de objetos de la clase clsPunto splitContainer1.Panel2.Controls.Add(Puntos[contador]); //agregamos el control al panel2 de control Split contador += 1; //incrementamos el contador } }
private void label_click(object sender, EventArgs e) { clsPunto l = sender as clsPunto; //convertimos el objeto sender a un tipo de clsPunto //comparamos si la variable es false es que no ha seleccionado un origen if (Origen == false) { //guardamos en variables ciertos valores que nos van a hacer falta ID = l.P_id; Pro = l.P_procedencia; Acu = l.P_acumulado; X = l.Location.X; Y = l.Location.Y; Origen = true; Destino = false; return; } else if (Destino == false) { //chacamos si selecciono la misma etiqueta if (ID == l.P_id) { //Seleccionar_destino = true; Destino = false; Origen = false; return; } //generar el numero aleatorio (Distancia Origen-Destino) //esta parte es muy importante ya que yo ga los calculos de la distancia con un random, en el caso de que //los valores se ingresaran manualmente solo habia de cambiar un linea de codigo ejeplo de como quedaria //si el valor(distancia) la ingrrsaramoa atravez de una caja de Texto //Distancia = int.Parse(txtdistacia.text); //solo nos faltaria agregar la caja de texto al programa y llamarla txtdistancia Random rnd = new Random(); Distancia = rnd.Next(3, 15); //generamos el numero en un rango del 3 al 15 lbxdistancias.Items.Add(Convert.ToString(ID) + "," + Convert.ToString(l.P_id) + " = " + Convert.ToString(Distancia)); //agregamos al listbox el origen, destino y su respectiva distancia entre ambos puntos int nuevo_acumulado = Acu + Distancia; //calculamos la nueva distancia if (l.P_acumulado <= 0) //chhecamos si la distancia del objeto al cual le dimos click es <=0 { //esto indica que el punto no a sido unido con ningun otro punto l.P_acumulado = nuevo_acumulado; //agregamos la nueva distancia l.P_procedencia = ID; //y colocamos la procedencia (De donde viene) } else//de lo contrario { //Esto sucede cuando ya hallamos unido este punto con otro punto y por ende el valor de su distancia ya no es cero // if (nuevo_acumulado <= l.P_acumulado) //checamos si la distancia acumulada es menor que la distancia que tiene el objeto alcual le dimos clik { //esto lo hacemos ya que si la distancia que tiene es menor que la distancia calculada del punto d procedencia + la neva aleatoria l.P_acumulado = nuevo_acumulado; //colocamos la nueva distancia "que es menor -> calculando ruta mas corta" l.P_procedencia = ID; //asignamos la procedencia } } //mostramos informacion de como quedo el nuevo punto l.Text = Convert.ToString(l.P_id) + "[" + Convert.ToString(l.P_acumulado) + "," + Convert.ToString(l.P_procedencia) + "]"; // l.Text = Convert.ToString(l.P_id); //dibujamos la linea System.Drawing.Graphics milapiz = splitContainer1.Panel2.CreateGraphics(); Pen lapiz = new Pen(Color.Black); milapiz.DrawLine(lapiz, X, Y, l.Location.X, l.Location.Y); Origen = false; Destino = true; return; } else if (Seleccionar_destino) //si el usuario a decidodo que el sistema trace la ruta mas corta seleccionara cual cera el punto destino { // por default el sistema tomara que el punto de inicio es el punto 0 //Nota: Tomar en cuenta que el trazado de cual es la ruta mas corta se hace del nodo destino hacia el nodo Origen (Raiz) l.BackColor = Color.Red; //marcamos de color rojo el destino System.Drawing.Graphics milapiz = splitContainer1.Panel2.CreateGraphics(); //creamos un nuevo objeto para dibujar la linea Pen lapiz = new Pen(Color.Yellow, 2); //trazamos nuevamente la linea que indica la ruta mas conrta del Origen 0 al destino Seleccionado clsPunto pt = Puntos [l.P_procedencia] as clsPunto; ID3 = l.P_procedencia; milapiz.DrawLine(lapiz, l.Location.X, l.Location.Y, pt.Location.X, pt.Location.Y); //esta linea es la primera entre el destino y el punto anterior al que haga referencia lblruta.Text = l.P_id.ToString() + l.P_procedencia.ToString(); int s = 0; for (int i = contador - 1; i >= 0; i--) //recorremo el numero de nodos que esta dado por la variable contador { clsPunto p = Puntos [ID3] as clsPunto; //convertimos el objeto actual a uno de tipo clsPunto // MessageBox.Show("p " + Convert.ToString(p.P_procedencia)); if (p.P_procedencia != 1) //checamos si la propiedad procedencia es diferente a cero esto indicaria que el siguiente punto no es el origen (Raiz) { clsPunto p1 = Puntos[p.P_procedencia] as clsPunto; //convertimos a tipo clsPunto el objeto del arreglo al cual tiene como referencia el objeto actual // MessageBox.Show("p1 " + Convert.ToString(p1.P_procedencia)); milapiz.DrawLine(lapiz, p.Location.X, p.Location.Y, p1.Location.X, p1.Location.Y); //dibujamos la linea lblruta.Text = lblruta.Text + p1.P_id.ToString(); ID3 = p1.P_id; //obtengo en que punto me quede para poder trazar la ultima linea que unira el punto raiz con el que corresponda X = p1.Location.X; Y = p1.Location.Y; s += 1; } else { clsPunto p1 = Puntos[0] as clsPunto; //convertimos el objeto (Raiz) a tipo clsPunto clsPunto p2 = Puntos[ID3] as clsPunto; milapiz.DrawLine(lapiz, p.Location.X, p.Location.Y, p2.Location.X, p2.Location.Y); //dibujamos la ultima linea lblruta.Text += p2.P_id; return; } } int cont = 0; string ord; for (int cad = 0; cad <= lblruta.Text.Length - 1; cad++) { if (int.Parse(lblruta.Text.Substring(cad, 1)) >= 1) { cont += 1; } } lblruta.Text = lblruta.Text.Substring(0, cont) + "0"; } }