public TransformacionT(ParejaMinuciaNormalizada inicial, ParejaMinuciaNormalizada[] vectorParejas)
        {
            this.inicial = inicial;

            difx = inicial.pm.minucia2.x - inicial.pm.minucia1.x;
            dify = inicial.pm.minucia2.y - inicial.pm.minucia1.y;
            difa = inicial.pm.minucia2.angulo - inicial.pm.minucia1.angulo;

            aplicarTransformacionRigidaParejaMinuciaNormalizada(vectorParejas);
        }
        ParejaMinuciaNormalizada buscarParejaInicial(ParejaMinuciaNormalizada[] vectorParejas)
        {
            ParejaMinuciaNormalizada tmp = null;

            double maximo = -1;

            // localizamos el mayor sn
            for (int i = 0; i < vectorParejas.Length; i++)
            {
                if (vectorParejas[i].sn >= maximo)
                    maximo = vectorParejas[i].sn;
            }

            List<ParejaMinuciaNormalizada> listaPm = new List<ParejaMinuciaNormalizada>();

            // Buscamos las parejas que comparten dicho sn, es decir, las que empatan arriba
            for (int i = 0; i < vectorParejas.Length; i++)
            {
                if (vectorParejas[i].sn == maximo)
                    listaPm.Add(vectorParejas[i]);
            }

            bool flag = false;

            // De dicha lista intentamos devolver una pareja que sea fiable, si no pues uno de los encontrados
            foreach (ParejaMinuciaNormalizada pmn in listaPm)
            {
                if (pmn.pm.minucia1.fiabilidad == Minucia.Fiable &&
                    pmn.pm.minucia2.fiabilidad == Minucia.Fiable)
                {
                    tmp = pmn;
                    flag = true;
                    break;
                }
            }

            // En caso contrario devolvemos uno cualquiera
            if (!flag)
                tmp = listaPm.ToArray()[0];

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