s3Eva_IIT2015_T3y4 Código QR

Propuesta de solución en Python para 3ra Eva. II Término 2015 Tema 3 y 4.

Los archivos para probar el algoritmo son:

codigoQR.txt

referenciaQR.txt

# 3ra Evaluación II Término 2015-2016
# Tema 3 y 4 para reorientar codigo QR
# propuesta: edelros@espol.edu.ec
# version con lazos y condicionales. tarea: simplificar con 'for'
import numpy
# Tema 3 a)
def rotando(matriz,k):
    cuenta=0    #cuenta rotaciones
    while not(cuenta>=k):
        n,m=matriz.shape 
        tabla=numpy.zeros(shape=(m,n),dtype=int)
        i=0     #inicia rotación
        while not(i>=n):
            j=0
            while not(j>=m):
                f=j
                c=(n-1)-i
                tabla[f,c]=matriz[i,j]
                j=j+1
            i=i+1
        matriz=numpy.copy(tabla)
        cuenta=cuenta+1
    return(matriz)

# Tema 3 b) funcion para extraer una esquina de tamaño t de una matriz
# k=0 ;esquina superior izquierda # k=1 ;esquina superior derecha
# k=3 ;esquina inferior izquierda # k=2 ;esquina inferior derecha
def extraeresquina(matriz,k,t):
    n,m=matriz.shape
    esquina=numpy.zeros(shape=(t,t), dtype=int)
    i=0
    while not(i>=t):
        j=0
        while not(j>=t):
            if (k==0):
                f=i
                c=j
            if (k==1):
                f=i
                c=(m-t)+j
            if (k==2):
                f=(n-t)+i
                c=(m-t)+j
            if (k==3):
                f=(n-t)+i
                c=j
            esquina[i,j]=matriz[f,c]
            j=j+1
        i=i+1   
    return(esquina)

# Programa para orientar el codigo QR
# ingreso por lectura desde un archivo
codigo=numpy.loadtxt('codigo.txt',dtype=int)
referencia=numpy.loadtxt('referencia.txt',dtype=int)

# codigo=rotando(codigo,1) # probando rotacion
# comparando código y esquinas de referencia
t,r=referencia.shape
compara=numpy.zeros(4, dtype=int) #resultados por esquina
k=0  #compara esquinas
while not(k>=4):
    esquina=extraeresquina(codigo,k,t)
    esqgirada=rotando(referencia,k)
    compara[k]=numpy.array_equal(esquina,esqgirada)
    k=k+1
# Selecciona la rotacion
if (compara[0]==1 and compara[1]==1 and compara[2]==0 and compara[3]==1):
    orientado=rotando(codigo,0)
if (compara[0]==1 and compara[1]==0 and compara[2]==1 and compara[3]==1):
    orientado=rotando(codigo,1)    
if (compara[0]==0 and compara[1]==1 and compara[2]==1 and compara[3]==1):
    orientado=rotando(codigo,2)
if (compara[0]==1 and compara[1]==1 and compara[2]==1 and compara[3]==0):
    orientado=rotando(codigo,3)

# Salida
print(orientado)

.