/// <summary>
        /// Constructor de la clase. Está desacoplado al máximo de la clase Atributos, esta clase
        /// ha sido consultada para crear el circulo a la hora de llamar al constructor
        /// </summary>
        /// <param name="indice">Círculo i-ésimo relativo a la minucia a la que él está asociado</param>
        /// <param name="anguloGlobal">Ángulo inferior de la minucia con respecto al origen</param>
        /// <param name="radio">Radio del círculo actual. Viene determinado por el usuario</param>
        /// <param name="numPuntos">Número de puntos que contendrá el círculo actual</param>
        public Circulo(int indice, double anguloGlobal, int radio, int numPuntos, Minucia minucia)
        {
            Atributos atr = Atributos.getInstance();

            this.indice = indice;
            this.anguloGlobal = anguloGlobal;
            this.radio = radio;
            this.numPuntos = numPuntos;

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

            // array donde guardaremos los puntos asociados al citado círculo
            this.puntos = new Punto[numPuntos];

            // Ahora buscaremos los puntos asociados a cada círculo
            for (int i = 0; i < numPuntos; i++)
            {
                // angulo del punto con respecto al centro de la minucia
                double anguloParcial = get_teta_polar_punto(i);

                // coordenadas globales del nuevo punto
                int nuevox = (int)(radio * Math.Sin((double)anguloParcial)) + minucia.x;
                int nuevoy = (int)(radio * Math.Cos((double)anguloParcial)) + minucia.y;

                puntos[i] = new Punto(nuevox, nuevoy, anguloParcial, minucia);
            }
        }
        /// <summary>
        /// Hace la ordenación y las coloca en un vector de parejas
        /// </summary>
        void generarCorrespondenciasEnOrden()
        {
            Atributos atr = Atributos.getInstance();

            //las que tienen una rotación relativa mayor que un umbral las desechamos
            foreach (ParejaMinuciaNormalizada pmn in normalizadas)
            {
                if (pmn.pm.rotacionRelativa > atr.umbralAngulo)
                {
                    pmn.sn = 0;
                }
            }

            vectorParejas = normalizadas.ToArray();
            Array.Sort(vectorParejas);
            Array.Reverse(vectorParejas);

            this.inicial = buscarParejaInicial(vectorParejas);

            minuciaMasFiable1 = inicial.pm.minucia1;
            minuciaMasFiable2 = inicial.pm.minucia2;

            transformacionT = new TransformacionT(inicial, vectorParejas);
            this.parejas    = transformacionT.parejas;
        }
Exemple #3
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;
            }
        }
        /// <summary>
        /// Constructor de la clase. Está desacoplado al máximo de la clase Atributos, esta clase
        /// ha sido consultada para crear el circulo a la hora de llamar al constructor
        /// </summary>
        /// <param name="indice">Círculo i-ésimo relativo a la minucia a la que él está asociado</param>
        /// <param name="anguloGlobal">Ángulo inferior de la minucia con respecto al origen</param>
        /// <param name="radio">Radio del círculo actual. Viene determinado por el usuario</param>
        /// <param name="numPuntos">Número de puntos que contendrá el círculo actual</param>
        public Circulo(int indice, double anguloGlobal, int radio, int numPuntos, Minucia minucia)
        {
            Atributos atr = Atributos.getInstance();

            this.indice       = indice;
            this.anguloGlobal = anguloGlobal;
            this.radio        = radio;
            this.numPuntos    = numPuntos;

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

            // array donde guardaremos los puntos asociados al citado círculo
            this.puntos = new Punto[numPuntos];

            // Ahora buscaremos los puntos asociados a cada círculo
            for (int i = 0; i < numPuntos; i++)
            {
                // angulo del punto con respecto al centro de la minucia
                double anguloParcial = get_teta_polar_punto(i);

                // coordenadas globales del nuevo punto
                int nuevox = (int)(radio * Math.Sin((double)anguloParcial)) + minucia.x;
                int nuevoy = (int)(radio * Math.Cos((double)anguloParcial)) + minucia.y;

                puntos[i] = new Punto(nuevox, nuevoy, anguloParcial, minucia);
            }
        }
