InicioLinuxArte matemático con Python y OpenGL

Arte matemático con Python y OpenGL

Linux12/29/2014
Arte matemático con Python y OpenGL
python

- Intro
- Breve descripción
- Código
- Resultados
- Instalación de los componentes requeridos


arte

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).


opengl

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


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


pyopengl

Código

numpy
arte matematico
Arte matemático con Python y OpenGL


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]


python

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
arte


Linea habilitada para la variable r: 35
Linea habilitada para definir el color: 38
opengl


Linea habilitada para la variable r: 36
Linea habilitada para definir el color: 38
pyopengl


Linea habilitada para la variable r: 34
Linea habilitada para definir el color: 39
numpy


Linea habilitada para la variable r: 34
Linea habilitada para definir el color: 40
arte matematico


Linea habilitada para la variable r: 34
Linea habilitada para definir el color: 41
Arte matemático con Python y OpenGL


Linea habilitada para la variable r: 34
Linea habilitada para definir el color: 42
python


Linea habilitada para la variable r: 34
Linea habilitada para definir el color: 43
arte


Linea habilitada para la variable r: 34
Linea habilitada para definir el color: 44
opengl


Linea habilitada para la variable r: 34
Linea habilitada para definir el color: 45
pyopengl


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.


numpy

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



arte matematico
Datos archivados del Taringa! original
285puntos
908visitas
0comentarios
Actividad nueva en Posteamelo
0puntos
1visitas
0comentarios
Dar puntos:

Dejá tu comentario

0/2000

Autor del Post

a
Usuario
Puntos0
Posts203
Ver perfil →
PosteameloArchivo Histórico de Taringa! (2004-2017). Preservando la inteligencia colectiva de la internet hispanohablante.

CONTACTO

18 de Septiembre 455, Casilla 52

Chillán, Región de Ñuble, Chile

Solo correo postal

© 2026 Posteamelo.com. No afiliado con Taringa! ni sus sucesores.

Contenido preservado con fines históricos y culturales.