(es) Homenaje al Doctor Alberto Sánchez
(eo) Omaĝo al Doktoro Alberto Sánchez
http://dx.doi.org/10.13140/RG.2.2.34092.90243
Descripción artística:
Homenaje al Doctor Alberto Sánchez, salvadoreño, quien descubrió el trazo de la curva Cornoide en 1895.
Motivación:
El trabajo de un salvadoreño que aportó la identificación de una curva de construcción relativamente simple que todos los grandes matemáticos de la historia pasaron por alto. La Escuela de Matemática de la Facultad de Ciencias Naturales y Matemática de la Universidad de El Salvador, lleva su nombre en su honor.
Descripción técnica:
Una vieja fotografía del Doctor Alberto Sánchez en la que cada pixel fue cambiado por una pequeña curva Cornoide con más o menos pasos intermedios con colores rojo, azul y verde para provocar los puntos correspondientes en una escala mayor.
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 del Doctor Alberto Sánchez y la vuelve a generar
delineada con pequeñas cornoides de 100x100 pixeles.
La imagen fuente tiene 67x80 pixeles.
"""
import pygame
import math
import escala
#peque = True
peque = False
if peque:
ANCHODEST = 1675
ALTODEST = 2000
ANCHO = 25
ALTO = 25
NUMPASOSMIN = 1
NUMPASOSMAX = 15
NUMPASOSCURVA = 20
#En pixeles:
GRUESO_CIRCULO = 1
GRUESO_CORNOIDE = 1
GRUESO_LINEA = 1
#RADIO_PUNTO = 1
else:
ANCHODEST = 6700
ALTODEST = 8000
ANCHO = 100
ALTO = 100
NUMPASOSMIN = 1
NUMPASOSMAX = 50
NUMPASOSCURVA = 100
#En pixeles:
GRUESO_CIRCULO = 1
GRUESO_CORNOIDE = 5
GRUESO_LINEA = 1
#RADIO_PUNTO = 1
ARCHIVO = "dr-alberto-sanchez2.jpg"
INF_IZQ = (-0.7,-0.23)
SUP_DER = (1.03,1.5)
#En unidades virtuales:
RADIO_CIRCULO = 1.0
ROJO = (255,0,0)
VERDE = (0,255,0)
AZUL = (0,0,255)
BLANCO = (255,255,255)
NEGRO = (0,0,0)
COLOR_CORNOIDE = (128,128,128)
COLOR_CIRCULO = (0,0,0)
#COLOR_RADIO = (0,128,128)
#COLOR_TANGENTE = (128,128,0)
#COLOR_SECANTE = (0,128,0)
#COLOR_FINAL = (128,0,128)
#COLOR_CORNOIDE = (0,128,128)
#COLOR_CIRCULO = (128,0,128)
COLOR_RADIO = (0,0,128)
COLOR_TANGENTE = (128,0,0)
COLOR_SECANTE = (0,128,0)
COLOR_FINAL = (128,128,0)
COLOR_PUNTO = ROJO
def cornoide(t, r=1.0):
return r*math.cos(t)*math.cos(2*t), r*math.sin(t)*(2+math.cos(2*t))
def dibujar():
global temp_peque, e_peque, fuente, destino
destino.fill(BLANCO)
for y in range(fuente.get_height()):
for x in range(fuente.get_width()):
tono = float(fuente.get_at((x,y))[0])
dibujarUnaCornoide(temp_peque,
e_peque,
int(NUMPASOSMAX + tono*(NUMPASOSMIN-NUMPASOSMAX)/255))
destino.blit(temp_peque, (x*ANCHO,y*ALTO))
print "{}/{}".format(y+1,fuente.get_height())
#Rellenar para hacer cuadrada:
x = ANCHODEST
for y in range(ALTODEST/(ALTODEST-ANCHODEST)):
dibujarUnaCornoide(temp_grande, e_grande, 50, False)
destino.blit(temp_grande, (x, y*(ALTODEST-ANCHODEST)))
#Agregar la foto pequeña:
if not peque:
destino.blit(fuente, (x,(y+1)*(ALTODEST-ANCHODEST)))
def dibujarUnaCornoide(temporal, e, maximo, peque=True):
i = 0
t = 0.0
pcirc = RADIO_CIRCULO*math.cos(t), RADIO_CIRCULO * math.sin(t)
i=i+1
temporal.fill(BLANCO)
while i<=maximo:
#Calcular siguiente punto del cornoide:
t = math.pi/2 * i/maximo
p = cornoide(t, RADIO_CIRCULO)
pr = e.vr(p)
#Dibujar círculo:
pygame.draw.circle(temporal, COLOR_CIRCULO, e.vr((0.0,0.0)), int(e.magnitudvrx(RADIO_CIRCULO)), GRUESO_CIRCULO)
#Centro del círculo:
#pygame.draw.circle(temporal, COLOR_PUNTO, e.vr((0.0,0.0)), RADIO_PUNTO)
#Punto del círculo:
pcirc = RADIO_CIRCULO*math.cos(t), RADIO_CIRCULO * math.sin(t)
#Radio:
pygame.draw.aaline(temporal, COLOR_RADIO, e.vr((0.0,0.0)), e.vr(pcirc), GRUESO_LINEA)
#Recta tangente al círculo:
#pygame.draw.aaline(temporal, COLOR_TANGENTE, e.vr(p), e.vr(pcirc), GRUESO_LINEA)
##con esto se prolonga la tangente
pendiente = -1.0/math.tan(t)
ptan1 = e.minxv, pendiente * (e.minxv - pcirc[0]) + pcirc[1]
ptan2 = e.maxxv, pendiente * (e.maxxv - pcirc[0]) + pcirc[1]
pygame.draw.aaline(temporal, COLOR_TANGENTE, e.vr(ptan1), e.vr(ptan2), GRUESO_LINEA)
#Secante al círculo:
pcirc2 = (-pcirc[0], pcirc[1])
pygame.draw.aaline(temporal, COLOR_SECANTE, e.vr(pcirc2), e.vr(pcirc), GRUESO_LINEA)
#Segmento final:
pygame.draw.aaline(temporal, COLOR_FINAL, e.vr(pcirc2), pr, GRUESO_LINEA)
i = i+1
#Dibujar el Cornoide
i = 0
while i<NUMPASOSCURVA:
t = math.pi/2 * i/NUMPASOSCURVA
pr = e.vr(cornoide(t, RADIO_CIRCULO))
pygame.draw.circle(temporal, COLOR_CORNOIDE, pr, GRUESO_CORNOIDE/2)
i=i+1
if __name__ == "__main__":
global temporal, e, fuente, destino
pygame.init()
fuente = pygame.image.load(ARCHIVO)
destino = pygame.Surface((ANCHODEST+(ALTODEST-ANCHODEST),ALTODEST))
temp_peque = pygame.Surface((ANCHO,ALTO))
e_peque = escala.Escala((ANCHO,ALTO), INF_IZQ, SUP_DER)
temp_grande = pygame.Surface((ANCHO*13,ALTO*13))
e_grande = escala.Escala((ANCHO*13,ALTO*13), INF_IZQ, SUP_DER)
dibujar()
print "Imagen generada. Guardando..."
if peque:
pygame.image.save(destino, "albertosanchez-2000.png")
else:
pygame.image.save(destino, "albertosanchez.png")
#raw_input("Presione una tecla para salir")
No hay comentarios:
Publicar un comentario