miércoles, 4 de marzo de 2015

Homenaje al Doctor Alberto Sánchez

(es) Homenaje al Doctor Alberto Sánchez

(eo) Omaĝo al Doktoro Alberto Sánchez

Homenaje al Doctor 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