#include #include #include "glut.h" #include using namespace std; int color = 1; // переменная, отвечающая за изменение цвета. По умолчанию она равна 1. string str = ""; //int temp = 100; GLubyte space[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };// символ пробела GLubyte letters[][13] = { { 0x00, 0x00, 0xc3, 0xc3, 0xc3, 0xc3, 0xff, 0xc3, 0xc3, 0xc3, 0x66, 0x3c, 0x18 }, { 0x00, 0x00, 0xfe, 0xc7, 0xc3, 0xc3, 0xc7, 0xfe, 0xc7, 0xc3, 0xc3, 0xc7, 0xfe }, { 0x00, 0x00, 0x7e, 0xe7, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xe7, 0x7e }, { 0x00, 0x00, 0xfc, 0xce, 0xc7, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc7, 0xce, 0xfc }, { 0x00, 0x00, 0xff, 0xc0, 0xc0, 0xc0, 0xc0, 0xfc, 0xc0, 0xc0, 0xc0, 0xc0, 0xff }, { 0x00, 0x00, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xfc, 0xc0, 0xc0, 0xc0, 0xff }, { 0x00, 0x00, 0x7e, 0xe7, 0xc3, 0xc3, 0xcf, 0xc0, 0xc0, 0xc0, 0xc0, 0xe7, 0x7e }, { 0x00, 0x00, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xff, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3 }, { 0x00, 0x00, 0x7e, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x7e }, { 0x00, 0x00, 0x7c, 0xee, 0xc6, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06 }, { 0x00, 0x00, 0xc3, 0xc6, 0xcc, 0xd8, 0xf0, 0xe0, 0xf0, 0xd8, 0xcc, 0xc6, 0xc3 }, { 0x00, 0x00, 0xff, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0 }, { 0x00, 0x00, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xdb, 0xff, 0xff, 0xe7, 0xc3 }, { 0x00, 0x00, 0xc7, 0xc7, 0xcf, 0xcf, 0xdf, 0xdb, 0xfb, 0xf3, 0xf3, 0xe3, 0xe3 }, { 0x00, 0x00, 0x7e, 0xe7, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xe7, 0x7e }, { 0x00, 0x00, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xfe, 0xc7, 0xc3, 0xc3, 0xc7, 0xfe }, { 0x00, 0x00, 0x3f, 0x6e, 0xdf, 0xdb, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0x66, 0x3c }, { 0x00, 0x00, 0xc3, 0xc6, 0xcc, 0xd8, 0xf0, 0xfe, 0xc7, 0xc3, 0xc3, 0xc7, 0xfe }, { 0x00, 0x00, 0x7e, 0xe7, 0x03, 0x03, 0x07, 0x7e, 0xe0, 0xc0, 0xc0, 0xe7, 0x7e }, { 0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xff }, { 0x00, 0x00, 0x7e, 0xe7, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3 }, { 0x00, 0x00, 0x18, 0x3c, 0x3c, 0x66, 0x66, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3 }, { 0x00, 0x00, 0xc3, 0xe7, 0xff, 0xff, 0xdb, 0xdb, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3 }, { 0x00, 0x00, 0xc3, 0x66, 0x66, 0x3c, 0x3c, 0x18, 0x3c, 0x3c, 0x66, 0x66, 0xc3 }, { 0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3c, 0x3c, 0x66, 0x66, 0xc3 }, { 0x00, 0x00, 0xff, 0xc0, 0xc0, 0x60, 0x30, 0x7e, 0x0c, 0x06, 0x03, 0x03, 0xff } }; // символы английской расскладки(только буквы) GLuint fontOffset; void makeRasterFont(void) // получение изображения символов { GLuint i, j; glPixelStorei(GL_UNPACK_ALIGNMENT, 1); // выравнивание fontOffset = glGenLists(128); for (i = 0, j = 'A'; i < 26; i++, j++) { glNewList(fontOffset + j, GL_COMPILE); glBitmap(8, 13, 0.0, 2.0, 10.0, 0.0, letters[i]); // отображают отдельный битовый массив на экране glEndList(); } glNewList(fontOffset + ' ', GL_COMPILE); glBitmap(8, 13, 0.0, 2.0, 10.0, 0.0, space); glEndList(); } void init1(void) // функция, инициализирующая нашу модель { glShadeModel(GL_FLAT); makeRasterFont(); } void printString(char *s) // функция, выводящая на экран нарисованную строку { glPushAttrib(GL_LIST_BIT); glListBase(fontOffset); // используется для задания смещения glCallLists(strlen(s), GL_UNSIGNED_BYTE, (GLubyte *)s); // glPopAttrib(); } void display1(void) // дисплей шрифтов { GLfloat white[3] = { 1.0, 1.0, 1.0 }; GLfloat black[3] = { 0.0, 0.0, 0.0 }; GLfloat red[3] = { 1.0, 0.0, 0.0 }; GLfloat green[3] = { 0.0, 1.0, 0.0 }; GLfloat blue[3] = { 0.0, 0.0, 1.0 }; glClear(GL_COLOR_BUFFER_BIT); // очистка буфера цвета if (color == 1) glColor3fv(white); else if(color == 2) glColor3fv(black); else if (color == 3) glColor3fv(red); else if (color == 4) glColor3fv(green); else if (color == 5) glColor3fv(blue); glRasterPos2i(20, 60); // отступ снизу и слева, позиция растра printString(&str[0]); glFlush(); } /* Действие при изменении размеров окна */ void reshape1(int w, int h) { glViewport(0, 0, (GLsizei)w, (GLsizei)h); glMatrixMode(GL_PROJECTION); glLoadIdentity(); glOrtho(0.0, w, 0.0, h, -1.0, 1.0); glMatrixMode(GL_MODELVIEW); } void keyboard1(unsigned char key, int x, int y) // функция для работы с клавиатурой { switch (key) { case 'a': str += 'A'; display1(); break; case 'b': str += 'B'; display1(); break; case 'c': str += 'C'; display1(); break; case 'd': str += 'D'; display1(); break; case 'e': str += 'E'; display1(); break; case 'f': str += 'F'; display1(); break; case 'g': str += 'G'; display1(); break; case 'h': str += 'H'; display1(); break; case 'i': str += 'I'; display1(); break; case 'j': str += 'J'; display1(); break; case 'k': str += 'K'; display1(); break; case 'l': str += 'L'; display1(); break; case 'm': str += 'M'; display1(); break; case 'n': str += 'N'; display1(); break; case 'o': str += 'O'; display1(); break; case 'p': str += 'P'; display1(); break; case 'q': str += 'Q'; display1(); break; case 'r': str += 'R'; display1(); break; case 's': str += 'S'; display1(); break; case 't': str += 'T'; display1(); break; case 'u': str += 'U'; display1(); break; case 'v': str += 'V'; display1(); break; case 'w': str += 'W'; display1(); break; case 'x': str += 'X'; display1(); break; case 'y': str += 'Y'; display1(); break; case 'z': str += 'Z'; display1(); break; case ' ': str += ' '; display1(); break; case 8: if (!str.empty()) str.pop_back(); display1(); break; case '1': color = 1; display1(); break; case '2': color = 2; display1(); break; case '3': color = 3; display1(); break; case '4': color = 4; display1(); break; case '5': color = 5; display1(); break; } } #define checkImageWidth 64 #define checkImageHeight 64 GLubyte checkImage[checkImageHeight][checkImageWidth][3]; static GLdouble zoomFactor = 1.0; static GLint height; /* Происходит генерация изображения, которое помещается в битовый массив */ void makeCheckImage(void) { int i, j, c; for (i = 0; i < checkImageHeight; i++) { for (j = 0; j < checkImageWidth; j++) { c = ((((i & 0x8) == 0) ^ ((j & 0x8)) == 0)) * 255; checkImage[i][j][0] = (GLubyte)c; checkImage[i][j][1] = (GLubyte)c; checkImage[i][j][2] = (GLubyte)c; } } } void init2(void) { glClearColor(0.0, 0.0, 0.0, 0.0); glShadeModel(GL_FLAT); makeCheckImage(); glPixelStorei(GL_UNPACK_ALIGNMENT, 1); // задает метод хранения данных битового образа в памяти компьютера } void display2(void) { glClear(GL_COLOR_BUFFER_BIT); glRasterPos2i(0, 0); glDrawPixels(checkImageWidth, checkImageHeight, GL_RGB, GL_UNSIGNED_BYTE, checkImage); //записывает прямоугольный массив пикселей из данных, хранимых в памяти процессора glFlush(); //GL_RGB красный компонент цвета. сопровождающийся зеленым и синим компонентом цвета } void reshape2(int w, int h) { glViewport(0, 0, (GLsizei)w, (GLsizei)h); height = (GLint)h; glMatrixMode(GL_PROJECTION); // glLoadIdentity(); gluOrtho2D(0.0, (GLdouble)w, 0.0, (GLdouble)h); glMatrixMode(GL_MODELVIEW); // glLoadIdentity(); } /* Действие, которое происходит при взаимодействии с мышкой */ void motion(int x, int y) { static GLint screeny; screeny = height - (GLint)y; glRasterPos2i(x, screeny); glPixelZoom(zoomFactor, zoomFactor); glCopyPixels(0, 0, checkImageWidth, checkImageHeight, GL_COLOR); //копирует пиксели в буфер кадра glPixelZoom(1.0, 1.0); //устанавливаем размер пикселя glFlush(); // прорисовка экрана } void keyboard2(unsigned char key, int x, int y) { switch (key) { case 'r': zoomFactor = 1.0; glutPostRedisplay(); printf("Коэффициент масштаба возвращен в значение 1.0\n"); break; case '+': zoomFactor += 0.5; if (zoomFactor >= 3.0) zoomFactor = 3.0; printf("Коэффициент масштаба - %4.1f\n", zoomFactor); break; case '-': zoomFactor -= 0.5; if (zoomFactor <= 0.5) zoomFactor = 0.5; printf("Коэффициент масштаба - %4.1f\n", zoomFactor); break; case 27: break; default: exit(0); break; } } int main(int argc, char** argv) { setlocale(LC_CTYPE, "Russian"); system("title Инструкция"); cout << "Приложение Шрифты" << endl; cout << "Для выбора цвета шрифта нажмите:" << endl; cout << "1- белый, 2-черный, 3 - красный, 4 - зеленый, 5 -синий" << endl; cout << "Для печати текста набирайте слова на клавиатуре." << endl << "Поддерживается только английская раскладка" << endl << endl; cout << "Приложение Вывод пикселей" << endl; cout << "Нажмите мышкой на свободную область окна для рисования изображения" << endl; cout << "Клавиши + и - служат для изменения масштаба" << endl; cout << "Клавиша r позволяет очистить окно" << endl << endl; glutInit(&argc, argv); glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); /*Создание окна приложения Шрифты*/ glutInitWindowSize(1000, 100); glutInitWindowPosition(100, 100); glutCreateWindow(argv[0]); glutSetWindowTitle("Шрифты"); init1(); glutReshapeFunc(reshape1); glutKeyboardFunc(keyboard1); glutDisplayFunc(display1); /*Создание окна приложения Вывод пикселей*/ glutInitWindowSize(250, 250); glutInitWindowPosition(100, 100); glutCreateWindow(argv[0]); glutSetWindowTitle("Вывод пикселей"); init2(); glutDisplayFunc(display2); glutReshapeFunc(reshape2); glutKeyboardFunc(keyboard2); glutMotionFunc(motion); glutMainLoop(); // запуск программы return 0; }