sábado, 7 de marzo de 2015

San Romero estudiante

(es) San Romero estudiante

(eo) Sankta Romero studento

San Romero estudiante

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