예제 #1
0
        public List <List <int> > Ordenar(int[,] matriz_binaria, int[] coordenada_inicial)
        {
            List <List <int> > coordenadas_resultantes = new List <List <int> >();
            List <int>         coordenadas_pendientes = new List <int>();
            List <int>         coordenadas = new List <int> {
            }, vecino_siguiente = new List <int> {
            }, vecinos_no_contorno, vecinos = new List <int> {
            };
            List <int> coordenadas_repetidas = new List <int> {
            };

            coordenadas.Add(coordenada_inicial[0]);
            coordenadas.Add(coordenada_inicial[1]);
            int  contador_direcciones = 0, direccion = 0, i = coordenada_inicial[0], j = coordenada_inicial[1];
            bool entre = false, es_contorno = true, encontre_siguiente = false; //false =  no es contorno
            BuscarCoordenadas buscar_coordenadas = new BuscarCoordenadas();

            int[] penultimo = new int[2];
            //int[,] vecinos = new int[3,3];
            //0-.- der.
            //1\.- abajo-der.
            //2|.- abajo.
            //3/.- abajo-izq.
            //4-.- izq.
            //5\.- arriba-izq.
            //6|.- arriba.
            //7/.- arriba-der.
            //Aqui es donde debemos de organizar los diferentes contornos de la imagen.
            matriz_binaria[coordenada_inicial[0], coordenada_inicial[1]] = 5;
            penultimo = buscar_coordenadas.Buscar_Penultimopixel(matriz_binaria, coordenada_inicial);
            do
            {
                if (vecinos.Count > 0)
                {
                    if (matriz_binaria[i, j] != 1 && penultimo[0] == i && penultimo[1] == j)
                    {
                        entre = true;
                    }
                    matriz_binaria[i, j] = 6;
                    coordenadas.Add(i);
                    coordenadas.Add(j);
                    if ((penultimo[0] == i && penultimo[1] == j && coordenadas_repetidas.Count > 0) || (penultimo[0] == i && penultimo[1] == j && coordenadas.Count > 4))
                    {
                        if (entre)
                        {
                            if (coordenadas.Count > 4)
                            {
                                coordenadas.Add(-1);
                            }
                        }
                        break;
                    }
                    while (coordenadas_repetidas.Count != 0)
                    {
                        coordenadas_repetidas.RemoveAt(0);
                    }
                }
                while (vecinos.Count != 0)
                {
                    vecinos.RemoveAt(0);
                }
                encontre_siguiente = false;
                switch (direccion)
                {
                case 0:
                    if (j + 1 < matriz_binaria.GetLength(1))
                    {
                        if (i - 1 >= 0)
                        {
                            if (matriz_binaria[i - 1, j + 1] == 1 || matriz_binaria[i - 1, j + 1] == 5)
                            {
                                contador_direcciones = 0;
                                vecinos.Add(i - 1);
                                vecinos.Add(j + 1);
                                vecinos.Add(7);
                                encontre_siguiente = true;

                                while (coordenadas_repetidas.Count != 0)
                                {
                                    coordenadas_repetidas.RemoveAt(0);
                                }
                            }
                            else
                            {
                                if (matriz_binaria[i - 1, j + 1] == 6 && coordenadas_repetidas.Count == 0)
                                {
                                    coordenadas_repetidas.Add(i - 1);
                                    coordenadas_repetidas.Add(j + 1);
                                    coordenadas_repetidas.Add(7);
                                }
                            }
                        }
                        if ((matriz_binaria[i, j + 1] == 1 || matriz_binaria[i, j + 1] == 5) && !encontre_siguiente)
                        {
                            contador_direcciones = 0;
                            vecinos.Add(i);
                            vecinos.Add(j + 1);
                            vecinos.Add(0);
                            encontre_siguiente = true;
                            while (coordenadas_repetidas.Count != 0)
                            {
                                coordenadas_repetidas.RemoveAt(0);
                            }
                        }
                        if (matriz_binaria[i, j + 1] == 6 && coordenadas_repetidas.Count == 0)
                        {
                            coordenadas_repetidas.Add(i);
                            coordenadas_repetidas.Add(j + 1);
                            coordenadas_repetidas.Add(0);
                        }
                        if (i + 1 < matriz_binaria.GetLength(0) && !encontre_siguiente)
                        {
                            if (matriz_binaria[i + 1, j + 1] == 1 || matriz_binaria[i + 1, j + 1] == 5)
                            {
                                contador_direcciones = 0;
                                vecinos.Add(i + 1);
                                vecinos.Add(j + 1);
                                vecinos.Add(1);
                                encontre_siguiente = true;
                                while (coordenadas_repetidas.Count != 0)
                                {
                                    coordenadas_repetidas.RemoveAt(0);
                                }
                            }
                            else
                            {
                                if (matriz_binaria[i + 1, j + 1] == 6 && coordenadas_repetidas.Count == 0)
                                {
                                    coordenadas_repetidas.Add(i + 1);
                                    coordenadas_repetidas.Add(j + 1);
                                    coordenadas_repetidas.Add(1);
                                }
                            }
                        }
                    }
                    break;

                case 1:
                    if (j + 1 < matriz_binaria.GetLength(1))
                    {
                        if (matriz_binaria[i, j + 1] == 1 || matriz_binaria[i, j + 1] == 5)
                        {
                            contador_direcciones = 0;
                            vecinos.Add(i);
                            vecinos.Add(j + 1);
                            vecinos.Add(0);
                            encontre_siguiente = true;
                            while (coordenadas_repetidas.Count != 0)
                            {
                                coordenadas_repetidas.RemoveAt(0);
                            }
                        }
                        if (matriz_binaria[i, j + 1] == 6 && coordenadas_repetidas.Count == 0)
                        {
                            coordenadas_repetidas.Add(i);
                            coordenadas_repetidas.Add(j + 1);
                            coordenadas_repetidas.Add(0);
                        }
                        if (i + 1 < matriz_binaria.GetLength(0) && !encontre_siguiente)
                        {
                            if (matriz_binaria[i + 1, j + 1] == 1 || matriz_binaria[i + 1, j + 1] == 5)
                            {
                                contador_direcciones = 0;
                                vecinos.Add(i + 1);
                                vecinos.Add(j + 1);
                                vecinos.Add(1);
                                encontre_siguiente = true;
                                while (coordenadas_repetidas.Count != 0)
                                {
                                    coordenadas_repetidas.RemoveAt(0);
                                }
                            }
                            else
                            {
                                if (matriz_binaria[i + 1, j + 1] == 6 && coordenadas_repetidas.Count == 0)
                                {
                                    coordenadas_repetidas.Add(i + 1);
                                    coordenadas_repetidas.Add(j + 1);
                                    coordenadas_repetidas.Add(1);
                                }
                            }
                        }
                    }
                    if (i + 1 < matriz_binaria.GetLength(0) && !encontre_siguiente)
                    {
                        if (matriz_binaria[i + 1, j] == 1 || matriz_binaria[i + 1, j] == 5)
                        {
                            contador_direcciones = 0;
                            vecinos.Add(i + 1);
                            vecinos.Add(j);
                            vecinos.Add(2);
                            encontre_siguiente = true;
                            while (coordenadas_repetidas.Count != 0)
                            {
                                coordenadas_repetidas.RemoveAt(0);
                            }
                        }
                        else
                        {
                            if (matriz_binaria[i + 1, j] == 6 && coordenadas_repetidas.Count == 0)
                            {
                                coordenadas_repetidas.Add(i + 1);
                                coordenadas_repetidas.Add(j);
                                coordenadas_repetidas.Add(2);
                            }
                        }
                    }
                    break;

                case 2:
                    if (i + 1 < matriz_binaria.GetLength(0))
                    {
                        if (j + 1 < matriz_binaria.GetLength(1))
                        {
                            if (matriz_binaria[i + 1, j + 1] == 1 || matriz_binaria[i + 1, j + 1] == 5)
                            {
                                contador_direcciones = 0;
                                vecinos.Add(i + 1);
                                vecinos.Add(j + 1);
                                vecinos.Add(1);
                                encontre_siguiente = true;
                                while (coordenadas_repetidas.Count != 0)
                                {
                                    coordenadas_repetidas.RemoveAt(0);
                                }
                            }
                            else
                            {
                                if (matriz_binaria[i + 1, j + 1] == 6 && coordenadas_repetidas.Count == 0)
                                {
                                    coordenadas_repetidas.Add(i + 1);
                                    coordenadas_repetidas.Add(j + 1);
                                    coordenadas_repetidas.Add(1);
                                }
                            }
                        }
                        if ((matriz_binaria[i + 1, j] == 1 || matriz_binaria[i + 1, j] == 5) && !encontre_siguiente)
                        {
                            contador_direcciones = 0;
                            vecinos.Add(i + 1);
                            vecinos.Add(j);
                            vecinos.Add(2);
                            encontre_siguiente = true;
                            while (coordenadas_repetidas.Count != 0)
                            {
                                coordenadas_repetidas.RemoveAt(0);
                            }
                        }
                        if (matriz_binaria[i + 1, j] == 6 && coordenadas_repetidas.Count == 0)
                        {
                            coordenadas_repetidas.Add(i + 1);
                            coordenadas_repetidas.Add(j);
                            coordenadas_repetidas.Add(2);
                        }
                        if (j - 1 >= 0 && !encontre_siguiente)
                        {
                            if (matriz_binaria[i + 1, j - 1] == 1 || matriz_binaria[i + 1, j - 1] == 5)
                            {
                                contador_direcciones = 0;
                                vecinos.Add(i + 1);
                                vecinos.Add(j - 1);
                                vecinos.Add(3);
                                encontre_siguiente = true;
                                while (coordenadas_repetidas.Count != 0)
                                {
                                    coordenadas_repetidas.RemoveAt(0);
                                }
                            }
                            else
                            {
                                if (matriz_binaria[i + 1, j - 1] == 6 && coordenadas_repetidas.Count == 0)
                                {
                                    coordenadas_repetidas.Add(i + 1);
                                    coordenadas_repetidas.Add(j - 1);
                                    coordenadas_repetidas.Add(3);
                                }
                            }
                        }
                    }
                    break;

                case 3:
                    if (i + 1 < matriz_binaria.GetLength(0))
                    {
                        if (matriz_binaria[i + 1, j] == 1 || matriz_binaria[i + 1, j] == 5)
                        {
                            contador_direcciones = 0;
                            vecinos.Add(i + 1);
                            vecinos.Add(j);
                            vecinos.Add(2);
                            encontre_siguiente = true;
                            while (coordenadas_repetidas.Count != 0)
                            {
                                coordenadas_repetidas.RemoveAt(0);
                            }
                        }
                        if (matriz_binaria[i + 1, j] == 6 && coordenadas_repetidas.Count == 0)
                        {
                            coordenadas_repetidas.Add(i + 1);
                            coordenadas_repetidas.Add(j);
                            coordenadas_repetidas.Add(2);
                        }
                        if (j - 1 >= 0 && !encontre_siguiente)
                        {
                            if (matriz_binaria[i + 1, j - 1] == 1 || matriz_binaria[i + 1, j - 1] == 5)
                            {
                                contador_direcciones = 0;
                                vecinos.Add(i + 1);
                                vecinos.Add(j - 1);
                                vecinos.Add(3);
                                encontre_siguiente = true;
                                while (coordenadas_repetidas.Count != 0)
                                {
                                    coordenadas_repetidas.RemoveAt(0);
                                }
                            }
                            else
                            {
                                if (matriz_binaria[i + 1, j - 1] == 6 && coordenadas_repetidas.Count == 0)
                                {
                                    coordenadas_repetidas.Add(i + 1);
                                    coordenadas_repetidas.Add(j - 1);
                                    coordenadas_repetidas.Add(3);
                                }
                            }
                        }
                    }
                    if (j - 1 >= 0 && !encontre_siguiente)
                    {
                        if (matriz_binaria[i, j - 1] == 1 || matriz_binaria[i, j - 1] == 5)
                        {
                            contador_direcciones = 0;
                            vecinos.Add(i);
                            vecinos.Add(j - 1);
                            vecinos.Add(4);
                            encontre_siguiente = true;
                            while (coordenadas_repetidas.Count != 0)
                            {
                                coordenadas_repetidas.RemoveAt(0);
                            }
                        }
                        else
                        {
                            if (matriz_binaria[i, j - 1] == 6 && coordenadas_repetidas.Count == 0)
                            {
                                coordenadas_repetidas.Add(i);
                                coordenadas_repetidas.Add(j - 1);
                                coordenadas_repetidas.Add(4);
                            }
                        }
                    }
                    break;

                case 4:
                    if (j - 1 >= 0)
                    {
                        if (i + 1 < matriz_binaria.GetLength(0))
                        {
                            if (matriz_binaria[i + 1, j - 1] == 1 || matriz_binaria[i + 1, j - 1] == 5)
                            {
                                contador_direcciones = 0;
                                vecinos.Add(i + 1);
                                vecinos.Add(j - 1);
                                vecinos.Add(3);
                                encontre_siguiente = true;
                                while (coordenadas_repetidas.Count != 0)
                                {
                                    coordenadas_repetidas.RemoveAt(0);
                                }
                            }
                            else
                            {
                                if (matriz_binaria[i + 1, j - 1] == 6 && coordenadas_repetidas.Count == 0)
                                {
                                    coordenadas_repetidas.Add(i + 1);
                                    coordenadas_repetidas.Add(j - 1);
                                    coordenadas_repetidas.Add(3);
                                }
                            }
                        }
                        if ((matriz_binaria[i, j - 1] == 1 || matriz_binaria[i, j - 1] == 5) && !encontre_siguiente)
                        {
                            contador_direcciones = 0;
                            vecinos.Add(i);
                            vecinos.Add(j - 1);
                            vecinos.Add(4);
                            encontre_siguiente = true;
                            while (coordenadas_repetidas.Count != 0)
                            {
                                coordenadas_repetidas.RemoveAt(0);
                            }
                        }
                        if (matriz_binaria[i + 1, j - 1] == 6 && coordenadas_repetidas.Count == 0)
                        {
                            coordenadas_repetidas.Add(i);
                            coordenadas_repetidas.Add(j - 1);
                            coordenadas_repetidas.Add(4);
                        }
                        if (i - 1 >= 0 && !encontre_siguiente)
                        {
                            if (matriz_binaria[i - 1, j - 1] == 1 || matriz_binaria[i - 1, j - 1] == 5)
                            {
                                contador_direcciones = 0;
                                vecinos.Add(i - 1);
                                vecinos.Add(j - 1);
                                vecinos.Add(5);
                                encontre_siguiente = true;
                                while (coordenadas_repetidas.Count != 0)
                                {
                                    coordenadas_repetidas.RemoveAt(0);
                                }
                            }
                            else
                            {
                                if (matriz_binaria[i - 1, j - 1] == 6 && coordenadas_repetidas.Count == 0)
                                {
                                    coordenadas_repetidas.Add(i - 1);
                                    coordenadas_repetidas.Add(j - 1);
                                    coordenadas_repetidas.Add(5);
                                }
                            }
                        }
                    }
                    break;

                case 5:
                    if (j - 1 >= 0)
                    {
                        if (matriz_binaria[i, j - 1] == 1 || matriz_binaria[i, j - 1] == 5)
                        {
                            contador_direcciones = 0;
                            vecinos.Add(i);
                            vecinos.Add(j - 1);
                            vecinos.Add(4);
                            encontre_siguiente = true;
                            while (coordenadas_repetidas.Count != 0)
                            {
                                coordenadas_repetidas.RemoveAt(0);
                            }
                        }
                        if (matriz_binaria[i, j - 1] == 6 && coordenadas_repetidas.Count == 0)
                        {
                            coordenadas_repetidas.Add(i);
                            coordenadas_repetidas.Add(j - 1);
                            coordenadas_repetidas.Add(4);
                        }
                        if (i - 1 >= 0 && !encontre_siguiente)
                        {
                            if (matriz_binaria[i - 1, j - 1] == 1 || matriz_binaria[i - 1, j - 1] == 5)
                            {
                                contador_direcciones = 0;
                                vecinos.Add(i - 1);
                                vecinos.Add(j - 1);
                                vecinos.Add(5);
                                encontre_siguiente = true;
                                while (coordenadas_repetidas.Count != 0)
                                {
                                    coordenadas_repetidas.RemoveAt(0);
                                }
                            }
                            else
                            {
                                if (matriz_binaria[i - 1, j - 1] == 6 && coordenadas_repetidas.Count == 0)
                                {
                                    coordenadas_repetidas.Add(i - 1);
                                    coordenadas_repetidas.Add(j - 1);
                                    coordenadas_repetidas.Add(5);
                                }
                            }
                        }
                    }
                    if (i - 1 >= 0 && !encontre_siguiente)
                    {
                        if (matriz_binaria[i - 1, j] == 1 || matriz_binaria[i - 1, j] == 5)
                        {
                            contador_direcciones = 0;
                            vecinos.Add(i - 1);
                            vecinos.Add(j);
                            vecinos.Add(6);
                            encontre_siguiente = true;
                            while (coordenadas_repetidas.Count != 0)
                            {
                                coordenadas_repetidas.RemoveAt(0);
                            }
                        }
                        else
                        {
                            if (matriz_binaria[i - 1, j] == 6 && coordenadas_repetidas.Count == 0)
                            {
                                coordenadas_repetidas.Add(i - 1);
                                coordenadas_repetidas.Add(j);
                                coordenadas_repetidas.Add(6);
                            }
                        }
                    }
                    break;

                case 6:
                    if (i - 1 >= 0)
                    {
                        if (j - 1 >= 0)
                        {
                            if (matriz_binaria[i - 1, j - 1] == 1 || matriz_binaria[i - 1, j - 1] == 5)
                            {
                                contador_direcciones = 0;
                                vecinos.Add(i - 1);
                                vecinos.Add(j - 1);
                                vecinos.Add(5);
                                encontre_siguiente = true;
                                while (coordenadas_repetidas.Count != 0)
                                {
                                    coordenadas_repetidas.RemoveAt(0);
                                }
                            }
                            else
                            {
                                if (matriz_binaria[i - 1, j - 1] == 6 && coordenadas_repetidas.Count == 0)
                                {
                                    coordenadas_repetidas.Add(i - 1);
                                    coordenadas_repetidas.Add(j - 1);
                                    coordenadas_repetidas.Add(5);
                                }
                            }
                        }
                        if ((matriz_binaria[i - 1, j] == 1 || matriz_binaria[i - 1, j] == 5) && !encontre_siguiente)
                        {
                            contador_direcciones = 0;
                            vecinos.Add(i - 1);
                            vecinos.Add(j);
                            vecinos.Add(6);
                            encontre_siguiente = true;
                            while (coordenadas_repetidas.Count != 0)
                            {
                                coordenadas_repetidas.RemoveAt(0);
                            }
                        }
                        if (matriz_binaria[i - 1, j] == 6 && coordenadas_repetidas.Count == 0)
                        {
                            coordenadas_repetidas.Add(i - 1);
                            coordenadas_repetidas.Add(j);
                            coordenadas_repetidas.Add(6);
                        }
                        if (j + 1 < matriz_binaria.GetLength(1) && !encontre_siguiente)
                        {
                            if (matriz_binaria[i - 1, j + 1] == 1 || matriz_binaria[i - 1, j + 1] == 5)
                            {
                                contador_direcciones = 0;
                                vecinos.Add(i - 1);
                                vecinos.Add(j + 1);
                                vecinos.Add(7);
                                encontre_siguiente = true;
                                while (coordenadas_repetidas.Count != 0)
                                {
                                    coordenadas_repetidas.RemoveAt(0);
                                }
                            }
                            else
                            {
                                if (matriz_binaria[i - 1, j + 1] == 6 && coordenadas_repetidas.Count == 0)
                                {
                                    coordenadas_repetidas.Add(i - 1);
                                    coordenadas_repetidas.Add(j + 1);
                                    coordenadas_repetidas.Add(7);
                                }
                            }
                        }
                    }
                    break;

                case 7:
                    if (i - 1 >= 0)
                    {
                        if (matriz_binaria[i - 1, j] == 1 || matriz_binaria[i - 1, j] == 5)
                        {
                            contador_direcciones = 0;
                            vecinos.Add(i - 1);
                            vecinos.Add(j);
                            vecinos.Add(6);
                            encontre_siguiente = true;
                            while (coordenadas_repetidas.Count != 0)
                            {
                                coordenadas_repetidas.RemoveAt(0);
                            }
                        }
                        if (matriz_binaria[i - 1, j] == 6 && coordenadas_repetidas.Count == 0)
                        {
                            coordenadas_repetidas.Add(i - 1);
                            coordenadas_repetidas.Add(j);
                            coordenadas_repetidas.Add(6);
                        }
                        if (j + 1 < matriz_binaria.GetLength(1) && !encontre_siguiente)
                        {
                            if (matriz_binaria[i - 1, j + 1] == 1 || matriz_binaria[i - 1, j + 1] == 5)
                            {
                                contador_direcciones = 0;
                                vecinos.Add(i - 1);
                                vecinos.Add(j + 1);
                                vecinos.Add(7);
                                encontre_siguiente = true;
                                while (coordenadas_repetidas.Count != 0)
                                {
                                    coordenadas_repetidas.RemoveAt(0);
                                }
                            }
                            else
                            {
                                if (matriz_binaria[i - 1, j + 1] == 6 && coordenadas_repetidas.Count == 0)
                                {
                                    coordenadas_repetidas.Add(i - 1);
                                    coordenadas_repetidas.Add(j + 1);
                                    coordenadas_repetidas.Add(7);
                                }
                            }
                        }
                    }
                    if (j + 1 < matriz_binaria.GetLength(1) && !encontre_siguiente)
                    {
                        if (matriz_binaria[i, j + 1] == 1 || matriz_binaria[i, j + 1] == 5)
                        {
                            contador_direcciones = 0;
                            vecinos.Add(i);
                            vecinos.Add(j + 1);
                            vecinos.Add(0);
                            encontre_siguiente = true;
                            while (coordenadas_repetidas.Count != 0)
                            {
                                coordenadas_repetidas.RemoveAt(0);
                            }
                        }
                        else
                        {
                            if (matriz_binaria[i, j + 1] == 6 && coordenadas_repetidas.Count == 0)
                            {
                                coordenadas_repetidas.Add(i);
                                coordenadas_repetidas.Add(j + 1);
                                coordenadas_repetidas.Add(0);
                            }
                        }
                    }
                    break;
                }
                if (vecinos.Count == 0)
                {
                    if (es_contorno)
                    {
                        if (direccion + 1 > 7)
                        {
                            direccion = 0;
                        }
                        else
                        {
                            direccion++;
                        }
                    }
                    else
                    {
                        if (direccion - 1 < 0)
                        {
                            direccion = 7;
                        }
                        else
                        {
                            direccion--;
                        }
                    }
                    contador_direcciones++;
                }
                else
                {
                    vecinos_no_contorno = Validar_vecinos(vecinos, matriz_binaria);
                    if (vecinos_no_contorno.Count > 0)
                    {
                        if (vecinos.Count == 4)
                        {
                            //ubicando pixeles no contorno de la lista vecinos
                            for (int k = 0; k < vecinos.Count; k += 3)
                            {
                                if (vecinos[k] != vecinos_no_contorno[0] || vecinos[k + 1] != vecinos_no_contorno[1])
                                {
                                    if (N8(matriz_binaria, vecinos[k], vecinos[k + 1]) == 2)
                                    {
                                        matriz_binaria[vecinos_no_contorno[0], vecinos_no_contorno[1]] = 5;
                                        coordenadas.Add(vecinos_no_contorno[0]);
                                        coordenadas.Add(vecinos_no_contorno[1]);
                                        i           = vecinos_no_contorno[vecinos[k]];
                                        j           = vecinos_no_contorno[vecinos[k + 1]];
                                        direccion   = vecinos_no_contorno[vecinos[k + 2]];
                                        es_contorno = true;
                                    }
                                }
                            }
                        }
                        else
                        {
                            i           = vecinos_no_contorno[0];
                            j           = vecinos_no_contorno[1];
                            direccion   = vecinos_no_contorno[2];
                            es_contorno = false;
                        }
                    }
                    else
                    {
                        i = vecinos[0];
                        j = vecinos[1];
                        if (vecinos[2] - 2 >= 0)
                        {
                            direccion = vecinos[2] - 2;
                        }
                        else
                        {
                            direccion = 8 + (vecinos[2] - 2);
                        }
                        entre       = false;
                        es_contorno = true;
                    }
                }
                if (contador_direcciones == 8 && coordenadas_repetidas.Count > 0)
                {
                    i = coordenadas_repetidas[0];
                    j = coordenadas_repetidas[1];
                    if (coordenadas_repetidas[2] - 1 >= 0)
                    {
                        direccion = coordenadas_repetidas[2] - 1;
                    }
                    else
                    {
                        direccion = 8 + (coordenadas_repetidas[2] - 1);
                    }
                    entre                = false;
                    es_contorno          = true;
                    contador_direcciones = 0;
                    for (int k = 0; k < coordenadas_repetidas.Count; k++)
                    {
                        vecinos.Add(coordenadas_repetidas[k]);
                    }
                }
            } while (contador_direcciones < 8);
            if (coordenadas[coordenadas.Count - 1] > 0)
            {
                coordenadas.Add(0);
            }
            coordenadas_resultantes.Add(coordenadas);

            coordenadas_resultantes.Add(coordenadas_pendientes);
            return(coordenadas_resultantes);
        }
