-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathmaya_v1.py
158 lines (118 loc) · 5.11 KB
/
maya_v1.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
import math
import cv2
import numpy as np
import matplotlib.pyplot as plt
# El sistema de numeracion maya tiene cuatro niveles.
# Funcion para definir los niveles para escribir grandes cantidades.
def getNiveles(valor):
if valor != 0:
exponente = math.log(valor,20) #Base 20
return (int(exponente)+1) #Porque arranca desde el nivel 0
else:
return 1
# Cada nivel puede ponerse cualquier numero del 0 al 19
def valores(valor,cociente):
residuo = valor%cociente #Se obtiene el residuo de realizar la division respecto a un cociente
return residuo #Si el residuo es cero significa que esa capa esta totalmente llena
# Crear una imagen con su respectiva representacion maya para cada numero
# Cada numero debe ser menor de 20, que es la representacion maxima que se puede realizar por cada nivel
def numeroMaya(numero):
# Comenzamos la imagen con un pequeno margen, sobre cual empezaremos a concatenar
image = cv2.imread('./Imagenes/margen.png')
cero = cv2.imread("./Imagenes/A0.png")
uno = cv2.imread("./Imagenes/A1.png")
dos = cv2.imread("./Imagenes/A2.png")
tres = cv2.imread("./Imagenes/A3.png")
cuatro = cv2.imread("./Imagenes/A4.png")
cinco = cv2.imread("./Imagenes/A5.png")
# Para el cero maya
residuo = valores(numero,5)
if (numero == 0):
image = np.concatenate((image, cero), axis=0) #axis=0 porque se concatena horizontalmente
# Para el punto maya
else:
if (residuo == 1):
image = np.concatenate((image, uno), axis=0)
elif (residuo == 2):
image = np.concatenate((image, dos), axis=0)
elif (residuo == 3):
image = np.concatenate((image, tres), axis=0)
elif (residuo == 4):
image = np.concatenate((image, cuatro), axis=0)
# Para la barra maya
for x in range(int(numero/5)):
if (numero >= 5) :
image = np.concatenate((image, cinco), axis=0)
else:
image = np.concatenate((image, cinco), axis=0)
return image
def resultado(valor):
nivel = getNiveles(valor)
# Iniciacion
residuo = valores(valor,20)
#Esta es la capa superior
image = numeroMaya(residuo)
for x in range(nivel-1):
#Actualizacion de variable
valor = valor - residuo
residuo = valores(valor,pow(20,x+2))
aux = numeroMaya(residuo)
aux = np.concatenate((image, aux), axis=0)
return image
#Acorde a la historia este sistema numeracion maya tiene cuatro niveles, que se utilizaban para escribir grandes cantidades.
#Matematicamente f(x) = x1 + 20*x2 + 400*x3 + 8000*x4
def getCoeficientes(valor):
coeficientes = list()
for i in range(4):
x = int((valor)/(20**(3-i)))
valor = valor - (20**(3-i))*x
coeficientes.append(x)
#Los coeficientes se devuelven de esta forma [x4,x3,x2,x1]
return coeficientes
def unirNiveles(coeficientes,nivel,valor):
for i in range(4):
# Todo numero entero tiene al menos un nivel
if (i==0):
image = numeroMaya(coeficientes[3-i])
else:
aux = numeroMaya(coeficientes[3-i])
if (i < nivel): #Se concatenara solo los valores que no superen el nivel maximo
image = np.concatenate((aux , image), axis=0)
# Terminamos la imagen con un pequeno margen
margen = cv2.imread('./Imagenes/margen.png')
encabezado = escribirValor(valor)
image = np.concatenate((encabezado,image,margen),axis=0)
return image
# Permite escibir el valor dentro de la imagen
def escribirValor(valor):
image = cv2.imread('./Imagenes/margen.png')
fuente = cv2.FONT_HERSHEY_SIMPLEX
texto = str(valor)
#Obtener tamano del texto
textsize = cv2.getTextSize(texto, fuente, 9, 5)[0]
#Obtener coordenadas
X = int((image.shape[1] - textsize[0]) / 2)
Y = int((image.shape[0] - textsize[1]) / 2)
# Escribir texto en la imagen
cv2.putText(image, texto, (X,Y+215), fuente, 9, (0, 0, 0), 5) # Se sumo 215 px a Y para colocar por debajo del centro
#cv2.putText(imagen,texto, (coordenadas),tamano fuente,(color RGB),grosor)
return image
if __name__ == "__main__":
#Numero a analizar
numero = int(input("Ingresar numero arabigo: "))
#Recordad que el maximo valor que se puede representar, respetando los 4 niveles es 159999
if (numero < 160000):
nivel = getNiveles(numero)
coeficientes = getCoeficientes(numero)
imagen = unirNiveles(coeficientes,nivel,numero)
# Ver resultados
plt.imshow(imagen)
plt.axis("off")
plt.show()
# Guardar imagen
# Como los nombres de archivos no pueden arrancar con un numero, anteponemos la letra A y luego el numero
path = "./Resultados/A" + str(numero) + ".png"
cv2.imwrite(path,imagen)
else:
print("\nTu numero excede el rango permitido")
print("Segun la historia, solo se puede representar hasta el valor 159999")