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