(es) San Romero estudiante
(eo) Sankta Romero studento
http://dx.doi.org/10.13140/RG.2.2.34092.90243
Descripción artística:
Una fotografía de Óscar Arnulfo Romero y Galdámez en su época de estudiante/seminarista.
Motivación:
La noticia de confirmación de canonización de San Romero de América.
Descripción técnica:
Una fotografía de Óscar Arnulfo Romero y Galdámez que en lugar de estar formada por pixeles (cuadrados) está formada por una teselación rombitrihexagonal.
Archivos
Código (Python):
#!/usr/bin/env python
# coding: utf-8
# Copyright 2015 Eduardo Adam Navas López
# Este programa es Software Libre liberado bajo la licencia GNU GPLv3 o su versión más reciente:
# http://www.gnu.org/licenses/gpl.html
"""Este programa abre una imagen de baja resolución del
rostro de San Romero de América y la reconstruye delineada con una teselación rombitrihexagonal.
La imagen fuente tiene 233x267 pixeles.
"""
import pygame
import math
#peque = True
peque = False
SQRT3 = math.sqrt(3)
BLANCO = (255,255,255)
if peque:
ANCHODEST = 1000
ALTODEST = 1000
ANCHO = 117
ALTO = 135
LADO = 6.2568445
ARCHIVO = "romero117x135.jpg"
else:
ANCHODEST = 8000
ALTODEST = 8000
ANCHO = 233
ALTO = 267
LADO = 25.17
ARCHIVO = "romero233x267.jpg"
APOTEMA = int(SQRT3*LADO/2)
def colorPromedio(c1,c2):
return (c1[0]+c2[0])/2,(c1[1]+c2[1])/2,(c1[2]+c2[2])/2
def abscisaCentro(x):
return int((x+1)*LADO/2+x*SQRT3*LADO/2)
def abscisaIzquierda(x):
return int((x+1)*LADO/2+x*SQRT3*LADO/2-LADO/2)
def abscisaDerecha(x):
return int((x+1)*LADO/2+x*SQRT3*LADO/2+LADO/2)
def ordenadaImpar(y):
return int((y+1)/2*SQRT3*LADO/2+(3*((y+1)/2-1)+1)*LADO/2)
def ordenadaPar(y):
return int((y*SQRT3+y*3)*LADO/4)
def ordenadaImparHexa(y):
return int((y+1)/2*SQRT3*LADO/2+(3*((y+1)/2-1)+1)*LADO/2-LADO/2)
def ordenadaParHexa(y):
return int((y*SQRT3+y*3)*LADO/4+LADO/2)
def dibujar():
global fuente, destino
destino.fill(BLANCO)
for y in xrange(ALTO):
if y%2==0: #par
arriba = ordenadaPar(y)
abajo = ordenadaImpar(y+1)
haciaArriba = y%4 == 0 #triángulo hacia arriba
centro = abscisaCentro(0)
for x in xrange(ANCHO):
centroSig = abscisaCentro(x+1)
if haciaArriba:
triangulo = [(abscisaIzquierda(x),abajo), (abscisaDerecha(x),abajo), (centro,abajo-APOTEMA)]
pygame.draw.polygon(destino, fuente.get_at((x,y)), triangulo)
pygame.draw.aalines(destino, BLANCO, True, triangulo)
if x+1<ANCHO:
cuadrado = [(centro,abajo-APOTEMA), (abscisaDerecha(x),abajo), (centroSig,arriba+APOTEMA), (abscisaIzquierda(x+1),arriba)]
pygame.draw.polygon(destino, colorPromedio(fuente.get_at((x,y)),fuente.get_at((x+1,y))), cuadrado)
pygame.draw.aalines(destino, BLANCO, True, cuadrado)
else:
triangulo = [(abscisaIzquierda(x),arriba), (abscisaDerecha(x),arriba), (centro,arriba+APOTEMA)]
pygame.draw.polygon(destino, fuente.get_at((x,y)), triangulo)
pygame.draw.aalines(destino, BLANCO, True, triangulo)
if x+1<ANCHO:
cuadrado = [(centro,arriba+APOTEMA), (abscisaDerecha(x),arriba), (centroSig,abajo-APOTEMA), (abscisaIzquierda(x+1),abajo)]
pygame.draw.polygon(destino, colorPromedio(fuente.get_at((x,y)),fuente.get_at((x+1,y))), cuadrado)
pygame.draw.aalines(destino, BLANCO, True, cuadrado)
haciaArriba = not haciaArriba
centro = centroSig
else: #y es impar
arriba = ordenadaImpar(y)
abajo = ordenadaPar(y+1)
cuadro = True
borde = ((y-1)/2)%2
for x in xrange(borde, ANCHO-borde):
centro = abscisaCentro(x)
if cuadro:
izq = abscisaIzquierda(x)
der = abscisaDerecha(x)
cuadrado = [(izq,arriba), (der,arriba), (der,abajo), (izq,abajo)]
pygame.draw.polygon(destino, fuente.get_at((x,y)), cuadrado)
pygame.draw.aalines(destino, BLANCO, True, cuadrado)
else:
izq = abscisaDerecha(x-1)
der = abscisaIzquierda(x+1)
hexagono = [(izq,arriba), (centro,ordenadaImparHexa(y)), (der,arriba), (der,abajo), (centro,ordenadaParHexa(y+1)), (izq,abajo)]
pygame.draw.polygon(destino, fuente.get_at((x,y)), hexagono)
pygame.draw.aalines(destino, BLANCO, True, hexagono)
cuadro = not cuadro
if __name__ == "__main__":
global destino
pygame.init()
fuente = pygame.image.load(ARCHIVO)
if (ANCHO,ALTO)!=fuente.get_size():
print "Se esperaba una imagen de {}x{} de tamaño".format(ANCHO,ALTO)
exit()
destino = pygame.Surface((ANCHODEST,ALTODEST))
print "Generando imagen..."
dibujar()
destino.blit(fuente,(ANCHODEST/2-ANCHO/2, ALTODEST-ALTO-2*LADO))
print "Imagen generada. Guardando..."
if peque:
pygame.image.save(destino, "sanromero1000.png")
else:
pygame.image.save(destino, "sanromero.png")
No hay comentarios:
Publicar un comentario