Beispiel #1
0
        public Punto(int x, int y, double anguloParcial, Minucia minucia)
        {
            Atributos atr = Atributos.getInstance();

            // coordenadas del punto en cartesiano
            this.x = x;
            this.y = y;

            double anguloParcialEnRango = meterEnRango(anguloParcial);

            // Datos válidos para el cálculo del futuro descriptor de textura
            if (anguloParcialEnRango != 0)
            {
                this.frecuencia = (double)1 / anguloParcialEnRango;
            }
            else
            {
                this.frecuencia = Double.MaxValue;
            }

            this.orientacionRelativa = get_relative_orientation(anguloParcialEnRango, minucia.angulo);

            // minucia a la que está asociada el citado punto
            this.minucia = minucia;

            Matriz m = Matriz.getInstance();

            if (!Funcion.seSaleDeCoordenadas(x, y, m.filas, m.cols, atr.tamEntornoPunto / 2) &&
                Funcion.hayAlgunoEnEntorno(x, y, m.matriz, m.filas, m.cols))
            {
                this.esValido = true;
            }
        }
Beispiel #2
0
        /// <summary>
        /// Comprueba que la línea a partir de una minucia se prolonga longitudLinea pixels
        /// </summary>
        /// <param name="actual"></param>
        /// <param name="prolongacion"></param>
        /// <param name="longitudLinea"></param>
        /// <param name="g"></param>
        /// <returns>Devuelve verdadero si la condición es cierta</returns>
        bool seProlongaSuficiente(Point actual, Point prolongacion, List <Point> visitados, int longitudLinea, Graphics g)
        {
            bool      dev = false;
            Atributos atr = Atributos.getInstance();

            if (Funcion.seSaleDeCoordenadas(prolongacion.X, prolongacion.Y, filas, cols, 1))
            {
                dev = false;
            }
            else if (longitudLinea > 0)
            {
                int x = prolongacion.X;
                int y = prolongacion.Y;

                int[,] nuevo = new int[, ] {
                    { matriz[x - 1, y - 1], matriz[x - 1, y], matriz[x - 1, y + 1] },
                    { matriz[x, y - 1], 0, matriz[x, y + 1] },
                    { matriz[x + 1, y - 1], matriz[x + 1, y], matriz[x + 1, y + 1] }
                };

                int difX = actual.X - prolongacion.X + 1;
                int difY = actual.Y - prolongacion.Y + 1;

                nuevo[difX, difY] = 0;

                int  i, j;
                bool enc = false;

                Point nuevoActual = new Point(prolongacion.X, prolongacion.Y);
                g.DrawEllipse(new Pen(atr.colorPixelCercano), nuevoActual.X, nuevoActual.Y, 1, 1);

                for (i = 0; i < 3 && !enc; i++)
                {
                    for (j = 0; j < 3 && !enc; j++)
                    {
                        if (nuevo[i, j] == 1 && !seEncuentraEnLista(visitados, x + i - 1, y + j - 1))
                        {
                            enc = true;
                            Point nuevoProlongacion = new Point(prolongacion.X + i - 1, prolongacion.Y + j - 1);
                            visitados.Add(nuevoProlongacion);
                            dev = seProlongaSuficiente(nuevoActual, nuevoProlongacion, visitados, longitudLinea - 1, g);
                        }
                    }
                }
            }
            else
            {
                dev = true;
                g.FillRectangle(atr.colorRellenoFinPixelCercano,
                                actual.X - atr.radioCirculo / 4, actual.Y - atr.radioCirculo / 4, atr.radioCirculo / 2, atr.radioCirculo / 2);
            }

            return(dev);
        }
Beispiel #3
0
        Point BuscaPuntoEnDireccion(Point actual, Point dir, int maxLongitud)
        {
            Point     nuevoPunto = new Point(actual.X + dir.X, actual.Y + dir.Y);
            int       pasos      = Atributos.getInstance().maxLongitudBuqueda - maxLongitud;
            Atributos atr        = Atributos.getInstance();

            if (maxLongitud > 0 && !Funcion.seSaleDeCoordenadas(nuevoPunto.X, nuevoPunto.Y, filas, cols, 1))
            {
                if (pasos <= atr.minPasosAntesDeBuscarPunto)
                {
                    nuevoPunto = BuscaPuntoEnDireccion(nuevoPunto, dir, maxLongitud - 1);
                }
                else
                {
                    if (matriz[nuevoPunto.X, nuevoPunto.Y] == 0)
                    {
                        if (matriz[nuevoPunto.X + 1, nuevoPunto.Y] == 1)
                        {
                            nuevoPunto = new Point(nuevoPunto.X + 1, nuevoPunto.Y);
                        }

                        else if (matriz[nuevoPunto.X - 1, nuevoPunto.Y] == 1)
                        {
                            nuevoPunto = new Point(nuevoPunto.X - 1, nuevoPunto.Y);
                        }

                        else if (matriz[nuevoPunto.X, nuevoPunto.Y + 1] == 1)
                        {
                            nuevoPunto = new Point(nuevoPunto.X, nuevoPunto.Y + 1);
                        }

                        else if (matriz[nuevoPunto.X, nuevoPunto.Y - 1] == 1)
                        {
                            nuevoPunto = new Point(nuevoPunto.X, nuevoPunto.Y - 1);
                        }
                        else
                        {
                            nuevoPunto = BuscaPuntoEnDireccion(nuevoPunto, dir, maxLongitud - 1);
                        }
                    }
                }
            }
            else
            {
                nuevoPunto = puntoError;
            }

            return(nuevoPunto);
        }