// 范例P195.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include "string.h"
#include <gl/glut.h>
#define PT 1 //一点
#define STROKE 2 //一画
#define END 3 //结束
// 字体结构体
typedef struct charpoint{
GLfloat x,y;
int type;
}CP;
//具体字体描述笔画
CP Adata[]={
{0,0,PT},{0,9,PT},{1,10,PT},{4,10,PT},{5,9,PT},
{5,0,STROKE},{0,5,PT},{5,5,END}
};
CP Cdata[]={
{5,0,PT},{1,0,PT},{0,1,PT},{0,9,PT},{1,10,PT},{5,10,END}
};
CP Ddata[]={
{0,0,PT},{0,10,PT},{3,10,PT},{4,8,PT},{4,2,PT},{3,0,PT},{0,0,END}
};
CP Edata[]={
{5,0,PT},{0,0,PT},{0,10,PT},{5,10,STROKE},
{0,5,PT},{4,5,END}
};
CP Pdata[]={
{0,0,PT},{0,10,PT},{4,10,PT},{5,9,PT},{5,6,PT},
{4,5,PT},{0,5,END}
};
CP Rdata[]={
{0,0,PT},{0,10,PT},{4,10,PT},{5,9,PT},{5,6,PT},
{4,5,PT},{0,5,STROKE},{3,5,PT},{5,0,END}
};
CP Sdata[]={
{0,1,PT},{1,0,PT},{4,0,PT},{5,1,PT},{5,4,PT},
{4,5,PT},{1,5,PT},{0,6,PT},{0,9,PT},{1,10,PT},
{4,10,PT},{5,9,END}
};
static void drawletter(CP *l)
{
glBegin(GL_LINE_STRIP);
while(l){
switch(l->type){
case PT:
glVertex2f(l->x,l->y);
break;
case STROKE:
//结束一画,开始新的一画
glVertex2f(l->x,l->y);
glEnd();
glBegin(GL_LINE_STRIP);
break;
case END:
//结束一个字母,开始绘制另一个中间有间隔的字母
glVertex2f(l->x,l->y);
glEnd();
glTranslatef(8.0,0.0,0.0);
return;
}
l++;
}
}
static void init ()
{
GLuint base;
glShadeModel(GL_FLAT);
base=glGenLists(128);
glListBase(base);
glNewList(base+'A',GL_COMPILE);drawletter(Adata);glEndList();
glNewList(base+'C',GL_COMPILE);drawletter(Cdata);glEndList();
glNewList(base+'D',GL_COMPILE);drawletter(Ddata);glEndList();
glNewList(base+'E',GL_COMPILE);drawletter(Edata);glEndList();
glNewList(base+'P',GL_COMPILE);drawletter(Pdata);glEndList();
glNewList(base+'R',GL_COMPILE);drawletter(Rdata);glEndList();
glNewList(base+'S',GL_COMPILE);drawletter(Sdata);glEndList();
glNewList(base+' ',GL_COMPILE);glTranslatef(8,0,0);glEndList();
}
char *test1="A CPARE DERAPE APPEASS AS";
char *test2="APES PREPARE RARE PEPPERS";
static void printStrokedString(char *s)
{
GLsizei len=strlen(s);
glCallLists(len,GL_BYTE,(GLbyte*)s);
}
void display()
{
glClear(GL_COLOR_BUFFER_BIT); //清除所有像素
glColor3f(1.0,1.0,1.0); //设置画笔白色
/*在缓存中绘制4对顶点坐标的矩形*/
glPushMatrix();
glScalef(2.0,2.0,2.0);
glTranslatef(10,30,0);
printStrokedString(test1);
glPopMatrix();
glPushMatrix();
//glScalef(2.0,2.0,2.0);
glTranslatef(10,13,0);
printStrokedString(test2);
glPopMatrix();
glFlush(); //立即显示出来
}
void reshape(int w,int h)
{
glViewport(0,0,(GLsizei)w,(GLsizei)h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(0,w,0,h);
}
int main(int argc,char ** argv)
{
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);
glutInitWindowSize(440,120); //初始化窗口大小
glutInitWindowPosition(0,0); //初始化窗口位置
glutCreateWindow("hello"); //创建标题为“hello”的窗口
init(); //调用初始化函数
glutDisplayFunc(display); //注册回调函数
glutReshapeFunc(reshape);
glutMainLoop(); //进入主循环处理事件
return 0;
}
评论