예제 #2
0
        public string CC_AF8(int[,] Mresolucion, int n, List <string> PDs_alfa_siguiente, bool It_is_file, List <Int32> coordenadas_contorno_archivo)
        {
            BuscarCoordenadas    buscar_coordenadas             = new BuscarCoordenadas();
            List <List <Int32> > coordenadas_contorno_ordenadas = new List <List <Int32> >();
            Ordenar_Contorno     ordenar_Contorno = new Ordenar_Contorno();
            F8 codigof8 = new F8();

            string cadenaAF8 = System.String.Empty, cadenaF8 = System.String.Empty;

            int[] coor_pixel_inicial = new int[3];
            bool  encontre_vector    = false;

            string[] vectorBase = new string[2];

            if (!It_is_file)
            {
                coor_pixel_inicial             = buscar_coordenadas.Buscar_Primerpixel(Mresolucion, n);
                coordenadas_contorno_ordenadas = ordenar_Contorno.Ordenar(Mresolucion, coor_pixel_inicial);
                if (PDs_alfa_siguiente.Count == 0)
                {
                    PDs_alfa_siguiente.Add(coor_pixel_inicial[0].ToString());
                    PDs_alfa_siguiente.Add(coor_pixel_inicial[1].ToString());
                    coor_pixel_inicial = buscar_coordenadas.Buscar_Penultimopixel(Mresolucion, coor_pixel_inicial);
                    PDs_alfa_siguiente.Add(coor_pixel_inicial[0].ToString());
                    PDs_alfa_siguiente.Add(coor_pixel_inicial[1].ToString());
                    coor_pixel_inicial[0] = Convert.ToInt32(PDs_alfa_siguiente[0]);
                    coor_pixel_inicial[1] = Convert.ToInt32(PDs_alfa_siguiente[1]);
                }

                encontre_vector = false;
                if (coor_pixel_inicial[1] + 1 < Mresolucion.GetLength(1))
                {
                    if (Mresolucion[coor_pixel_inicial[0], coor_pixel_inicial[1] + 1] != 0)
                    {
                        vectorBase[0]   = " 0";
                        vectorBase[1]   = " 1";
                        encontre_vector = true;
                    }
                }
                if (coor_pixel_inicial[0] + 1 < Mresolucion.GetLength(0) && coor_pixel_inicial[1] + 1 < Mresolucion.GetLength(1) && !encontre_vector)
                {
                    if (Mresolucion[coor_pixel_inicial[0] + 1, coor_pixel_inicial[1] + 1] != 0)
                    {
                        vectorBase[0]   = " 1";
                        vectorBase[1]   = " 1";
                        encontre_vector = true;
                    }
                }
                if (coor_pixel_inicial[0] + 1 < Mresolucion.GetLength(0) && !encontre_vector)
                {
                    if (Mresolucion[coor_pixel_inicial[0] + 1, coor_pixel_inicial[1]] != 0)
                    {
                        vectorBase[0]   = " 1";
                        vectorBase[1]   = " 0";
                        encontre_vector = true;
                    }
                }
                if (coor_pixel_inicial[0] + 1 < Mresolucion.GetLength(1) && coor_pixel_inicial[1] - 1 >= 0 && !encontre_vector)
                {
                    if (Mresolucion[coor_pixel_inicial[0] + 1, coor_pixel_inicial[1] - 1] != 0)
                    {
                        vectorBase[0] = " 1";
                        vectorBase[1] = " 2";
                    }
                }
            }
            else
            {
                coordenadas_contorno_ordenadas.Add(coordenadas_contorno_archivo);
                coor_pixel_inicial[0] = coordenadas_contorno_archivo[0];
                coor_pixel_inicial[1] = coordenadas_contorno_archivo[1];


                PDs_alfa_siguiente.Add(coor_pixel_inicial[0].ToString());
                PDs_alfa_siguiente.Add(coor_pixel_inicial[1].ToString());

                PDs_alfa_siguiente.Add(coordenadas_contorno_archivo[coordenadas_contorno_archivo.Count - 2].ToString());
                PDs_alfa_siguiente.Add(coordenadas_contorno_archivo[coordenadas_contorno_archivo.Count - 1].ToString());


                encontre_vector = false;
                if (coor_pixel_inicial[0] == coordenadas_contorno_archivo[2] && coor_pixel_inicial[1] + 1 == coordenadas_contorno_archivo[3])
                {
                    vectorBase[0]   = " 0";
                    vectorBase[1]   = " 1";
                    encontre_vector = true;
                }

                if (coor_pixel_inicial[0] + 1 == coordenadas_contorno_archivo[2] && coor_pixel_inicial[1] + 1 == coordenadas_contorno_archivo[3])
                {
                    vectorBase[0]   = " 1";
                    vectorBase[1]   = " 1";
                    encontre_vector = true;
                }

                if (coor_pixel_inicial[0] + 1 == coordenadas_contorno_archivo[2] && coor_pixel_inicial[1] == coordenadas_contorno_archivo[3])
                {
                    vectorBase[0]   = " 1";
                    vectorBase[1]   = " 0";
                    encontre_vector = true;
                }

                if (coor_pixel_inicial[0] + 1 == coordenadas_contorno_archivo[2] && coor_pixel_inicial[1] - 1 == coordenadas_contorno_archivo[3])
                {
                    vectorBase[0] = " 1";
                    vectorBase[1] = " 2";
                }
            }
            cadenaF8 = codigof8.Obtener_F8(coordenadas_contorno_ordenadas[0], It_is_file);

            cadenaAF8 += ObtenerAF8(cadenaF8);
            return(cadenaAF8);
        }