- Intro
- Breve descripción
- Código
- Resultados
- Instalación de los componentes requeridos
Intro
La definición de arte estará justificada al ver los resultados, y lo de matemático
al ver la parte principal del codigo de este pequeño programa/script escrito en
Python, que utiliza las librerías Numpy y OpenGL, la primera para realizar tanto bucles
con números decimales, como también para utilizar las funciones trigonométricas y
OpenGL para realizar las funciones de dibujo (en este caso 2D).
Breve descripción
Para no hacerla muy larga haré una reseña de lo más importante (ya que el código
tiene partes comentadas también), primero la importación de las librerías OpenGL con
sus respectivas derivadas (GLUT), numpy y sys, después se definen algunas variables
globales: ancho, alto, axrng y step, la variable axrng define en cuantas partes se
define la imagen, por ej si se define un ancho de 600px y axrng en 10:
extremo izquierdo: -10
extremo derecho: 10
divisiones: 20 (desde -10 a +10)
600/20 = 30 partes
extremo derecho: 10
divisiones: 20 (desde -10 a +10)
600/20 = 30 partes
esta fórmula también se aplica a la altura, la variable step define cuanta
resolución tendrá la imagen (se ajusta automáticamente).
Por otro lado hay algunas funciones básicas para el funcionamiento del programa:
init, reshape y keyboard.
La función que se encarga del trabajo principal es
math_art, dentro de ésta se definen dos bucles anidados (para dibujar pixeles
horizontales y verticales) en el bucle interior se define el coloreado y patrón
de la imagen resultante, el patrón con la variable r (lineas 34 a 36) y los
colores con los parámetros pasados a la función glColor3f (lineas 38 a 45), para
quién no lo sepa los comentarios comienzan con el caracter # al principio
de la linea y son ignorados por el intérprete.
Por último la función glVertex2f dibuja cada uno de los pixeles. Como habrán notado
se utiliza mucho las funciones sin (seno) y cos (coseno), estas
devuelven un valor entre 0 y 1, los argumentos recibidos vienen de combinarse las
variables x, y, r
Como breve referencia aquí está el valor devuelto por sin y cos desde Python con
el valor 1 pasado como argumento:
sin(1) = 0.8414709848078965
cos(1) = 0.54030230586813977
Código
Si no tienen ganas de copiar el código manualmente, aca se los dejo listo para el
copy/paste:
[color=#000000]
#!/usr/bin/env python
# -*- coding: utf-8 -*-
#
from OpenGL.GL import *
from OpenGL.GLU import *
from OpenGL.GLUT import *
from numpy import *
import sys
# Variables globales
global ancho
global alto
global axrng
global step
# Valores iniciales de dichas variables
ancho = 750
alto = 750
axrng = 8.0
step = (2.0 * axrng) / ancho
def init():
# Color de fondo (RGBA)
glClearColor(1.0, 1.0, 1.0, 1.0)
def math_art():
glClear(GL_COLOR_BUFFER_BIT)
glBegin(GL_POINTS)
for x in arange(-axrng, axrng, step):
for y in arange(-axrng, axrng, step):
r = cos(x) + sin(y)
#r = cos(x)
#r = cos(y)
glColor3f(cos(y*r), cos(x*y*r), sin(r*x))
#glColor3f(cos(y*r), sin(x*y*r), cos(x*r))
#glColor3f(x*y*sin(r), sin(x*r*y)*cos(r*y), sin(y*x)*cos(r))
#glColor3f(sin(y*x)*cos(r), x*y*sin(r), sin(x*r*y)*cos(r*y))
#glColor3f(cos(y*r) , cos(y*r), cos(y*r))
#glColor3f(sin(y*r) , cos(y*r), sin(y*r))
#glColor3f(cos(r), cos(r), cos(r))
#glColor3f(sin(r), sin(r), sin(r))
glVertex2f(x, y)
glEnd()
glFlush()
# Funcion usada por glutReshapeFunc cada vez que actualiza el contenido
# en pantalla
def reshape(w, h):
# Para no tener una altura de 0
if h == 0:
h = 1
glViewport(0, 0, w, h)
glMatrixMode(GL_PROJECTION)
glLoadIdentity()
if w <= h:
gluOrtho2D(-axrng, axrng, -axrng*h/w, axrng*h/w)
else:
gluOrtho2D(-axrng*w/h, axrng*w/h, -axrng, axrng)
glMatrixMode(GL_MODELVIEW)
glLoadIdentity()
# Funcion usada por glutKeyboardFunc para la lectura del teclado (simplifica
# mucho las cosas)
def keyboard(key, x, y):
if key == chr(27):
sys.exit()
if key == "q":
sys.exit()
# Al mejor estilo C definimos una funcion "main" (no
# es requerida un funcion con este nombre en Python)
def main():
global ancho
global alto
# lee los argumentos pasados al programa
glutInit(sys.argv)
glutInitDisplayMode(GLUT_RGB|GLUT_SINGLE)
# posicion inicial de la ventana
glutInitWindowPosition(250, 100)
# Tamaño inicial y titulo de la ventana
glutInitWindowSize(ancho, alto)
glutCreateWindow("Arte matematico")
glutReshapeFunc(reshape)
# Funcion principal de ejecucion (el parametro es otra funcion)
glutDisplayFunc(math_art)
glutKeyboardFunc(keyboard)
init()
glutMainLoop()
main()
[/color]
Resultados
Para aclarar un poco (no está demás): la variable r aparece definida 3 veces, pero
está comentada dos veces (está precedida por #), si se descomenta más de una
línea tomará el último valor asignado, esto también se aplica a la función glColor3f
(que aparece 8 veces y en forma de comentario 7)
Linea habilitada para la variable r: 34
Linea habilitada para definir el color: 38
Linea habilitada para la variable r: 35
Linea habilitada para definir el color: 38
Linea habilitada para la variable r: 36
Linea habilitada para definir el color: 38
Linea habilitada para la variable r: 34
Linea habilitada para definir el color: 39
Linea habilitada para la variable r: 34
Linea habilitada para definir el color: 40
Linea habilitada para la variable r: 34
Linea habilitada para definir el color: 41
Linea habilitada para la variable r: 34
Linea habilitada para definir el color: 42
Linea habilitada para la variable r: 34
Linea habilitada para definir el color: 43
Linea habilitada para la variable r: 34
Linea habilitada para definir el color: 44
Linea habilitada para la variable r: 34
Linea habilitada para definir el color: 45
Se pueden hacer más combinaciones (habilitando las lineas 35 o 36 para los colores
definidos en las lineas 39 a 45), pero se lo dejo para quien tenga ganas de probar.
También algo que no está en las combinaciones es la variable axrng: prueben de
cambiarle los valores a 4 o 16 entre otros.
Instalación de los componentes requeridos
Windows:
Python:
Numpy:
OpenGL:
Los módulos adicionales deben coincidir con la versión de Python instalada
Linux:
En Linux Python ya viene preinstalado, solo queda Numpy y OpenGL, para Debian y
derivadas se tipea (con permisos de root):
apt-get -y install python-numpy python-opengl