Exemple #5
0
        void mostrarParMasFiable()
        {
            Atributos atr = Atributos.getInstance();

            huellas1Final[Tratamiento.totalPasos] = new Bitmap(huellas1[0]);
            huellas2Final[Tratamiento.totalPasos] = new Bitmap(huellas2[0]);

            Graphics g1 = Graphics.FromImage(huellas1Final[Tratamiento.totalPasos]);
            Graphics g2 = Graphics.FromImage(huellas2Final[Tratamiento.totalPasos]);

            Minucia masFiable1 = gm.minuciaMasFiable1;
            Minucia masFiable2 = gm.minuciaMasFiable2;

            for (int i = 0; i < atr.radioCirculo * 4; i += 4)
            {
                g1.DrawEllipse(new Pen(Color.Green),
                               masFiable1.x - atr.radioCirculo - i / 2, masFiable1.y - atr.radioCirculo - i / 2,
                               atr.radioCirculo * 2 + i, atr.radioCirculo * 2 + i);
            }

            for (int i = 0; i < atr.radioCirculo * 4; i += 4)
            {
                g2.DrawEllipse(new Pen(Color.Green),
                               masFiable2.x - atr.radioCirculo - i / 2, masFiable2.y - atr.radioCirculo - i / 2,
                               atr.radioCirculo * 2 + i, atr.radioCirculo * 2 + i);
            }
        }
Exemple #6
0
        /// <summary>
        /// cada minucia de la huella 1 es trasladada y rotada a su pareja de la huella2
        /// para ver si encajan
        /// </summary>
        /// <param name="vectorParejas"></param>
        void aplicarTransformacionRigidaParejaMinuciaNormalizada(ParejaMinuciaNormalizada[] vectorParejas)
        {
            parejas = new ParAlineado[vectorParejas.Length];

            for (int k = 0; k < vectorParejas.Length; k++)
            {
                Minucia minucia1 = vectorParejas[k].pm.minucia1;
                Minucia minucia2 = vectorParejas[k].pm.minucia2;

                /*
                 * double nx = (double)minucia1.x * Math.Cos(difa) +
                 *          (double)minucia1.y * Math.Sin(difa) + difx;
                 * double ny = (double)minucia1.x * -Math.Sin(difa) +
                 *          (double)minucia1.y * Math.Cos(difa) + dify;
                 *
                 * double nx = (double)minucia1.x * Math.Cos(difa) -
                 *          (double)minucia1.y * Math.Sin(difa) + difx;
                 * double ny = (double)minucia1.x * Math.Sin(difa) +
                 *          (double)minucia1.y * Math.Cos(difa) + dify;
                 *
                 */

                double nx = (double)minucia1.x + difx;
                double ny = (double)minucia1.y + dify;

                int x2 = minucia2.x;
                int y2 = minucia2.y;

                // la minucia 1 está trasladada y la minucia 2 está normal
                parejas[k] = new ParAlineado(vectorParejas[k].pm.minucia1, (int)nx, (int)ny,
                                             vectorParejas[k].pm.minucia2, x2, y2);
            }
        }
Exemple #7
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;
            }
        }
 public ParAlineado(Minucia m1, int xT, int yT, Minucia m2, int xDestino, int yDestino)
 {
     this.minucia1 = m1;
     this.minucia2 = m2;
     this.xT = xT;
     this.yT = yT;
     this.xDestino = xDestino;
     this.yDestino = yDestino;
 }
Exemple #9
0
 public ParAlineado(Minucia m1, int xT, int yT, Minucia m2, int xDestino, int yDestino)
 {
     this.minucia1 = m1;
     this.minucia2 = m2;
     this.xT       = xT;
     this.yT       = yT;
     this.xDestino = xDestino;
     this.yDestino = yDestino;
 }
