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; } }
/// <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); }
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); }