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