Exemple #10
0
        /// <summary>
        /// Minucia1 y Minucia2 son las dos minucias centrales p y q
        /// ó q y p correspondientes cada caso
        /// </summary>
        /// <param name="minucia1"></param>
        /// <param name="minucia2"></param>
        /// <param name="dm_minucia"></param>
        public TransformacionT(Minucia minucia1, Minucia minucia2, List <MinuciaParcial> dm_minucia)
        {
            difx = minucia2.x - minucia1.x;
            dify = minucia2.y - minucia1.y;
            difa = minucia2.angulo - minucia1.angulo;
            //difa = Funcion.anguloEntrePuntos(minucia1.x, minucia1.y, minucia2.x, minucia2.y);

            // Conjunto dm(p) habiéndole aplicado la transformación rígida
            dm_minucia_t = aplicarTransformacionRigidaMinuciaParcial(dm_minucia);
        }
        /// <summary>
        /// Minucia1 y Minucia2 son las dos minucias centrales p y q 
        /// ó q y p correspondientes cada caso
        /// </summary>
        /// <param name="minucia1"></param>
        /// <param name="minucia2"></param>
        /// <param name="dm_minucia"></param>
        public TransformacionT(Minucia minucia1, Minucia minucia2, List<MinuciaParcial> dm_minucia)
        {
            difx = minucia2.x - minucia1.x;
            dify = minucia2.y - minucia1.y;
            difa = minucia2.angulo - minucia1.angulo;
            //difa = Funcion.anguloEntrePuntos(minucia1.x, minucia1.y, minucia2.x, minucia2.y);

            // Conjunto dm(p) habiéndole aplicado la transformación rígida
            dm_minucia_t = aplicarTransformacionRigidaMinuciaParcial(dm_minucia);
        }
        /// <summary>
        /// Constructor aplicado cuando queremos construir una minucia parcial
        /// aplicándole las coordenadas de una transformada T
        /// </summary>
        /// <param name="minucia"></param>
        /// <param name="minuciaCentral"></param>
        /// <param name="x"></param>
        /// <param name="y"></param>
        /// <param name="teta"></param>
        public MinuciaParcial(Minucia minucia, Minucia minuciaCentral, int x, int y, double teta)
        {
            this.minucia = minucia;
            this.minuciaCentral = minuciaCentral;

            this.x = x;
            this.y = y;
            this.teta = teta;

            this.encaja = false;
            this.deberiaEncajar = false;
        }
        /// <summary>
        /// Constructor aplicado cuando queremos guardar la relación de vecindad
        /// entre una minucia y su minucia asociada central
        /// </summary>
        /// <param name="minucia"></param>
        /// <param name="minuciaCentral"></param>
        public MinuciaParcial(Minucia minucia, Minucia minuciaCentral)
        {
            this.minucia = minucia;
            this.minuciaCentral = minuciaCentral;

            this.x = minucia.x;
            this.y = minucia.y;
            this.teta = Funcion.anguloEntrePuntos(minuciaCentral.x, minuciaCentral.y, minucia.x, minucia.y);

            this.encaja = false;
            this.deberiaEncajar = false;
        }
        /// <summary>
        /// Constructor aplicado cuando queremos construir una minucia parcial
        /// aplicándole las coordenadas de una transformada T
        /// </summary>
        /// <param name="minucia"></param>
        /// <param name="minuciaCentral"></param>
        /// <param name="x"></param>
        /// <param name="y"></param>
        /// <param name="teta"></param>
        public MinuciaParcial(Minucia minucia, Minucia minuciaCentral, int x, int y, double teta)
        {
            this.minucia        = minucia;
            this.minuciaCentral = minuciaCentral;

            this.x    = x;
            this.y    = y;
            this.teta = teta;

            this.encaja         = false;
            this.deberiaEncajar = false;
        }
        /// <summary>
        /// Constructor aplicado cuando queremos guardar la relación de vecindad
        /// entre una minucia y su minucia asociada central
        /// </summary>
        /// <param name="minucia"></param>
        /// <param name="minuciaCentral"></param>
        public MinuciaParcial(Minucia minucia, Minucia minuciaCentral)
        {
            this.minucia        = minucia;
            this.minuciaCentral = minuciaCentral;

            this.x    = minucia.x;
            this.y    = minucia.y;
            this.teta = Funcion.anguloEntrePuntos(minuciaCentral.x, minuciaCentral.y, minucia.x, minucia.y);

            this.encaja         = false;
            this.deberiaEncajar = false;
        }
