Rotación de texto
Cada carácter generado por glutBitmapCharacter se visualiza de modo que el origen (esquina inferior
izquierda) del mapa de bits se encuentre en la posición de visualización actual. Después de cargar el mapa de bits del carácter en el búfer de refresco, se añade a la coordenada de la posición actual de visualización un desplazamiento igual a la anchura del carácter. Como ejemplo, podríamos visualizar una cadena de texto qu contuviera n caracteres de mapa de bits mediante el código siguiente:
glRotatef(rotar, 0, 0, 1.0);
glColor3f(0,0,0);
glRasterPos2f(x,y);
for(i=0;i<len;i++){
glutBitmapCharacter(GLUT_BITMAP_TIMES_ROMAN_24,str[i]);
glutStrokeCharacter(GLUT_STROKE_ROMAN,str[i]);
}
Los caracteres se muestran en el color que haya sido especificado antes de ejecutar la función
glutBitmapCharacter .
Un carácter de contorno se muestra mediante la siguiente llamada a función:
glutStrokeCharacter (font , character) ;
Para esta función, podemos asignar al parámetro font el valor GLUT_STROKE_ROMAN, que muestra una fuente con espaciado proporcional, o el valor GLUT_STROKE_MONO_ROMAN, que muestra una fuente con espaciado constante. Podemos controlar el tamaño y la posición de estos caracteres especificando una serie de operaciones de transformación, (escalar,rotar y trasladar).
Programa que hace rotar 2 textos , uno sobre su propio eje y el otro alrededor
Utilizando el botón izquierdo el texto gira a la izquierda
Utilizando el botón derecho el texto gira a la derecha
Texto Normal |
Tecla Izq. del mouse |
Tecla Der. del teclado |
/**
Programa que hace rotar 2 textos , uno sobre su propio eje y el otro alrededor
Utilizando el botón izquierdo el texto gira a la izquierda
Utilizando el botón derecho el texto gira a la derecha
Garnica Ayala Hector Daniel
*/
#include <windows.h>
#include <gl/glut.h>
#include <string.h>
#define WIDTH 600
#define HEIGHT 600
#define TEXTO "Hector Daniel"
float rotar=0;
int x=300, y=300;
/********************************/
void drawText(char *str)//
{
int i;
int len=strlen(str);
glColor3f(0,0,0);
glRasterPos2f(x,y);//va rasterizar el bojeto desde la posicion mencionada
for(i=0;i<len;i++){
glutBitmapCharacter(GLUT_BITMAP_TIMES_ROMAN_24,str[i]);//transformar el carecter de la cadena a un mapa de bits(viwport) caracter por caracter
glutStrokeCharacter(GLUT_STROKE_ROMAN,str[i]);// nos permite girar el texto deseado
}
}
/***********************************/
void display()
{
glClear( GL_COLOR_BUFFER_BIT);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();//carga la matriz identidad
glScalef(0.001, 0.001, 0.001);
glRotatef(rotar, 0, 0, 1.0);
drawText(TEXTO);
glutSwapBuffers();
glFlush();
}
/***************************************/
void mouse(int boton, int estado, int x, int y)//no hay coordenadas coordenadasflotantes
{
if (boton==GLUT_LEFT_BUTTON && estado == GLUT_DOWN) //
{
rotar += 20.0;
}
if (boton==GLUT_MIDDLE_BUTTON && estado == GLUT_DOWN) //
{
rotar = 0.0;
}
if (boton==GLUT_RIGHT_BUTTON && estado == GLUT_DOWN) //
{
rotar -= 20.0;
}
glutPostRedisplay();
}
/******************************************/
void init()
{
glClearColor( 1.0, 1.0, 1.0, 1.0);
glColor3f(0.0,0.0,0.0);
}
/*******************************************/
void ajustarViewPort(int ancho,int alto)
{
float aspect_ratio;
aspect_ratio=1;
if(1>(ancho/alto))
{
glViewport(0,0,ancho,ancho/aspect_ratio);
}
else{
glViewport(0,0,alto*aspect_ratio,alto);
}
}
/*****************************************/
int main( int argc, char ** argv)
{
glutInit( &argc, argv);
glutInitDisplayMode( GLUT_DOUBLE| GLUT_RGB);
glutInitWindowPosition( 100, 100);
glutInitWindowSize(WIDTH,HEIGHT);
glutCreateWindow( "Rotacion de Texto");
glutReshapeFunc(ajustarViewPort);
init();
glutDisplayFunc(display);
glutMouseFunc(mouse);
glutMainLoop();
return 0;
}
Descargar Archivo.txt
Texto.txt
Programa que hace rotar 2 textos , uno sobre su propio eje y el otro alrededor
Utilizando el botón izquierdo el texto gira a la izquierda
Utilizando el botón derecho el texto gira a la derecha
Garnica Ayala Hector Daniel
*/
#include <windows.h>
#include <gl/glut.h>
#include <string.h>
#define WIDTH 600
#define HEIGHT 600
#define TEXTO "Hector Daniel"
float rotar=0;
int x=300, y=300;
/********************************/
void drawText(char *str)//
{
int i;
int len=strlen(str);
glColor3f(0,0,0);
glRasterPos2f(x,y);//va rasterizar el bojeto desde la posicion mencionada
for(i=0;i<len;i++){
glutBitmapCharacter(GLUT_BITMAP_TIMES_ROMAN_24,str[i]);//transformar el carecter de la cadena a un mapa de bits(viwport) caracter por caracter
glutStrokeCharacter(GLUT_STROKE_ROMAN,str[i]);// nos permite girar el texto deseado
}
}
/***********************************/
void display()
{
glClear( GL_COLOR_BUFFER_BIT);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();//carga la matriz identidad
glScalef(0.001, 0.001, 0.001);
glRotatef(rotar, 0, 0, 1.0);
drawText(TEXTO);
glutSwapBuffers();
glFlush();
}
/***************************************/
void mouse(int boton, int estado, int x, int y)//no hay coordenadas coordenadasflotantes
{
if (boton==GLUT_LEFT_BUTTON && estado == GLUT_DOWN) //
{
rotar += 20.0;
}
if (boton==GLUT_MIDDLE_BUTTON && estado == GLUT_DOWN) //
{
rotar = 0.0;
}
if (boton==GLUT_RIGHT_BUTTON && estado == GLUT_DOWN) //
{
rotar -= 20.0;
}
glutPostRedisplay();
}
/******************************************/
void init()
{
glClearColor( 1.0, 1.0, 1.0, 1.0);
glColor3f(0.0,0.0,0.0);
}
/*******************************************/
void ajustarViewPort(int ancho,int alto)
{
float aspect_ratio;
aspect_ratio=1;
if(1>(ancho/alto))
{
glViewport(0,0,ancho,ancho/aspect_ratio);
}
else{
glViewport(0,0,alto*aspect_ratio,alto);
}
}
/*****************************************/
int main( int argc, char ** argv)
{
glutInit( &argc, argv);
glutInitDisplayMode( GLUT_DOUBLE| GLUT_RGB);
glutInitWindowPosition( 100, 100);
glutInitWindowSize(WIDTH,HEIGHT);
glutCreateWindow( "Rotacion de Texto");
glutReshapeFunc(ajustarViewPort);
init();
glutDisplayFunc(display);
glutMouseFunc(mouse);
glutMainLoop();
return 0;
}
Descargar Archivo.txt
Texto.txt
No hay comentarios:
Publicar un comentario