(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