Ejercicio: 3Eva2015TII_T4 Orientar código QR (Quick Response Code)

Propuesta de solución en Python para 3ra Eva. II Término 2015 Tema 3 y 4.
Los archivos para probar el algoritmo son:
Se empieza cargando los archivos de prueba
codigo = np.loadtxt('codigoQR.txt',dtype=int)
referencia = np.loadtxt('referenciaQR.txt',dtype=int)
Compare la esquina del codigoQR para determinar cual no coincide y decidir la rotación usando las funciones del tema 3.
# comparando código y esquinas de referencia
# resultados por esquina
t,r = referencia.shape
compara = np.zeros(4, dtype=int)
k = 0 # compara esquinas
while not(k>=4):
esquina = extraeresquina(codigo,k,t)
esqgirada = rotando(referencia,k)
compara[k] = np.array_equal(esquina,esqgirada)
k = k + 1
La rotación se define con el resultado de comparar las esquinas
# 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)
El algoritmo integrado se muestra a continuación:
Algoritmo en Python
# 3Eva2015TII_T4 Orientar código QR (Quick Response Code)
# version con lazos y condicionales.
# tarea: simplificar lazos con 'for'
import numpy as np
# 3Eva2015TII_T3 funciones matrices rotar, extraer
# literal a
def rotando(matriz,k):
matriz = np.array(matriz)
cuenta = 0 #cuenta rotaciones
while not(cuenta>=k):
n,m = matriz.shape
tabla = np.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 = np.copy(tabla)
cuenta = cuenta + 1
return(matriz)
# literal b
def extraeresquina(matriz,k,t):
matriz = np.array(matriz)
n,m = matriz.shape
esquina = np.zeros(shape=(t,t), dtype=int)
i = 0
while not(i>=t):
j = 0
while not(j>=t):
if (k==0): # superior izquierda
f = i
c = j
if (k==1): # superior derecha
f = i
c = (m-t)+j
if (k==2): # inferior derecha
f = (n-t)+i
c = (m-t)+j
if (k==3): # inferior izquierda
f = (n-t)+i
c = j
esquina[i,j]=matriz[f,c]
j = j+1
i = i+1
return(esquina)
# Tema 4 ------------------------------
# Programa para orientar el codigo QR
# INGRESO por lectura desde un archivo
codigo = np.loadtxt('codigoQR.txt',dtype=int)
referencia = np.loadtxt('referenciaQR.txt',dtype=int)
# PROCEDIMIENTO
# comparando código y esquinas de referencia
# resultados por esquina
t,r = referencia.shape
compara = np.zeros(4, dtype=int)
k = 0 # compara esquinas
while not(k>=4):
esquina = extraeresquina(codigo,k,t)
esqgirada = rotando(referencia,k)
compara[k] = np.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('codigo orientado:')
print(orientado)
codigo orientado:
[[1 1 1 1 1 1 1 0 1 0 1 0 1 0 1 0 0 1 1 1 1 1 1 1]
[1 0 0 0 0 0 1 0 1 0 1 0 1 0 1 0 0 1 0 0 0 0 0 1]
[1 0 1 1 1 0 1 0 1 0 1 0 1 0 1 0 0 1 0 1 1 1 0 1]
[1 0 1 1 1 0 1 0 1 0 1 0 1 0 1 0 0 1 0 1 1 1 0 1]
[1 0 1 1 1 0 1 0 1 0 1 0 1 0 1 0 0 1 0 1 1 1 0 1]
[1 0 0 0 0 0 1 0 1 0 1 0 1 0 1 0 0 1 0 0 0 0 0 1]
[1 1 1 1 1 1 1 0 1 0 1 0 1 0 1 0 0 1 1 1 1 1 1 1]
[0 0 0 0 0 0 0 0 1 0 1 0 1 0 1 0 0 0 0 0 0 0 0 0]
[1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 0 1 0 1 0 0 1 0]
[1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 0 1 0 1 0 0 1 0]
[1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 0 1 0 1 0 0 1 0]
[1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 0 1 0 1 0 0 1 0]
[1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 0 1 0 1 0 0 1 0]
[1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 0 1 0 1 0 0 1 0]
[1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 0 1 0 1 0 0 1 0]
[1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 0 1 0 1 0 0 1 0]
[0 0 0 0 0 0 0 0 1 0 1 0 1 0 1 0 0 0 0 0 0 0 0 0]
[1 1 1 1 1 1 1 0 1 0 1 0 1 0 1 0 0 1 0 1 0 0 1 0]
[1 0 0 0 0 0 1 0 1 0 1 0 1 0 1 0 0 1 0 1 0 0 1 0]
[1 0 1 1 1 0 1 0 1 0 1 0 1 0 1 0 0 1 0 1 0 0 1 0]
[1 0 1 1 1 0 1 0 1 0 1 0 1 0 1 0 0 1 0 1 0 0 1 0]
[1 0 1 1 1 0 1 0 1 0 1 0 1 0 1 0 0 1 0 1 0 0 1 0]
[1 0 0 0 0 0 1 0 1 0 1 0 1 0 1 0 0 1 0 1 0 0 1 0]
[1 1 1 1 1 1 1 0 1 0 1 0 1 0 1 0 0 1 0 1 0 0 1 0]]