Exemple #16
0
        void dibujaCruz(Graphics g, Minucia minucia)
        {
            Atributos atr = Atributos.getInstance();

            g.DrawLine(new Pen(atr.colorCruz),
                       minucia.x - atr.radioCirculo / 2, minucia.y - atr.radioCirculo / 2,
                       minucia.x + atr.radioCirculo / 2, minucia.y + atr.radioCirculo / 2);

            g.DrawLine(new Pen(atr.colorCruz),
                       minucia.x - atr.radioCirculo / 2, minucia.y + atr.radioCirculo / 2,
                       minucia.x + atr.radioCirculo / 2, minucia.y - atr.radioCirculo / 2);

            g.DrawRectangle(new Pen(atr.colorCruz),
                            minucia.x - atr.radioCirculo / 2, minucia.y - atr.radioCirculo / 2,
                            atr.radioCirculo, atr.radioCirculo);
        }
        public ParejaMinucia(Minucia m1, Minucia m2)
        {
            this.minucia1 = m1;
            this.minucia2 = m2;

            this.st = 0.0;
            this.sm = 0.0;
            this.sc = 0.0;

            // Más adelante analizaremos si no lo es
            this.esDescriptorTexturaRelevante = true;

            calcularDescriptorTextura();
            calcularDescriptorMinucia();

            this.rotacionRelativa = m2.angulo - m1.angulo;
            this.sc = this.st * this.sm;
        }
        public ParejaMinucia(Minucia m1, Minucia m2)
        {
            this.minucia1 = m1;
            this.minucia2 = m2;

            this.st = 0.0;
            this.sm = 0.0;
            this.sc = 0.0;

            // Más adelante analizaremos si no lo es
            this.esDescriptorTexturaRelevante = true;

            calcularDescriptorTextura();
            calcularDescriptorMinucia();

            this.rotacionRelativa = m2.angulo - m1.angulo;
            this.sc = this.st * this.sm;
        }
Exemple #19
0
 public Correspondencia(Minucia minucia1, Minucia minucia2)
 {
     this.minucia1 = minucia1;
     this.minucia2 = minucia2;
 }
 public Correspondencia(Minucia minucia1, Minucia minucia2)
 {
     this.minucia1 = minucia1;
     this.minucia2 = minucia2;
 }
        /// <summary>
        /// Hace la ordenación y las coloca en un vector de parejas
        /// </summary>
        void generarCorrespondenciasEnOrden()
        {
            Atributos atr = Atributos.getInstance();

            //las que tienen una rotación relativa mayor que un umbral las desechamos
            foreach (ParejaMinuciaNormalizada pmn in normalizadas)
                if (pmn.pm.rotacionRelativa > atr.umbralAngulo)
                    pmn.sn = 0;

            vectorParejas = normalizadas.ToArray();
            Array.Sort(vectorParejas);
            Array.Reverse(vectorParejas);

            this.inicial = buscarParejaInicial(vectorParejas);

            minuciaMasFiable1 = inicial.pm.minucia1;
            minuciaMasFiable2 = inicial.pm.minucia2;

            transformacionT = new TransformacionT(inicial, vectorParejas);
            this.parejas = transformacionT.parejas;
        }
        void dibujaCruz(Graphics g, Minucia minucia)
        {
            Atributos atr = Atributos.getInstance();

            g.DrawLine(new Pen(atr.colorCruz),
                minucia.x - atr.radioCirculo / 2, minucia.y - atr.radioCirculo / 2,
                minucia.x + atr.radioCirculo / 2, minucia.y + atr.radioCirculo / 2);

            g.DrawLine(new Pen(atr.colorCruz),
                minucia.x - atr.radioCirculo / 2, minucia.y + atr.radioCirculo / 2,
                minucia.x + atr.radioCirculo / 2, minucia.y - atr.radioCirculo / 2);

            g.DrawRectangle(new Pen(atr.colorCruz),
                minucia.x - atr.radioCirculo / 2, minucia.y - atr.radioCirculo / 2,
                atr.radioCirculo, atr.radioCirculo);
        }