示例#1
0
        //------------------------------------------------------------------------------
        public void Triangular()
        {
            // Asignar vecinos a los nodos usando Triangulación de Delaunay
            // Algoritmo de fuerza bruta

            int n = nodos.Count(); //número de nodos

            // revisar todas las combinaciones de 3 nodos
            for (int i = 0; i < (n - 2); i++)
            {
                for (int j = (i + 1); j < (n - 1); j++)
                {
                    for (int k = (j + 1); k < n; k++)
                    {
                        // calcular circunferencia que pasa por los 3 nodos actuales
                        // luego revisar que no hay otro nodo en la circunferencia
                        if (Circunferencia3Nodos(nodos[i], nodos[j], nodos[k]))
                        {
                            if (ComprobarDelaunay(i, j, k) == 1)
                            {
                                // Los 3 nodos son  pueden ser vecinos
                                // revisar que la líneas de conexión no cruzan pixeles negros

                                if (nodos[i].c.PuedeVerA(nodos[j].c))
                                {
                                    nodos[i].Agregar_vecino(nodos[j]);
                                }
                                if (nodos[i].c.PuedeVerA(nodos[k].c))
                                {
                                    nodos[i].Agregar_vecino(nodos[k]);
                                }
                                if (nodos[j].c.PuedeVerA(nodos[k].c))
                                {
                                    nodos[j].Agregar_vecino(nodos[k]);
                                }
                            }
                        }
                        // si no hay circunferencia, entonces los 3 nodos son colineales
                        else
                        {
                            // No agregamos vecinos por ahora
                        }
                    }
                }
            }

            // Dibujar conexiones con los vecinos
            for (int i = 0; i < nodos.Count(); i++)
            {
                Nodo _n = nodos[i];
                for (int j = 0; j < _n.vecino.Count(); j++)
                {
                    nodos[0].c.DibujarLinea(
                        (float)_n.x,
                        (float)_n.y,
                        (float)_n.vecino[j].x,
                        (float)_n.vecino[j].y,
                        Color.YellowGreen);
                }
            }
        }
示例#2
0
        //------------------------------------------------------------------------------
        public int EjecutarDijkstra(Nodo inicio, Nodo meta)
        {
            // Dejecutar algoritmo de Dijkstra (sobre la lista de nodos)

            // En este momento todos los nodos de la lista tienen
            // dist = -1
            // padre = null
            // visto = false

            if (inicio == null || meta == null)
            {
                Console.WriteLine("Falta inicio y/o meta!");
                return(0);
            }

            inicio.dist = 0;         //distancia cero
            cola.Add(inicio);        //agregar inicio a la cola
            Nodo   actual;           //se usará en el ciclo
            double dTemp;            //distancia temporal (tentativa)

            while (cola.Count() > 0) //mientras la cola contiene nodos
            {
                actual = cola[0];    //extraer nodo
                cola.RemoveAt(0);    //borrar
                actual.visto = true; //se marca como visto

                if (actual == meta)  //llegamos a la meta
                {
                    Console.WriteLine("Algoritmo completado");
                    return(1);
                }

                // si no hemos llegado a la meta, continuar
                foreach (Nodo v in actual.vecino)
                {
                    if (v.visto == false)
                    {
                        dTemp = actual.dist + actual.Distancia_a_nodo(v);
                        if (dTemp < v.dist || v.dist == -1) //si la distancia es menor
                        {
                            v.dist  = dTemp;                //asignar o actualizar distancia
                            v.padre = actual;               //asignar padre

                            bool agregado = false;
                            for (int j = 0; j < cola.Count; j++) //recorrer cola
                            {
                                if (cola[j].dist > v.dist)       //si el valor de un elemento en el conjunto es mayor al valor de v
                                {
                                    cola.Insert(j, v);           //insertar para ocupar su posición
                                    agregado = true;             //ya está agregado
                                    break;                       //terminar for
                                }
                            }
                            //si no se agregó en el for anterior, es porque el conjunto está vacío o no hay un nodo con f mayor
                            //agregar en la última posición
                            if (agregado == false)
                            {
                                cola.Add(v);
                            }
                        }
                    }
                }
            }
            Console.WriteLine("No hay solución");
            return(0);
        }