none
Operaciones con aristas/arcos en grafos RRS feed

  • Pregunta

  • Buenas tardes programadores. Esta vez vengo con una duda relacionada con mi pregunta anterior, con la representación grafica de un grafo.

    Resulta que quiero hace 3 operaciones con las aristas/arcos del grafo. Estas operaciones son:

    1) Eliminacion de aristas

    2) Subdivisión de aristas

    3) Contraccion de aristas

    Les dejo el código donde dibujo las aristas, el cual esta en la clase Nodo/Vertice, al igual que el codigo de la clase Arista.

    public class Nodo
        {
            static int orden = 0;
    
            public string listaAdy = " ";
            public int num;
            public Point centro;
            public int radio;
            public Rectangle rec;
            public GraphicsPath gP;
            public Pen circulo;
            public Pen linea;
            public Pen lineaND;
            public Font letra;
            public List<Nodo> conectados;
            public Grafo queGrafo;
            public String color = " ";
            List<string> colores = new List<string> { "azul", "rojo", "verde", "amarillo", "gris", "rosa", "morado", "cafe", "naranja", "negro", "blanco" };
    
            public Nodo(int x, int y, int r, Grafo g, int n)
            {
                centro = new Point(x, y);
                radio = r;
                queGrafo = g;
                rec = new Rectangle(x - r, y - r, 2 * r, 2 * r);
                gP = new GraphicsPath();
                gP.AddEllipse(rec);
                circulo = new Pen(Brushes.Blue, 3);
                letra = new Font("Arial", 12);
                num = n;
                conectados = new List<Nodo>();
                linea = new Pen(Brushes.Black);
                lineaND = new Pen(Brushes.Black);
                linea.Width = 4;
                lineaND.Width = 4;
                GraphicsPath gPLinea = new GraphicsPath();
                gPLinea.AddLine(new Point(0, 0), new Point(6, -6));
                gPLinea.AddLine(new Point(0, 0), new Point(-6, -6));
                linea.CustomEndCap = new CustomLineCap(null, gPLinea);
            }
    
            public virtual void dibujaNodo(Graphics g)
            {
                g.FillPath(Brushes.White, gP);
                g.DrawPath(circulo, gP);
                g.DrawString(num.ToString(), letra, Brushes.Black, rec, new StringFormat { Alignment = StringAlignment.Center, LineAlignment = StringAlignment.Center });
            }
    
            public virtual void dibujaArista(Graphics g)
            {
                foreach (Nodo item in conectados)
                {
                    double tan = (double)(centro.Y - item.centro.Y) / (item.centro.X - centro.X);
                    double arctan = Math.Atan(tan);
    
                    int a = (int)(radio * Math.Cos(arctan));
                    int b = (int)(radio * Math.Sin(arctan));
    
                    if ((centro.X < item.centro.X))
                    {
                        a *= -1;
                        b *= -1;
                    }
    
                    Point p = new Point(item.centro.X + a, item.centro.Y - b);
                    g.DrawLine(linea, centro, p);
                }
            }
    
            public virtual void dibujaAristaND(Graphics g)
            {
                foreach (Nodo item in conectados)
                {
                    double tan = (double)(centro.Y - item.centro.Y) / (item.centro.X - centro.X);
                    double arctan = Math.Atan(tan);
    
                    int a = (int)(radio * Math.Cos(arctan));
                    int b = (int)(radio * Math.Sin(arctan));
    
                    if ((centro.X < item.centro.X))
                    {
                        a *= -1;
                        b *= -1;
                    }
    
                    Point p = new Point(item.centro.X + a, item.centro.Y - b);
                    g.DrawLine(lineaND, centro, p);
                }
     
                        public void conectaNodo(Nodo n)
            {
                conectados.Add(n);
            }
    
            public void desconectarNodo(Nodo n)
            {
                conectados.Remove(n);
            }
    }

    public class Arista
        {
            static int orden = 0;
    
            public int peso;
            public Nodo origen;
            public Nodo destino;
            public int id;
    
            public Arista(Nodo or, Nodo des)
            {
                origen = or;
                destino = des;
                id = ++orden;
            }
        }

    Para poder dibujar un nodo, simplemente hago doble click sobre el area de dibujo, en el caso de las aristas/arcos, simplemente hago click en un nodo y despues sobre otro.

    Si necesitan mas informacion, haganmelo saber en este post. Muchas gracias por su ayuda.

    domingo, 11 de octubre de 2015 2:46

Respuestas

  • hola

    el temas es que si suas GDI reaccionar a los eventos es complejo para poder eliminar un nodo

    porque no usaste el control de formas y lineas de VS ?

    imagen

    sino tienes estos controles solo debes instalar el power pack

    con los controles si podras tener eventos que unas a clases y realizar acciones, agregando o eliminando

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    domingo, 11 de octubre de 2015 5:01