Libreras
CAIRO ..3
FLTK .........................................................................................................................................9
GTK .....12
MINIWIN ....14
WXWIDGETS ....22
QT.............................................................................................................................................26
OPENGL......41
GRAPHICS...50
OPENGL Y GLUT...12
CAIRO
En informtica, Cairo es una biblioteca grfica de la API GTK+ usada para proporcionar
imgenes basadas en grficos vectoriales. Aunque Cairo es una API independiente de
dispositivos, est diseado para usar aceleracin por hardware cuando est disponible. Cairo
ofrece numerosas primitivas para imgenes de dos dimensiones.
A pesar de que est escrito en C, existen implementaciones en otros lenguajes de programacin,
incluyendo C++, C#, Common Lisp, Haskell, Java, Python, Perl, Ruby, Scheme (Guile, Chicken),
Smalltalk y muchos otros. Dada la doble licencia incluyendo la Licencia Pblica General
Reducida de GNU y la Licencia Pblica de Mozilla, cairo es software libre.
Modelo grfico de Cairo
Para poder explicar el modelo grfico que usa Cairo se tienen que definir los conceptos que se
utilizan. Se tienen los sustantivos y los verbos. Los sustantivos son objetos abstractos o entidades
en los cuales operan los verbos. Hay varios tipos de sustantivos y varios tipos de verbos.
Sustantivos
Destino. El destino es la superficie sobre la cual se dibuja. Puede ser una
matriz de pxeles, o un archivo SVG o PDF, o cualquier tipo de grfico. Esta
superficie colecciona los elementos de los grficos mientras se van aplicando,
permitiendo as construir un trabajo completo, de forma anloga a pintar
sobre un lienzo.
Fuente. Es la "pintura" sobre la cual se trabaja. Se muestra como una capa
superior (capa negra en la imagen). Puede ser totalmente de un color, un
patrn de colores, o incluso una superficie destino previamente creada. De
forma contraria a una pintura real, la fuente puede contener un canal de
transparencia.
Mscara. La mscara es la pieza ms importante pues controla la aplicacin
de la fuente al destino. En la imagen se muestra como una pala amarilla que
deja pasar la fuente. Cuando se aplica un verbo, es como si se adhiriera la
fuente al destino. Siempre que la mscara lo permita, la fuente es copiada, en
caso contrario, no sucede nada.
Ruta. Es cualquier cosa entre una parte de la mscara y una parte del
contexto. Se manipula por medio de los verbos de ruta.
Contexto. El contexto mantiene un registro de todo lo que un verbo afecta.
Mantiene una fuente, un destino y una mscara. Tambin mantiene muchas
variables de ayuda como el grosor de la lnea y el estido, el tipo de fuente de
letra y el tamao, etc. Tambin mantiene la ruta, la cual se transforma a una
mscara cuando se usan los verbos de dibujo. Antes de que se dibuje algo con
Cairo, se necesita crear un contexto. El contexto se almacena en el tipo de
dato cairo_t. Cuando se crea un contexto, debe de ser ligado a una superficie,
por ejemplo, una superficie de imagen si se desea crear un archivo PNG.
Verbos
Trazar. La operacin cairo_stroke() toma un lpiz virtual a travs de toda la
ruta. Permite transferir parte de la fuente (la lnea de la ruta) a travs de la
mscara, de acuerdo al ancho de la lnea, estilo, etc. que define el contexto.
Transfiere la mitad del ancho de lnea en cada lado de la ruta.
cairo_set_line_width (cr, 0.1);
cairo_set_source_rgb (cr, 0, 0, 0);
cairo_rectangle (cr, 0.25, 0.25, 0.5, 0.5);
cairo_stroke (cr);
5
radpat = cairo_pattern_create_radial (0.5, 0.5, 0.25, 0.5,
0.5, 0.75);
cairo_pattern_add_color_stop_rgba (radpat, 0, 0, 0, 0, 1);
cairo_pattern_add_color_stop_rgba (radpat, 0.5, 0, 0, 0, 0);
cairo_set_source (cr, linpat);
cairo_mask (cr, radpat);
Proceso de dibujo
Para poder crear una imagen, se tiene que preparar el contexto para cada uno de los verbos. Para
usar cairo_stroke() o cairo_fill() se necesita primero una ruta. Para usar cairo_show_text() se
tiene que posicionar el texto en su punto de insercin. Para usar cairo_mask() se necesita una
segunda superficie fuente. Para las dems operaciones, incluyendo cairo_paint() slo se
necesitan una fuente primaria.
Hay tres tipos de fuentes principales en Cairo: colores, gradientes e imgenes. Los colores son los
ms simples; usan un color uniforme en toda la fuente. Se pueden seleccionar colores sin previas
preparaciones con cairo_set_source_rgb() y cairo_set_source_rgba(). Usar
cairo_set_source_rgb(cr, r, g, b) es equivalente a usar cairo_set_source_rgba(cr, r, g, b,1.0), lo
cual pone el color fuente a su mximo nivel de opacidad.
Los gradientes describen una progresin de colores en funcin a su lugar de inicio y de fin,
adems de usar una serie de "paradas" a lo largo del camino. Los gradientes lineales se
construyen a partir de dos puntos que se pasan a travs de lneas paralelas, los cuales definen los
lugares de inicio y de fin. Los gradientes radiales se construyen tambin a partir de dos puntos,
pero cada uno tiene un radio asociado para el crculo que define los lugares de inicio y de fin. Las
paradas se agregan a los gradientes con cairo_add_color_stop_rgb() y
cairo_add_color_stop_rgba() que toman un color como cairo_set_source_rgb*() y un offset
para indicar donde se aplica a los lugares de referencia. Los colores entre las paradas adyacentes
se promedian en el espacio para mezclarlos de forma uniforme. El comportamiente entre los
lugares de referencia pueden ser controlados con cairo_set_extend().
Las imgenes pueden ser superficies cargadas desde archivos existentes con
cairo_image_surface_create_from_png() o tambin pueden ser superficies creadas con Cairo
en un destino anterior. La forma ms fcil de crear y usar un destino anterior como una fuente es
con cairo_push_group(), con cairo_pop_group() o con cairo_pop_group_to_source(). Se usa
cairo_pop_group_to_source() justo antes de seleccionar una nueva fuente, y
cairo_pop_group() cuando se desea guardarlo, as que se puede seleccionar uno y otra vez con
cairo_set_source().
Ejemplo de dibujo usando color
6
cairo_set_source_rgb (cr, 0, 0, 0);
cairo_move_to (cr, 0, 0);
cairo_line_to (cr, 1, 1);
cairo_move_to (cr, 1, 0);
cairo_line_to (cr, 0, 1);
cairo_set_line_width (cr, 0.2);
cairo_stroke (cr);
cairo_rectangle (cr, 0, 0, 0.5, 0.5);
cairo_set_source_rgba (cr, 1, 0, 0,
0.80);
cairo_fill (cr);
cairo_rectangle (cr, 0, 0.5, 0.5, 0.5);
cairo_set_source_rgba (cr, 0, 1, 0,
0.60);
cairo_fill (cr);
cairo_rectangle (cr, 0.5, 0, 0.5, 0.5);
cairo_set_source_rgba (cr, 0, 0, 1,
0.40);
cairo_fill (cr);
0.75, 0.65);
1, 1, 1, 0);
0, 1, 0,
1, 1, 1, 0);
0, 0, 1,
1, 1, 1, 0);
Creacin de rutas
Cairo siempre tiene una ruta activa. Si se llama la funcin cairo_stroke() se dibujar la ruta. Si se
llama la funcin cairo_fill() se rellenar el interior de la ruta. Pero como la ruta inicial est vaca,
ambas llamadas a tales funciones no representarn cambios al destino. En cada llamada a
cairo_stroke() o a cairo_fill() la ruta se vaca para poder una nueva ruta.
Existen versiones alternativas de las funciones anteriores las cuales no vacan la ruta para que se
puede volver a utilizar, estas funciones son: cairo_stroke_preserve() y cairo_fill_preserve().
Proceso de creacin de rutas
Cuando se crean rutas, Cairo usa un sistema al estilo conecta los puntos.
Comienza en 1, traza una lnea a 2, luego a 3, y as sucesivamente. Cuando se
comienza una ruta o una subruta, se designa un punto el cual todava no tiene
ningn otro conectado, para esto se usa la funcin cairo_move_to(). Con esto
se cambia el punto de referencia actual sin realizar conexiones a otros puntos.
Tambin se puede mover el punto de forma relativa con
cairo_rel_move_to(). Despus de asignar el primer punto de referencia, se
usan otras operaciones las cuales actualizan el punto de referencia y lo
conectan de determinada forma.
cairo_move_to (cr, 0.25, 0.25);
Se pueden usar lneas rectas para unir los puntos de forma absoluta con
cairo_line_to() o de forma relativa con cairo_rel_line_to(). El nuevo punto
de referencia se actualiza, despus de tales operaciones se encuentra al final
de la lnea.
cairo_line_to (cr, 0.5, 0.375);
cairo_rel_line_to (cr, 0.25, -0.125);
Cairo cierra la ruta trazando una lnea recta hacia el inicio de la ruta. Esta
lnea puede ser til para, por ejemplo, un polgono, pero no es til para
formas curvas. Una ruta abierta es una ruta continua que su punto inicial y su
punto final no se encuentran donde mismo.
cairo_close_path (cr);
Si tal archivo lo nombrramos como hello.c, la instruccin necesaria para compilarlo sera:
cc -o hello $(pkg-config --cflags --libs cairo) hello.c
Tras correr el programa hello el usuario obtendr una imagen PNG llamada hello.png con el
texto "Hello, world" escrito en color azul.
Antes de instalar el Dark GDK, debes instalar el Microsoft Visual C++ 2008 y el Directx 9.0c
SDK como explican en el video de la pgina oficial http://gdk.thegamecreators.com/.En esa
misma pgina viene un cdigo de programa donde carga un escenario 3D creado con el FPS
CREATOR al que aade un skybox. En la instalacin adems de la librera de comandos con su
documentacin, incluye DarkMatter 1 que es una coleccin de recursos
http://darkmatter.thegamecreators.com/
La documentacin clasifica los comandos por tema para su rpida localizacin. Los temas son:
Core, Text, Input, File, Display, Basic2D, Bitmap, Sound, Music, Sprite, Image, Light, Camera,
Basic3D, Matrix, World, Particles, 3D Maths, FTP, Memblocks, Multiplayer, System, Terrain.
Inicialmente no incluye capacidad de fsica 3D (deteccin de colisiones). Deberemos instalar otra
utilidad gratuita llamada Dark Physics compatible con Dark GDK desde aqui:
http://darkphysics.thegamecreators.com/downloads.php pero antes requiere tener instalado el
Ageia PhysX Runtime que se encuentra aqui:
http://www.nvidia.es/object/physx_8.09.04_whql_es.html
En este post viene un ejemplo de cdigo utilizando Ageia Physx
http://forum.thegamecreators.com/?m=forum_view&t=122652&b=22 (Busca en un post el botn
que pone '+ Code Snippet')
Sobre la inteligencia artificial (IA) del juego existe una herramienta llamada Dark A.I. pero no es
gratuita. http://gdk.thegamecreators.com/?f=dark_ai
La dificultad es mayor si lo comparamos al uso de un game engine como el RF, pero si lo que
queremos es crear un proyecto en un entorno 2D al que podremos incluir 3D, por ejemplo un
juego del tipo estrategia, puede ser aconsejable su uso, al ser el C++ un lenguaje de programacin
conocido por muchos y con muchos tutoriales en la red.
En cambio, para realizar un shooter no ser una opcin recomendable para la mayora.
FLTK
Fast, Light Toolkit (se pronuncia felteck) es una biblioteca de GUI multiplataforma,
desarrollada inicialmente por Bill Spitzak y luego mantenida por un grupo de desarrolladores
alrededor del mundo. La biblioteca fue desarrollada teniendo en cuenta programacin de grficos
3D en mente, para esto tiene una interfaz a OpenGL, pero es an apropiada para desarrollar
aplicaciones IGU de propsito general. Utilizando sus propios widgets, trazado de grficos 2D y
sistema de eventos (aunque FLTK2 ha ganado experimental soporte para usar opcionalmente la
biblioteca grfica cairo) desarrollados sobre el abstracto cdigo dependiente del sistema, lo cual
permite escribir programas que lucen idnticos cuando son compilados en cualquiera de los
sistemas operativos soportados.
FLTK es software libre, licenciado bajo LGPL con la clusula adicional que permite enlazado
esttico por aplicaciones con licencias incompatibles. Adems incluye a FLUID (del ingls,
10
FLTK User Interface Designer), una interfaz de diseo grfico de FLTK que genera los archivos
de cabecera y cdigo para una IGU desarrollada.
En contraste a otras bibliotecas como Qt y wxWidgets, FLTK aplica una estricta regla de
eficiencia antes de apariencia, lo que le cuesta restricciones a su apariencia y funcionalidad, pero
por otro lado, hace de FLTK una biblioteca que consume muy bajos recursos y muy pequea en
tamao. Esto se refleja en el pequeo tamao de los programas (el programa Hola, Mundo! en
FLTK solo ocupa alrededor de 100 KiB), y permite que sea usualmente estticamente enlazada,
aunque el enlace dinmico tambin est disponible. Lo que previene el uso de complicados
macros y pre procesamiento de cdigo separado, adems no hace uso de avanzadas caractersticas
de C++ como: plantillas, excepciones, RTTI. Las versiones FLTK 1.1.x no usan namespace. Por
lo anterior y combinado con el modesto tamao del paquete, requiere de una corta curva de
aprendizaje para los nuevos usuarios.
Pero estas ventajas como se coment anteriormente vienen con sus correspondiente desventajas.
FLTK ofrece menos widgets o menos efectos que otras que ms grandes bibliotecas grficas,
adems por usar widgets no nativos, no luce como las aplicaciones nativas que lucen y se siente
igual que la plataforma grfica del sistema.
Origen del nombre
FLTK fue originalmente diseada para ser compatible con la biblioteca Forms desarrollada para
sistemas SGI (un derivado de esta biblioteca se conoce como XForms que an es
frecuentemente utilizada). En esa biblioteca todas las funciones y estructuras inician con fl_.
Este estilo fue extendido a todos los nuevos mtodos y widgets en las bibliotecas C++, y el
prefijo FL fue tomado como nombre de la biblioteca. Despus que FL fue liberada como
cdigo abierto, fue descubierto que fue imposible buscar por FL en Internet, debido al hecho
que es la abreviacin usada para Florida. Despus de muchos debates y buscado por un nuevo
nombre para la biblioteca, la cual fue para entonces utilizada por muchos desarrolladores y
usuarios, Su creador Bill Spitzak tuvo la idea de usar FLTK, con la explicacin que significaba
la abreviacin para la frase en ingls Fast Light Tool Kit, que traduce Herramientas de
Software Rpidas y Livianas.
Desarrollando aplicaciones con FLTK
11
FLTK fue principalmente diseada para, y escrita en, el lenguaje de programacin C++. Sin
embargo, diferentes interfaces existen para otros lenguajes de programacin orientada a objetos,
por ejemplo Python1 y Ruby.2
El siguiente ejemplo para FLTK 1.x crea una ventana con el texto "Hola, Mundo!" sobre un
botn:
# include <FL/Fl.H>
# include <FL/Fl_Window.H>
# include <FL/Fl_Button.H>
int main(int argc, char *argv[]) {
Fl_Window* w = new Fl_Window(330, 190);
new Fl_Button(110, 130, 100, 35, "Hola, Mundo!");
w->end();
w->show(argc, argv);
return Fl::run();
}
12
GTK
GTK "GIMP Tool Kit" es una biblioteca del equipo GTK+, la cual contiene los objetos y
funciones para crear la interfaz grfica de usuario. Maneja widgets como ventanas, botones,
mens, etiquetas, deslizadores, pestaas, etc.
Ventanas
GTK define varias clases para construir ventanas.
Clase
GtkDialog
GtkInvisible
GtkMessageDialog
Una ventana que puede contener
otros widgets.
GtkWindowGroup
GtkAboutDialog
GtkAssistant
Descripcin
Crea una ventana popup.
Un widget que no es mostrado.
Una ventana de mensaje.
Widgets sencillos
Los siguientes widgets slo muestran informacin y no permiten la entrada de datos.
Clase
Descripcin
GtkImage
GtkLabel
Imagen
13
GtkProgressBar
GtkStatusbar
GtkStatusIcon
Botones
Clase
GtkButton
Descripcin
Botn convencional. Crea una seal
cuando se da click sobre l.
GtkRadioButton
GtkToggleButton
Imagen
14
GtkLinkButton
GtkScaleButton
GtkVolumeButton
MINIWIN
MiniWin es super-simple: slo es un miniconjunto de funciones. Para usar MiniWin solamente
hay que seguir 2 pasos importantes:
Poner arriba del programa principal:
#include "miniwin.h"
using namespace miniwin;
Fjate en que hay comillas dobles y no ngulos alrededor de miniwin.h en el #include . El using
namespace miniwin te ser familiar por su equivalente con std .
Hacer la funcin main as:
int main() {
return 0;
}
Es decir, sin parmetros y devolviendo int . El return 0 es obligatorio. Aparte de eso se trata de
utilizar las funciones que se comentan a continuacin.
Control de la ventana
15
En MiniWin, al ejecutar el programa principal siempre se crear una sola ventana, a la que nos
referiremos como la ventana. Esta ventana no se puede redimensionar con el ratn (solamente
con la accin vredimensiona() ) y mantiene el dibujo que pintas aunque la minimices. Algunas
funciones utilizan coordenadas en esta ventana. Las coordenadas son un par ordenado de valores,
donde el primer valor es x y el segundo es y:
16
int valto ()
Funcin que averigua la altura de la ventana en pxeles, devolviendo un entero. Es similar
a vancho().
void vcierra ()
Accin que cierra la ventana y termina el programa. Si no se llama esta accin, cuando
acaba la funcin main la ventana se queda abierta mostrando el dibujo que hayamos
hecho, y hay que cerrarla manualmente. Esto nos puede interesar para observar el dibujo
que hayamos hecho.
Pintar en la ventana
Para pintar en la ventana hay que utilizar alguna de las acciones linea(), rectangulo(), circulo(),
etc. y luego hay que invocar la accin refresca(). Esencialmente, todo lo que se pinta se acumula
en un buffer y luego la accin refresca() hace visible en la ventana lo que se haya pintado
previamente. Esto tiene una ventaja y un inconveniente. La ventaja es que permite pintar muchas
cosas y luego refrescar solo una vez, que es importante cuando se hacen juegos. El inconveniente
es que si se olvida la llamada a refresca(), entonces no aparece por pantalla nada de lo que se ha
pintado y puede parecer que no funciona nuestro programa. En definitiva, es importante recordar
llamar a :cpp:func:`refresca` al acabar de pintar.
Para cambiar el color con el que se pinta, hay que llamar a la funcin color() antes de pintar, es
decir, todo lo que se pinta despus de la instruccin:
color(ROJO);
saldr en color rojo.
Por ejemplo, el siguiente programa
#include "miniwin.h"
using namespace miniwin;
int main() {
vredimensiona(200, 200);
lnea (0, 0, 100, 100);
color (AZUL);
rectngulo (10, 10, 50, 50);
color (ROJO);
circulo (100, 50, 20);
color (AZUL);
circulo_lleno (50, 100, 20);
17
color (VERDE);
rectangulo_lleno (50, 50, 100, 100);
refresca ();
}
Muestra el siguiente dibujo:
18
19
Pone en la ventana todos los objetos pintados acumulados. Muy importante llamar a esta
accin despus de pintar. Por ejemplo, para pintar una lnea (que se aade a todo lo
anterior:
linea(0, 0, 100, 100);
refresca();
void borra()
Borra el buffer interno de pintado. Todo lo que se pinte despus se pintar sobre un
fondo negro, como al principio. Para borrar la pantalla y dejarla negra, habra que llamar a
refresca() despus de llamar a borra(). O sea, para borrar la pantalla completamente y
hacerlo visible:
borra();
refresca();
Constante
Ninguna tecla
NINGUNA
Esc
ESCAPE
Barra espaciadora
ESPACIO
20
Tecla
Constante
Return
RETURN
Flecha Arriba
ARRIBA
Flecha Abajo
ABAJO
Flecha Derecha
DERECHA
Flecha Izquierda
IZQUIERDA
Teclas de Funcin
F1 , F2
hasta F10
Para las letras y los nmeros, el cdigo devuelto es el mismo cdigo ASCII. Para los nmeros
entre 48 y 57 y para las letras entre 65 y 90 (las maysculas).
El siguiente ejemplo detecta la presin de una tecla y si es la letra A se muestra un mensaje:
int t = tecla();
if (t == int('A')) {
mensaje("Has presionado la tecla 'A'");}
Funciones para el ratn
En MiniWin se puede saber dnde est situado el puntero del ratn y tambin si los botones
derecho y/o izquierdo estan presionados. Las funciones disponibles son las siguientes:
bool raton(float& x, float& y)
Obtiene las coordenadas de la posicin del ratn (x e y), y adems devuelve un Booleano
que indica si el ratn se encuentra dentro de la ventana. Si el ratn est fuera de la ventana
los valores x e y no sern reales y hay que ignorar su valor.
bool raton_dentro()
Retorna un valor Booleano indicando si el ratn se encuentra dentro de la ventana. Es
importante llamar a esta funcin antes de obtener las coordenadas de la posicin del ratn
ya que estas son correctas solamente cuando el ratn est dentro de la ventana.
float raton_x()
Devuelve la coordenada x de la posicin del ratn. Esta posicin es vlida si el ratn se
encuentra dentro de la ventana, por eso es necesario antes llamar a raton_dentro() o
llamar directamente a raton().
21
float raton_y()
Devuelve la coordenada y de la posicin del ratn. Esta posicin es vlida si el ratn se
encuentra dentro de la ventana, por eso es necesario antes llamar a raton_dentro() o
llamar directamente a raton().
void raton_botones(bool& izq, bool& der)
Obtiene el estado de los botones derecho e izquierdo del ratn. Si el valor Booleano izq
es cierto el botn izquierdo est presionado, y lo mismo ocurre para der con el botn
derecho.
bool raton_boton_izq()
Retorna un booleano indicando si el botn izquierdo est presionado.
bool raton_boton_der()
Retorna un booleano indicando si el botn derecho est presionado.
22
WXWIDGETS
Las wxWidgets son unas bibliotecas multiplataforma y libres, para el desarrollo de interfaces
grficas programadas en lenguaje C++. Estn publicadas bajo una licencia LGPL, similar a la
GPL con la excepcin de que el cdigo binario producido por el usuario a partir de ellas, puede
ser propietario, permitiendo desarrollar aplicaciones empresariales sin coste de licencias.
Las wxWidgets proporcionan una interfaz grfica basada en las bibliotecas ya existentes en el
sistema (nativas), con lo que se integran de forma ptima y resultan muy portables entre distintos
sistemas operativos. Estn disponibles para Windows, MacOS, GTK+, Motif, OpenVMS y OS/2.
Tambin pueden ser utilizadas desde otros lenguajes de programacin, aparte del C++: Java,
JavaScript, Perl, Python, Smalltalk, Ruby.
Breve historia
Fue diseado por Julian Smart en la universidad de Edinburgo 1992. Julian diseaba la
herramienta meta-CASE llamada Hardy que necesitaba correr en Windows, as como en
estaciones de trabajo de X-Unix, las herramientas existentes y comerciales multiplataforma eran
costosas para un proyecto experimental, as que su nica alternativa era crear su propia
herramienta. Inicialmente se llamaba wxWindows pero tuvo que cambiar al nombre por
wxWidgets debido a que la empresa Microsoft interpuso una demanda a finales de 2003 por una
posible confusin con el nombre de su sistema operativo.
WxWidgets (W para Windows y la X para X-Unix) es un framework parecido a MFC,
especializado en el desarrollo de aplicaciones multiplataforma en lenguaje C++ aunque tambin
existen bindings para Python y Perl, es multiplataforma, soporta Windows, Linux, Mac OS X ,
Unix y sus variantes, Solaris, Plataformas Embedded (inicios de investigacin ), tambin en
plataformas mviles como Microsoft Pocket PC, y Palm OS; se distribuye bajo licencia
wxWindows License (compatible con Open Source y LGPL) permitiendo utilizarla para
desarrollos comerciales, siempre y cuando estos desarrollos no usen cdigo distribuido bajo
alguna licencia GNU.
Cuenta con una parte denominada wxBase que incluye clases como wxString, clases para el
manejo de archivos y directorios de manera independiente del sistema, funcionalidades como:
23
grficos 2D, 3D con OpenGL, Bases de Datos (ODBC), Redes, Impresin, Hilos, visin e
impresin del HTML, un sistema de archivos virtual y cuenta con algunos IDEs.
La razones por las que se podra elegir wxWidgets son adems de sus ya mencionadas
caractersticas es que cuenta con soporte, documentacin en Internet, ayuda en lnea, foros,
tutoriales en diversos formatos, desarrolladores en la red por lo que se percibe inters y un futuro,
cuenta con un libro de 1000 pginas imprimibles de documentacin y en lnea, sistema flexible a
eventos, llamadas a grficos como lneas, rectngulos con esquinas redondeadas, etc. Soporte de
MDI (Multiple Document Interface), puede crear DLL sobre Windows, y bibliotecas dinmicas
en Unix.
Licencia
wxWidgets es distribuido bajo una licencia personalizada wxWindows License, similar a la
Licencia Pblica General Reducida de GNU, con la excepcin de que trabajos derivados en
forma binaria pueden ser distribuido bajo los trminos del usuario. Esta licencia est aprobada
por la Open Source Initiative,1 haciendo de wxWidgets software libre.2 Su nombre ser cambiado
por wxWidgets Licence.
Soporte oficial
Compatibilidad de plataformas
wxWidgets es compatible en las siguientes plataformas.
OS/2 - wxOS2, wxPM, wxWidgets para GTK+ o Motif puede ser compilado en OS/2
Otras plataformas
Compiladores compatibles
Est confirmado que wxWidgets funciona correctamente con los siguientes compiladores.
wxMSW
wxGTK
24
Compilador
Microsoft Visual Studio - Visual C++
Borland C++
Borland C++ Builder
Watcom C++, OpenWatcom
CodeWarrior
Cygwin
MinGW
Digital Mars C/C++ compiler
Versin Compilador
5.0 +
g++
5.5 +
Sun Studio C/C++
2006 + HP aC++
10.6 + IBM XL C/C++
7+
1.5 +
2.0 +
8.40 +
Versin
2.95 +
5.9
3.80
8.00
Implementaciones
wxPython logo
La biblioteca wxWidgets adems de estar implementada originalmente en C++, cuenta con
implementaciones (bindings) para varios lenguajes de programacin utilizados comnmente.
Algunos de ellos.
Lenguaje
Python
PHP
Erlang
Haskell
Tcl
Lua
Perl
Ruby
Smalltalk
Basic
BlitzMax
C
D
Euphoria
.NET Framework
Java
JavaScript
JavaScript
wxWidgets es mejor descrito como un conjunto de herramientas nativo debido a que provee una
fina capa de abstraccin a los controles nativos de una plataforma, contrario a la emulacin de
controles utilizando grficos primitivos. Utilizar un control nativo en las plataformas existentes
25
nos permite conseguir resultados visuales ms nativos para la interface grfica que otras
bibliotecas como Swing (para Java), adems de ofrecer mejor rendimiento y otros beneficios.
wxWidgets no solo se restringe al desarrollo de interfaces grficas, esto debido a que la biblioteca
cuenta con una capa de inter-procesos de comunicacin, funcionalidades para la red como
sockets, y mucho ms.
CodeLite en Windows XP
Hay muchas herramientas de Desarrollo Rpido de Aplicaciones (RAD) y Entornos de Desarrollo
Integrado (IDE) disponibles, entre ellos.
CodeLite
wxDev-C++ (Plugin)
wxGlade
wxFormBuilder
26
QT
Qt es una biblioteca multiplataforma ampliamente usada para desarrollar aplicaciones con
interfaz grfica de usuario, as como tambin para el desarrollo de programas sin interfaz grfica,
como herramientas para la lnea de comandos y consolas para servidores.
Qt es desarrollada como un software libre y de cdigo abierto a travs de Qt Project, donde
participa tanto la comunidad, como desarrolladores de Nokia, Digia y otras empresas.2
Anteriormente, era desarrollado por la divisin de software de Qt de Nokia, que entr en vigor
despus de la adquisicin por parte de Nokia de la empresa noruega Trolltech, el productor
original de Qt, el 17 de junio de 2008.3 Qt es distribuida bajo los trminos de GNU Lesser
General Public License (y otras). Por otro lado, Digia est a cargo de las licencias comerciales de
Qt desde marzo de 2011.
27
Qt es utilizada en KDE, entorno de escritorio para sistemas como GNU/Linux o FreeBSD, entre
otros. Qt utiliza el lenguaje de programacin C++ de forma nativa, adicionalmente puede ser
utilizado en varios otros lenguajes de programacin a travs de bindings. Tambin es usada en
sistemas informticos empotrados para automocin, aeronavegacin y aparatos domsticos como
frigorficos.
Funciona en todas las principales plataformas, y tiene un amplio apoyo. El API de la biblioteca
cuenta con mtodos para acceder a bases de datos mediante SQL, as como uso de XML, gestin
de hilos, soporte de red, una API multiplataforma unificada para la manipulacin de archivos y
una multitud de otros para el manejo de ficheros, adems de estructuras de datos tradicionales.
Qt es utilizada principalmente en Autodesk Maya,5 6 The Foundry's Nuke,7 Adobe Photoshop
Album, Google Earth, Skype,8 VLC media player,9 VirtualBox, Dassault DraftSight,10 11 y
Mathematica,12 y por la Agencia Espacial Europea,13 DreamWorks,14 15 HP,16 KDE,17 Lucasfilm,18
19
Panasonic,20 Philips,21 Samsung,22 Siemens,23 Volvo,24 Walt Disney Animation Studios25 y
Research In Motion.26
Historia
Fue desarrollado inicialmente por Haavard Nord (CEO de Trolltech) y Eirik Chambe-Eng
(presidente de Trolltech). Haavard y Eirik se reunieron en el Instituto Noruego de Tecnologa de
Trondheim, donde ambos se graduaron con una maestra en ciencias de la computacin. El kit de
herramientas se llam Qt porque la letra Q luca atractiva en la fuente Emacs la cual era muy
usada por Haavard en su trabajo, y "t" se inspir en Xt, el kit de herramientas X "X Tool kit".
Inicialmente Qt apareci como biblioteca desarrollada por Trolltech (en aquel momento Quasar
Technologies) en 1992 siguiendo un desarrollo basado en el cdigo abierto, pero no
completamente libre. Originalmente permita desarrollo de software cerrado mediante la compra
de una licencia comercial, o el desarrollo de software libre usando la licencia Free Qt. Esta ltima
no era una licencia real de software libre dado que no permita redistribuir versiones modificadas
de Qt. Se us activamente en el desarrollo del escritorio KDE (entre 1996 y 1998), con un notable
xito y rpida expansin, camino de convertirse en uno de los escritorios ms populares de
GNU/Linux.
Este hecho causaba preocupacin desde el proyecto GNU, ya que vean como una amenaza para
el software libre que uno de los escritorios libres ms usados se apoyase en software propietario.
Para contrarrestar esta situacin se plantearon dos ambiciosas iniciativas: por un lado el equipo
de GNU en 1997 inici el desarrollo del entorno de escritorio GNOME con GTK+ para
GNU/Linux. Por otro lado se intent hacer una biblioteca compatible con Qt pero totalmente
libre, llamada Harmony.
En 1998 desarrolladores de KDE se reunieron con Trolltech para establecer la KDE Free Qt
Foundation, que estableca que si Trolltech dejaba de desarrollar la versin gratuita y semi-libre
de Qt la propia Fundacin podra liberar la ltima versin publicada de la biblioteca Qt bajo una
licencia tipo BSD28 Con la versin 2.0 se cambi a la licencia Q Public License, considerada de
28
cdigo abierto. Este cambio pretenda acallar las crticas a Qt y KDE que alegaban que no era
software libre. Sin embargo, QPL no era compatible con la licencia GPL que usaba KDE, por lo
que hubo voces que afirmaban que se estaba violando la licencia GPL al mezclar software QPL
(la biblioteca Qt) con software GPL (KDE).29
El 4 de septiembre de 2000, Trolltech comenz a ofrecer la biblioteca Qt en su versin 2.1 bajo la
licencia GPL en su versin para Linux. La versin para Mac OS X no se public bajo GPL hasta
junio de 2003, mientras que la versin para Windows fue publicada bajo la licencia GPL en junio
de 2005.
El 18 de enero de 2008, Trolltech anunci que tambin ofrecera Qt bajo la licencia GPL v3.
En junio de 2008, Nokia adquiri Trolltech, para desarrollar aplicaciones de escritorio y para
dispositivos mviles. Esta ltima fue integrada a Nokia como Qt Software.3
El 14 de enero de 2009, Nokia anunci que Qt v4.5 se licenciara adicionalmente bajo la licencia
LGPL 2.1, con el lema Qt Everywhere.30
Nokia anunci que va a detener sus desarrollos en Symbian para usar la plataforma de Microsoft
para sus telfonos inteligentes en febrero de 2011.
El 9 de agosto de 2012, Digia anunci un acuerdo con Nokia para la adquisicin de Qt. Algunos
de los planes de Digia son el desarrollo de Qt para Android, iOS y Windows 8.31
Qt cuenta actualmente con un sistema de triple licencia: GPL v2/v3 para el desarrollo de software
de cdigo abierto y software libre, la licencia de pago QPL para el desarrollo de aplicaciones
comerciales, y a partir de la versin 4.5 una licencia gratuita pensada para aplicaciones
comerciales, LGPL.
Plataformas
Qt se encuentra disponible para sistemas tipo unix con el servidor grfico X Window System
(Linux, BSDs, Unix), para Apple Mac OS X, para sistemas Microsoft Windows, para Linux
empotrado (en ingls Embedded Linux), para sistemas empotrados como PDA, Smartphone, etc.
y para dispositivos que utilizan Windows CE32
Qt Software anunci el 20 de octubre de 2008 una versin de Qt para la plataforma S60.33 34
Adicionalmente tambin est disponible QSA (Qt Scripts for Applications), que, basndose en
ECMAScript/JavaScript, permite introducir y crear scripts en las aplicaciones creadas con Qt.
Hay tres ediciones de Qt disponibles en cada una de estas plataformas, llamadas:
29
GUI Framework edicin con nivel reducido de GUI, orientado a redes y bases de
datos.
Bindings
Qt dispone de una serie de bindings para diversos lenguajes de programacin:
Ejemplo de programacin
30
Compilacin y ejecucin
1. Se crea la carpeta Hola
2. Se crea el archivo Hola.cpp en la carpeta Hola
3. En un emulador de terminal descender a la carpeta Hola y ejecutar:
a) qmake -project
b) qmake
c) make/gmake/nmake - segn el sistema operativo o de compilacin
4. Para ejecutar el programa:
d) ./release/Hola (en Windows: release\Hola.exe)
Aplicaciones escritas en Qt
Ejemplos de aplicaciones populares que usan Qt:
31
Last.fm Player, el cliente de escritorio para la popular comunidad web de msica y radio
por internet.
32
SDL+DEV
Hoy traigo algo muy interesante para los que les gusta trabajar con graficas en cualquier lenguaje,
en esta entrada nos concentraremos exclusivamente en la utilizacin de la librera SDL (Simple
DirectMedia Layer), esta es una librera grafica que se traba tanto en lenguaje C como en C++,
por lo cual es muy util a la hora de hacer algunas maravillas.
Empezare dando a conocer ms sobre esta librera tan poderosa y simple de usar, ya que ms
adelante publicare algunos ejemplo que he realizado, y asi se interesen ms en trabajar con esta
sorprendente librera. SDL es una librera o biblioteca de desarrollo multiplataforma que fue
diseado para proporcionar acceso de bajo nivel a todos los dispositivos de nuestra computadora,
es decir, audio, teclado, ratn, joystick, y los grficos de hardware a travs del conocido OpenGL
o Direct3D. Los que utilizan esta librera son softwares de reproduccin de video, emuladores y
juegos populares.
SDL oficialmente est disponible para plataformas como Windows, Mac OS X, Lunix, iOS y
Android. Adems en la pgina oficial dice que se ofrece soporte para otras plataformas pero este
se encuentra exclusivamente en cdigo fuente. SDL como los softwares ms potentes est escrito
en lenguaje C, y funciona de forma nativa en nuestros PCs incluyendo por supuesto C++, adems
hay disponibles en la web enlaces para otros idiomas de programacin como C# y Python, por lo
que hace a esta librera mucho muy potente. SDL ya se encuentra en su versin 2.0 y se
distribuye bajo la licencia de zlib, esta licencia hace nos permite utilizar la librera de forma
totalmente libre en cualquier software.
Por otro lado SDL se le pueden incorporar componentes adicionales, los que complementan las
funcionalidades y capacidades de la biblioteca base.
SDL Mixer: Extiende las capacidades de SDL para la gestin y uso de sonido y msica en
aplicaciones y juegos. Es compatible con formatos de sonido comoWave, MP3 y OGG, y
formatos de msica como MOD, S3M, IT, y XM.
SDL Image: Extiende notablemente las capacidades para trabajar con diferentes formatos
de imagen. Los formatos compatibles son los
siguientes: BMP, JPEG,TIFF, PNG, PNM, PCX, XPM, LBM, GIF, y TGA,
SDL Net: Proporciona funciones y tipos de dato multiplataforma para programar
aplicaciones que trabajen con redes.
SDL RTF: Posibilita el abrir para leer en aplicaciones SDL archivos de texto usando el
formato Rich Text Format RTF.
SDL TTF: Permite usar tipografas TrueType en aplicaciones SDL.
33
34
Una vez hecho esto abriremos el IDE Dev-C++, y las herramientas (tools), elegimos opciones de
compilador (compilator option), luego tiqueaos aadir estos comandos a la lnea de comandos
linker (add these commands to the linker command line) y agregamos estas lneas:
35
En esa misma ventana nos dirigimos a Directorios (directories) y en binarios agregamos la ruta de
nuestro SDL\bin donde aparece el examinar quedara de la siguiente manera C: \SDL\bin,
enseguida en libreras aadimos la ruta SDL\lib de esta forma C:\SDL\lib y por ltimo en
cabeceras C aadimos la ruta SDL\incluida de tal forma que quede as C:\SDL\include. Una vez
hecho estos pasos estamos listos para nuestro primer programa con SDL.
36
37
38
39
40
Para compilar se agrega el comando -lSDL - lpthread a la linea de compilacion tradicional del
gcc.
41
Ejemplo de prueba:
#include <stdio.h>
#include <SDL/SDL.h>
void imprimir_rectangulo (SDL_Surface *screen, int x,int y)
{
SDL_Rect rect = {x, y, 50, 50};
Uint32 a = SDL_MapRGB(screen->format, 255, 200, 100);
SDL_FillRect(screen, &rect, a);
SDL_UpdateRect(screen, rect.x, rect.y, rect.w, rect.h);
}
int main(int argc, char *argv[])
{
SDL_Surface *screen;
SDL_Event event;
if (SDL_Init(SDL_INIT_VIDEO) == -1)
{
printf("Error: %s\n", SDL_GetError());
return 1;
}
screen = SDL_SetVideoMode(320, 240, 16, SDL_SWSURFACE);
if (screen == NULL)
{
printf("Error: %s\n", SDL_GetError());
return 1;
}
SDL_WM_SetCaption("Ejemplo bsico", NULL);
imprimir_rectangulo(screen, 20, 30);
while (SDL_WaitEvent(&event))
{
if (event.type == SDL_QUIT)
break;
}
SDL_Quit();
return 0;
}
42
OPENGL
OpenGL es una interface de software para el hardware grfico, esta interface consiste de una
larga serie de comandos para manipulacin de objetos y operaciones sobre estos los cuales
permiten controlar la implementacin realizada en la forma de una mquina de estados finitos,
donde cada una de las variables que determinan el estado se aplican a partir de ese punto hasta
que se indique explcitamente el cambio, asi las variables de estado de OpenGL que vamos a
utilizar ms comnmente son:
Funcionamiento de OpenGL:
43
Para poder trabajar con OpenGL, primero se debe crear un contexto de trabajo, este contexto
contiene el estado actual de maquina finita, as como las referencias a los diferentes buffers de
trabajo, estos buffers se pueden ver como zonas de memoria correspondiendo a la pantalla en las
cuales OpenGL va a dibujar, en general a parte del buffer de color (GL_COLOR_BUFFER) que
es el buffer en el cual se van a dibujar las primitivas, existen otro tipo de buffers ms
especializados.
La configuracin en memoria de estos buffers (cuantos bits representan un pixel, etc) depende de
la manera como fue creado el contexto OpenGL y de las limitaciones del hardware, por esto no se
puede acceder directamente sino solo a travs de las primitivas OpenGL.
OpenGL puede funcionar adicionalmente de dos maneras, de modo directo o indirecto:
Modo directo: las primitivas se van dibujando a medida que se van definiendo.
Instruccion -> Buffer de Color = Pantalla
Modo indirecto: las primitivas se guardan en una lista y solo se dibujan cuando el usuario
decida o la lista este llena, esto permite optimizar la fase de dibujo.
Instruccion-> Pila de instrucciones-> flush -> Buffer de Color = Pantalla
En este modo cuando se desea que OpenGL pinte lo que est en la lista se utiliza la instruccin
glFlush(): esta instruccion obliga a pintar y no espera a que el hardawre termine para continuar
con el programa, analogamente la glFinish() obliga a pintar pero espera a que el hw termine antes
de continuar con el programa.
En el modo indirecto, OpenGL permite definir dos buffers de colores (doublebuffer), asi un
buffer corresponde a lo que se ve en pantalla y otro al buffer donde se est pintando, de esta
manera una vez que se ha pintado todo lo deseado y se quiere que esto aparezca en pantalla se
intercambian los buffers, esta instruccion depende del sistema operativo para esto se utilizara la
instruccin de la librera portable glut: glutSwapBuffers() (esta ejecuta implcitamente glFlush o
glFinish), en este modo glFlush y glFinish obligan a pintar en el buffer de dibujo pero esto NO
sera visible hasta intercambiar buffers.
Primitivas de dibujo:
En OpenGL solo se pueden dibujar primitivas muy simples, tales como puntos lneas, cuadrados,
tringulos y polgonos, a partir de estas primitivas es posible construir primitivas ms complejas
como arcos y crculos aproximndolos por polgonos.
Toda primitiva de dibujo se construye con un par: glBegin(tipo_de_primitiva); glVertex2f(); ...
glEnd(); donde tipo_de_primitiva puede ser cualquiera de las siguientes:
GL_POINTS: Cada vrtice es un punto
GL_LINES: Cada par de vrtices sucesivos es una lnea
GL_LINE_STRIP: lneas conectadas.
GL_LINE_LOOP: lneas conectadas donde el ultimo y el primer vrtice indican una lnea
cerrando el polgono.
44
GL_POLYGON: polgono (relleno o no) donde los vrtices sucesivos componindolo se dan el
sentido contrario de las manecillas del reloj.
GL_QUADS: cuadrilteros separados, cada 4 vrtices hacen un quad.
GL_QUAD_STRIP: tira de cuadrados unidos, cada par de vrtices sucesivos forman un cuadrado
con el par anterior.
GL_TRIANGLES: Tringulos separados, cada 3 vrtices hacen un tringulo.
GL_TRIANGLE_STRIP: tira de tringulos unidos (similar quad_strip).
GL_TRIANGLE_FAN: Grupo de tringulos con un nico vrtice comn a todos.
Dentro del par glBegin, glEnd solo pueden ir instrucciones OpenGL para definir objetos tales
como vertices, y colores (existen otras ms complejas como normales y materiales) y no
transformaciones ni cambios de estado (diferentes a los especificados), adicionalmente dentro del
par pueden ir instrucciones de programacion del lenguaje tales que ciclos, condicionales,
llamados a funciones, etc. Siempre y cuando no usen alguna de las funciones OpenGL no
permitidas, i.e.:
glBegin(GL_POLYGON);
glColor3f(1.0, 0.0, 0.0); // rojo
45
46
47
voidreshape(intw,inth)
{
glViewport(0,0,w,h);//coloqueelviewportaltamanodela
ventana
glMatrixMode(GL_PROJECTION);//modomatrizdeproyeccion
glLoadIdentity();//inicializelamatriz
glOrtho(0,w,0,h,1,1);//tranformaciondirectaapantalla
glScalef(1,1,1);//inviertaYparaquevayaparaabajo
glTranslatef(0,h,0);//corraelorigenalapartesuperior
izq.
glMatrixMode(GL_MODELVIEW);//modomatrizdetransformacion
glLoadIdentity();//inicializelamatriz
}
voiddisplay(void)//pinte....
{
glClear(GL_COLOR_BUFFER_BIT);//borrelapantalla
glBegin(GL_TRIANGLES);//pinte
glColor3f(0.0,0.0,1.0);
glVertex3f(0,1,0);
glVertex3f(0,0,0);
glVertex3f(0,1,0);
glEnd();
glutSwapBuffers();//cambiebuffers...
}
voidkeyboard(unsignedcharc,intx,inty)
{
switch(c){//aquiadicionarloscasosparalasdiferentes
teclas.
case27:exit(0);
break;
}
glutPostRedisplay();//pintesisecambiaronvariablesque
afectaneldibujo
}
voididle(void)
{
//modifiquevariables
glutPostRedisplay();//pinte
}
voidmain(intargc,char**argv)
{
glutInit(&argc,argv);//inicielalibreriaGLUT
48
glutInitDisplayMode(GLUT_RGB|GLUT_DOUBLE);//inicieelmodode
video
glutInitWindowSize(w,h);//inicietamanodelaventana
glutInitWindowPos(x,y);//inicieposiciondelaventana
glutCreateWindow("nombreventana");
init();//iniciarvariablesyestadoglobal
glutDisplayFunc(display);//instalelafunciondedisplay
glutReshapeFunc(reshape);//instalelafunciondetamao.
glutKeyboardFunc(keyboard);//instalelafunciondeteclado
glutIdleFunc(idle);//funciondeanimacion.
glutMainLoop();//cicloinfinito
Manejo de Buffers
Para utilizar los diferentes tipos de buffers de OpenGL estos se deben crear al crear el contexto
opengl, en el caso de la utilizacin de la librera glut, al llamar la funcin: glutInitDisplayMode
(buffers), buffers es una combinacin de valores indicando que buffers se deben crear i.e. para
crear un contexto con doble buffer rgba y z-buffer buffers seria = GLUT_RGBA |
GLUT_DOUBLE | GLUT_DEPTH, los valores para crear otro tipos de buffers son:
GLUT_STENCIL = buffer de stencil.
GLUT_ACCUM = buffer de acumulacion.
Todos los buffers deben ser activados o desactivados dependiendo de la utilizacin con el
comando
glEnable(param) o glDisable(param), donde param corresponde al tipo de test que se activa, i.e
param=
GL_STENCIL_TEST para el buffer de stencil, o param=GL_DEPTH_TEST para el buffer de
profundidad (activado por defecto).
Los buffers de stencil, acumulacion y profundidad funcionan aplicando una serie de operaciones
y funciones sobre los valores que se van a escribir en el buffer, asi para manejar la funcion del
buffer de profundidad se utiliza la funcion glDepthFunc(funcion), donde funcion indica cuando
pasa el test de profundidad (GL_EQUAL, GL_LESS, GL_LEQUAL (por defecto),
GL_NOTEQUAL, GL_GREATER, GL_GEQUAL). En el caso de la funcion de test, se define
glStencilFunc(funcion, mascara), donde funcion son las mismas que para la profundidad, y
mascara indica que bits del stencil se utilizan. Adicionalmente a la funcion de stencil, se utiliza la
operacion de stencil glStencilOp(fallo,zfallo,zpaso) que especifica cmo se modifica el buffer de
stencil dependiendo de si la funcion del buffer stencil y z fallaron o pasaron, pueden ser
GL_KEEP,GL_ZERO, GL_REPLACE, GL_INCR, GL_DECR, GL_INVERT.
Manejo de Animacion y Timers
Opengl no maneja animacion ni timers directamente ya que esto depende del sistema operativo,
OpenGL solo se preocupa de colocar poligonos en la pantalla, y solo seria cuestion de ordenarle
de manera ciclica el repintar la pantalla con paramentros nuevos, el problema se encuentra
cuando se desea que la animacion se no bloqueante, la libreria GLUT nos facilita el manejo de la
animacion de dos maners independientemente del Sistema operativo de manera no bloqueante:
49
1. Funcin de animacin Idle, GLUT nos permite manejar la animacion definiendo una
funcion de animacion con la funcion glutIdleFunc(funcname), donde funcname es el
nombre de la funcin que se va a llamar para realizar la animacion, esta funcion no recibe
ni retorna parametro alguno, esta funcion se debe encargar de calcular los parametros de
la animacion y luego llamar la funcion de dibujo, esta no se debe llamar directamente sino
con la funcion glutPostRedisplay() que quiere decir que solo se llama una vez se acabe
de calcular la funcion idle, esta funcion idle no se ejecuta de manera regular, solo se
ejecuta una vez se hallan procesado todos los eventos que recibe la aplicacion tales como
teclado, repintar, etc. Por lo tanto la velocidad de la animacin resultante puede no ser
constante.
2. Funciones de Timers, para evitar el problema de la velocidad de animacion irregular y
para tener mas control sobre el tiempo de ejecucion de la funcion de animacion, glut nos
permite definir timers de a loscuales le asignamos una funcion que se debe ejecutar cada
cierto tiempo definido por el timer, para definirestos timers se utiliza la funcion:
glutTimerFunc(tiempo,funciontimer,valor), donde tiempo es el tiempo en milisegundos
del timer, funciontimer es la funcion a llamar la cual no devuelve nada pero recibe un
parametro entero (valor), valor es el parametro que se le va a pasar a la funcion. Esta
funcion se ejecuta dentro del tiempo determinado y termina, si se desea que se vuelva a
llamar, al final de la funcion se debeinstalar de nuevo el timer. El valor sirve para
seleccionar diferentes acciones la proxima vez que se llame el timer, como estas funciones
no reciben parametros, de cualquier resultado debe ser devuelto por una variable global.
Compilacion de aplicaciones OpenGL en Windows
Para compilar un programa OpenGL suponiendo que se est en un sistema operativo MSWindows, con el compilador VisualC++, se debe recuperar la librera glut para windows (glut.h
glut32.lib y glut32.dll), los archivos .h y . lib se deben colocar en el directorio respectivo para
includes y librerias del VisualC, el archivo glut32.dll se debe colocar en el directorio system32 de
windows idealmente o en su defecto en el directorio donde va a quedar el ejecutable. En el
VisualC se debe crear un proyecto nuevo de tipo win32 o win32 consola (si se va a utilizar GLUT
NO! se debe crear proyecto de tipo MFC) En las opciones de compilacin del proyecto, en el
tabulador de encadenamiento, se debe adicionar las siguientes libreras en este orden especfico:
glut32.lib glu32.lib opengl32.lib.
Compilacin de aplicaciones OpenGL en Linux
Para compilar un programa OpenGL suponiendo que se esta en sistema operativo UNIX o Linux
con las libreras instaladas en lugares estndar se debe dar el siguiente comando suponiendo que
todo el programa est en un solo archivo:
Programa est en C:
gcconombre_ejecutablenombre_programa.clglutlGLUlGLlm
Programa esta en C++:
g++onombre_ejecutablenombre_programa.clglutlGLUlGLlm
Si el programa esta compuesto por varios modulos C o C++ se debe realizar un archivo llamado:
Makefile, este archivo debe ser de la manera siguiente:
50
CC = gcc
CXX = g++
INCDIR = -I./ -I/usr/local/include
# XLIBS = -lX11 -lXt -lXext -lXm -lXmu -lXi
GL_LIBS= -lglut -lGLU -lGL -lm
LIBDIR = -L/usr/X11/lib -L/usr/X11R6/lib -L/usr/local/lib
CFLAGS = -O
DOCDIR = doc
OBJECTS= modulo1.o modulo2.o
PROGS = nombreprograma
.SUFFIXES: .c .cc .cpp
.c:
$(CC) -o $@ $(CFLAGS) $(INCDIR) $< $(LIBDIR) $(GL_LIBS) $(XLIBS)
.cc:
$(CXX) -o $@ $(CFLAGS) $(INCDIR) $< $(LIBDIR) $(GL_LIBS) $(XLIBS)
.cpp:
$(CXX) -o $@ $(CFLAGS) $(INCDIR) $< $(LIBDIR) $(GL_LIBS) $(XLIBS)
all: $(OBJECTS) $(PROGS)
nombreprograma: modulo1.c modulo2.cpp
$(CC) -o $@ $(CFLAGS) $(INCDIR) $(OBJECTS) $(LIBDIR) $(GL_LIBS) $(XLIBS)
Ojo: Las identaciones en el archivo son tabulador no espacios en blanco!
Solo se debe cambiar nombre programa por el nombre del archivo que contiene la funcin main,
y modulo1, modulo2, etc por los nombres de los otros archivos conteniendo otras funciones del
programa, para compilar solo basta dar en la linea de comandos el comando:
Make
Para correr el programa ya sea que se haya compilado con la ayuda de make o directamente a
mano con
gcc/g++ solo basta dar el comando:
./nombredeprograma
Para ms informacin sobre el comando make dar el comando: manmakeo en caso que este
falle:
infomake
Para ms informacin sobre opciones gcc/g++ dar el comando: mangcco mang++
51
GRAPHICS
Funciones
void far arc(int x, int y, int comienzo_angulo, int final_angulo, int radio);
Esta funcin crear un arco circular. El arco tiene como centro el punto especificado por los
argumentos x e y, y es dibujado con el radio especificado: radio. El arco no est rellanado, pero es
dibujado usando el color actual. El arco comienza al ngulo especificado por el argumento
comienzo_angulo y es dibujado en la direccin contraria al de las agujas del reloj hasta llegar al
ngulo especificado por el argumento final_angulo. La funcin arc usa el este (extendindose
hacia la derecha del centro del arco en la direccin horizontal) como su punto de 0 grados. La
funcin setlinestyle puede usarse para establecer el grosor del arco. La funcin arc, sin embargo,
ignorar el argumento trama de la funcin setlinestyle.
void far bar(int izquierda, int superior, int derecha, int inferior);
Esta funcin dibujar una barra rectangular y rellenada de dos dimensiones. La esquina superior
izquierda de la barra rectangular est definida por el argumento izquierdo y superior. Estos
argumentos corresponden a los valores x e y de la esquina superior izquierda. Similarmente, los
argumentos derecha e inferior definen la esquina inferior derecha de la barra. La barra no tiene
borde, pero es rellenada con la trama de relleno actual y el color de relleno como es establecido
por la funcin setlinestyle.
void far bar3d(int izquierda, int superior,int derecha, int inferior, int profundidad, int
banderin_tapa);
Esta funcin crear una barra rectangular y rellenada de tres dimensiones. La esquina superior
izquierda de la barra rectangular ms frontal est definida por el argumento izquierdo y superior.
Estos argumentos corresponden a los valores x e y de la esquina superior izquierda del rectngulo
ms frontal. Similarmente, los argumentos derecha e inferior definen la esquina inferior derecha
del rectngulo ms frontal. La barra tiene borde, en todas las tres dimensiones, rellenada con el
color y estilo de lnea actuales. El rectngulo ms frontal es rellenado usando la trama de relleno
actual y el color de relleno como es establecidopor la funcin setlinestyle. El argumento
banderin_tapa es usado para especificar si es o no es posible apilar varias barras encima de cada
una. Si banderin_tapa tiene un valor distinto a cero, entonces la barra est "tapada". Si
banderin_tapa tiene un valor de cero, entonces la barra no est "tapada", permitiendo otras barras
ser apiladas encima de sta.
void far circle(int x, int y, int radio);
Esta funcin se usas para dibujar un crculo. Los argumentos x e y definen el centro del crculo,
mientras que el argumento radio define el radio del crculo. El crculo no es rellenado pero es
dibujado usando el color actual. El grosor de la circunferencia puede ser establecido por la
funcin setlinestyle; sin embargo, el estilo de la lnea es ignorado por la funcin circle. La
proporcin anchura-altura para el modo actual es considerado cuando se calcula el crculo. Por
esta razn, alterando los valores de defecto x e y de los factores de anchura-altura afectar el
crculo (ya no seguir siendo redondo).
52
53
void far ellipse(int x, int y, int comienzo_angulo,int final_angulo, int x_radio, int y_radio);
Esta funcin es usada para dibujar un arco elptico en el color actual. El arco elptico est
centrado en el punto especificado por los argumentos x e y. Ya que el arco es eilptco el
argumento x_radio especifica el radio horizontal y el argumento y_radio especifica el radio
vertical. El arco elptico comienza con el ngulo especificado por el argumento comienzo_angulo
y se extiende en un sentido contrario a las agujas del reloj al ngulo especificado por el
argumento final_angulo. La funcin ellipse considera este - el eje horizontal a la derecha del
centro del elipse - ser 0 grados. El arco elptico es dibujado con el grosor de lnea actual como es
establecido por la funcin setlinestyle. Sin embargo, el estilo de lnea es ignorado por la funcin
ellipse.
void far fillellipse(int x, int y, int x_radio, int y_radio);
Esta funcin es usada para dibujar y rellenar una elipse. El centro de la elipse es especificado por
los argumentos x e y. El argumento x_radio especifica el radio horizontal y el argumento y_radio
especifica el radio vertical de la elipse. La elipse es dibujado con el permetro en el color actual y
rellenada con el color de relleno y la trama de relleno actuales.
void far fillpoly(int numpuntos, int far *puntos);
Esta funcin es usada para crear un polgono rellenado. El argumento numpuntos es usado para
definir el nmero de puntos en el polgono. Al contrario que la funcin drawpoly, la funcin
automticamente cierra el polgono. El argumento *puntos apunta a un array de nmeros de
longitud numpuntos multiplicado por 2. Los dos primeros miembros del array identifica las
coordenadas x e y del primer punto, respectivamente, mientras que los dos siguientes especifican
el siguiente punto, y as sucesivamente. La funcin fillpoly dibuja el permetro del polgono con
el estilo de lnea y color actuales. Luego, el polgono es rellenado con la trama de relleno y color
de relleno actuales.
int far getbkcolor(void);
Esta funcin es usada para obtener el valor del color de fondo actual. El color de fondo, por
defecto, es el color 0. Sin embargo, este valor puede cambiar con una llamada a la funcin
setbkcolor.
Existen varios valores para ciertos colores de fondo.
La funcin getbkcolor retorna el valor del color de fondo actual.
Constante
Valor
Significado
BLACK
Negro
BLUE
Azul
GREEN
Verde
CYAN
Can
RED
Rojo
54
MAGENTA
Magenta
BROWN
Marrn
LIGHTGRAY
Gris Claro
DARKGRAY
Gris Oscuro
LIGHTBLUE
Azul Claro
LIGHTGREEN
10
Verde Claro
LIGHTCYAN
11
Can Claro
LIGHTRED
12
Rojo Claro
LIGHTMAGENTA 13
Magenta Claro
YELLOW
14
Amarillo
WHITE
15
Blanco
55
Esta funcin es usada para obtener el valor del color del pxel especificado por los argumentos x
e y. Estos argumentos especifican las coordenadas de la pantalla del pxel a ser evaluado. Cuando
se evala el valor del color retornado, el modo grfico en uso debe ser considerado.
int far getx(void);
Esta funcin es usada para obtener la posicin, en la direccin horizontal, del cursor grfico. El
valor retornado especifica el lugar del pxel horizontal del cursor grfico (la coordenada x),
relativo a la pantalla del usuario actual.
Valor de retorno:
La funcin getx retorna la coordenada x del cursor grfico.
int far gety(void);
Esta funcin es usada para obtener la posicin, en la direccin vertical, del cursor grfico. El
valor retornado especifica el lugar del pxel vertical del cursor grfico (la coordenada y), relativo
a la pantalla del usuario actual.
Valor de retorno:
La funcin gety retorna la coordenada y del cursor grfico.
void far initgraph(int far *driver, int far *modo, int far *path);
Esta funcin es usada para cargar o validar un dispositivo grfico y cambiar el sistema de vdeo a
modo grfico. La funcin initgraph debe ser llamada antes de cualesquier funciones que generan
una salida grfica sean usadas.
Existen varios valores a ser usados para el argumento *driver. Si *driver es asignado a DETECT,
0, la funcin detectgraph es llamada, y un dispositivo y modo grfico apropiados son
seleccionados. Asignando a *driver cualquier otro valor predefinido inicia la carga del dispositivo
grfico correspondiente.
Existen varios valores a ser usados para el argumento *modo. Estos valores deberan
corresponder al dispositivo especificado en el argumento *driver.
El argumento *path especificad el directorio donde los dispositivos grficos estn localizados. La
funcin initgraph buscar el dispositivo primeramente en este directorio. Si no es encontrado, la
funcin buscar en el directorio de inicio. Cuando el argumento *path es NULL, solamente el
directorio de inicio es buscado.
Otra forma para evitar cargando el dispositivo desde el disco cada vez que el programa es
ejecutado es ligarlo o enlazarlo al dispositivo apropiado en un programa ejecutable.
Valor de retorno:
La funcin initgraph no retorna ningn valor. Sin embargo, cuando la funcin initgraph es
llamada, el cdigo de error interno es activado. Si la funcin initgraph termina con xito, el
cdigo es asignado un 0. Si no, el cdigo es asignado as:
56
-2
grNotDetected
-3
grFileNotFound
-4
grInvalidDriver
-5
grNoLoadMem
void far line(int x1, int y1, int x2, int y2);
Esta funcin es usada para conectar dos puntos con una lnea recta. El primer punto es
especificado por los argumentos x1 e y1. El segundo punto es especificado por los argumentos x2
e y2. La lnea se dibuja usando el estilo de lnea actual, el grosor, y el color actual. La posicin
del cursor grfico no es afectada por la funcin line.
void far linerel(int dx, int dy);
Esta funcin es usada para dibujar una lnea recta a una distancia y direccin predeterminadas
desde la posicin actual del cursor grfico. El argumento dx especfica el nmero relativo de
pxels para atravesar en la direccin horizontal. El argumento dy especfica el nmero relativo de
pxels para atravesar en la direccin vertical. Estos argumentos pueden ser tanto valores positivos
como negativos. La lnea se dibuja usando el estilo de lnea actual, el grosor, y el color actual
desde la posicin actual del cursor grfico a travs de la distancia relativa especificada. Cuando la
lnea est terminada, la posicin del cursor grfico es actualizada al ltimo punto de la lnea.
void far lineto(int x, int y);
Esta funcin es usada para dibujar una lnea recta desde la posicin actual del cursor grfico hasta
el punto especificado por los argumentos x e y. La lnea se dibuja usando el estilo de lnea actual,
el grosor, y el color actual. Despus de que la lnea recta haya sido dibujado, la posicin del
cursor grfico es actualizado a la posicin especificado por los argumentos x e y (el punto final
de la lnea).
void far moveto(int x, int y);
Esta funcin es usada para colocar el cursor grfico al punto especificado por los argumentos x e
y. Ya que el cursor es movido desde su posicin anterior al punto especificado por los argumentos
x e y, no hay dibujo alguno.
Esta funcin es usada para mostrar una cadena de caracteres. El argumento *cadena_texto define
la cadena de texto a ser mostrado. La cadena es mostrado donde est el cursor grfico
actualmente usando el color actual y fuente, direccin, valores, y justificaciones de texto. La
posicin del cursor permanece sin ser cambiado al menos que la justificacin horizontal actual es
LEFT_TEXT y la orientacin del texto es HORIZ_DIR. Cuando esto sea el caso, la posicin del
cursor es colocada horizontalmente a la anchura del pxel de la cadena de texto. Adems, cuando
se use la fuente por defecto, cualquier texto que se extiende a fuera del rea grfica actual es
truncado.
Aunque la funcin outtext est diseada para texto sin formato, texto con formato puede ser
mostrada a travs del uso de un bfer de caracteres y la funcin sprintf.
57
58
Esta funcin es usada para definir las caractersticas de lneas para lneas rectas.
El argumento estilo especifica la trama de lnea predefinida para su uso. El argumento trama es
una trama de 16 bits que describe el estilo de lnea cuando el argumento estilo es
USERBIT_LINE, 4. Un bit 1 en esta trama indica que el pxel correspondiente ser asignado el
color actual. Un bit 0 indica que el pxel correspondiente no ser alterado. El argumento grosor
define el grosor de la lnea.
Estilos de Lneas
Constante
Valor
Significado
SOLID_LINE
Lnea continua
DOTTED_LINE
CENTER_LINE
Lnea centrada
DASHED_LINE
Lnea discontinua
USERBIT_LINE
NORM_THICK
Grosor es de 1 pxel
THICK_WIDTH
Grosor es de 3 pxels
Valor
Significado
DEFAULT_FONT
TRIPLEX_FONT
SMALL_FONT
SANS_SERIF_FONT
59
GOTHIC_FONT
SCRIPT_FONT
SIMPLEX_FONT
TRIPLEX_SCR_FONT
COMPLEX_FONT
EUROPEAN_FONT
BOLD_FONT
10
Valor
Significado
HORIZ_DIR
Texto horizontal
VERT_DIR
Texto vertical