Студопедия Главная Случайная страница Обратная связь

Разделы: Автомобили Астрономия Биология География Дом и сад Другие языки Другое Информатика История Культура Литература Логика Математика Медицина Металлургия Механика Образование Охрана труда Педагогика Политика Право Психология Религия Риторика Социология Спорт Строительство Технология Туризм Физика Философия Финансы Химия Черчение Экология Экономика Электроника

Демонстрационные программы





Пример 1: Простое GLUT-приложение

Этот простой пример предназначен для демонстрации структуры GLUT-приложения и простейших основ OpenGL. Результатом работы программы является случайный набор цветных прямоугольников, который меняется при нажатии левой кнопки мыши. С помощью правой кнопки мыши можно менять режим заливки прямоугольников.

Пример №1

#include <stdlib.h>#include <gl/glut.h> #ifdef random#undef random#endif #define random(m) (float)rand()*m/RAND_MAX /* ширина и высота окна */GLint Width = 512, Height = 512;/* число прямоугольников в окне */int Times = 100;/* с заполнением?*/int FillFlag = 1; long Seed = 0; /* функция отображает прямоугольник */void DrawRect(float x1, float y1, float x2, float y2, int FillFlag){ glBegin(FillFlag? GL_QUADS: GL_LINE_LOOP); glVertex2f(x1, y1); glVertex2f(x2, y1); glVertex2f(x2, y2); glVertex2f(x1, y2); glEnd();} /* управляет всем выводом на экран */void Display(void){ int i; float x1, y1, x2, y2; float r, g, b; srand(Seed); glClearColor(0, 0, 0, 1); glClear(GL_COLOR_BUFFER_BIT); for(i = 0; i < Times; i++) { r = random(1); g = random(1); b = random(1); glColor3f(r, g, b); x1 = random(1) * Width; y1 = random(1) * Height; x2 = random(1) * Width; y2 = random(1) * Height; DrawRect(x1, y1, x2, y2, FillFlag); } glFinish();} /* Вызывается при изменении размеров окна */voidReshape(GLint w, GLint h){ Width = w; Height = h; glViewport(0, 0, w, h); glMatrixMode(GL_PROJECTION); glLoadIdentity(); glOrtho(0, w, 0, h, -1.0, 1.0); glMatrixMode(GL_MODELVIEW); glLoadIdentity();} /* Обрабатывает сообщения от мыши */void Mouse(int button, int state, int x, int y){ if(state == GLUT_DOWN) { switch(button) { case GLUT_LEFT_BUTTON: Seed = random(RAND_MAX); break; case GLUT_RIGHT_BUTTON: FillFlag =!FillFlag; break; } glutPostRedisplay(); }} /* Обрабатывает сообщения от клавиатуры */voidKeyboard(unsigned char key, int x, int y){#define ESCAPE '\033' if(key == ESCAPE) exit(0);} int main(int argc, char *argv[]){ glutInit(&argc, argv); glutInitDisplayMode(GLUT_RGB); glutInitWindowSize(Width, Height); glutCreateWindow("Rect draw example (RGB)"); glutDisplayFunc(Display); glutReshapeFunc(Reshape); glutKeyboardFunc(Keyboard); glutMouseFunc(Mouse); glutMainLoop();}

Пример 2 координатная плоскость, треугольник, обработка клавиш(Автор Солодовников Павел пми2009)

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <limits.h>

#include <GL/glut.h>

const double EPSILON = 0.00005; // константа для точности(...)

 

GLint Width = 600, Height = 600;

GLint cW,cH;

 

GLfloat RESIZE_FACTOR_X = 60, RESIZE_FACTOR_Y = 60;

GLfloat Multiplication_Marks = 1;

GLfloat Mult;

 

// структура, описывающая точку

struct Point

{

float x,y;

}point1,point2,point3; // точки треугольника

 

 

// приготовления к рисовке

void init()

{

glDisable(GL_DEPTH_TEST);

glShadeModel(GL_SMOOTH);

 

glClearColor(255, 255, 255, 1);

glClear(GL_COLOR_BUFFER_BIT);

}

 

// функция отрисовки координатной плоскости

GLvoid GetDisplay(GLvoid)

{

// координаты центра окна

cW = Width / 2;

cH = Height / 2;

 

init();

// выполняем начальную инициализацию

glEnable(GL_LINE_SMOOTH);

glEnable(GL_POLYGON_SMOOTH);

glEnable(GL_POINT_SMOOTH);

glHint(GL_LINE_SMOOTH_HINT, GL_NICEST);

 

glLineWidth(1.5);

//рамка внутренняя

glColor3f(0.5,0.5,0.5);

glBegin(GL_LINE_LOOP);

glVertex2i(Width-20,Height-20);

glVertex2i(Width-20,20);

glVertex2i(20,20);

glVertex2i(20,Height-20);

glEnd();

 

//рамка внешняя

glColor3f(0.3,0.3,0.3);

glBegin(GL_LINE_LOOP);

glVertex2i(Width-3,Height-3);

glVertex2i(Width-3,3);

glVertex2i(3,3);

glVertex2i(3,Height-3);

glEnd();

 

//рисование осей координат

glLineWidth(1);

 

glBegin(GL_LINES);

glColor3f(0.4,0.4,0.4);

glVertex2i(20,cH);

glVertex2i(Width-20,cH);

 

glVertex2i(cW,20);

glVertex2i(cW,Height-20);

glEnd();

// стрелки

glBegin(GL_TRIANGLES);

glColor3f(0.4,0.4,0.4);

glVertex2i(Width-20,cH);

glVertex2i(Width-35,cH-5);

glVertex2i(Width-35,cH+5);

 

glVertex2i(cW,Height-20);

glVertex2i(cW-5,Height-35);

glVertex2i(cW+5,Height-35);

glEnd();

 

 

//насечки по вертикали и горизонтали

glLineWidth(2);

glBegin(GL_LINES);

int sw = Width/15;

for(int i = 0;i < Width/2;i+=sw)

{

glVertex2i(Width/2+i,0);

glVertex2i(Width/2+i,5);

glVertex2i(Width/2-i,0);

glVertex2i(Width/2-i,5);

glVertex2i(Width/2+i,Height);

glVertex2i(Width/2+i,Height-5);

glVertex2i(Width/2-i,Height);

glVertex2i(Width/2-i,Height-5);

}

sw = Height/15;

for(int i = 0;i < Height/2;i+=sw)

{

glVertex2i(Width,Height/2+i);

glVertex2i(Width-5,Height/2+i);

glVertex2i(Width,Height/2-i);

glVertex2i(Width-5,Height/2-i);

glVertex2i(0,Height/2+i);

glVertex2i(5,Height/2+i);

glVertex2i(0,Height/2-i);

glVertex2i(5,Height/2-i);

}

glEnd();

 

// сетка

 

glLineWidth(1);

glColor3f(0.85,0.85,0.85);

glEnable(GL_LINE_STIPPLE);

glLineStipple(1,255);

glBegin(GL_LINES);

sw = Width/15;

for(int i = sw;i < Width/2-20;i+=sw)

{

glVertex2i(Width/2+i,20);

glVertex2i(Width/2+i,Height-20);

glVertex2i(Width/2-i,20);

glVertex2i(Width/2-i,Height-20);

}

sw = Height/15;

for(int i = sw;i < Height/2-20;i+=sw)

{

glVertex2i(20,Height/2+i);

glVertex2i(Width-20,Height/2+i);

glVertex2i(20,Height/2-i);

glVertex2i(Width-20,Height/2-i);

}

glEnd();

glDisable(GL_LINE_STIPPLE);

 

// текст масштаба у насечек

glColor3f(1.0,0.0,0.0);

Mult = 0;

sw = Width / 15;

char * tempc = (char*)malloc(10*sizeof(char));

int lent;

float k = Multiplication_Marks;

for(int i = 0;i < Width/2-10;i+=sw)

{

glRasterPos2i(cW + i,5);

_gcvt((double)Mult,5,tempc);// преобразовывает значение с //плавающей точкой в символьную строку и запоминает эту строку в буфере

Mult+=k;

lent = strlen(tempc);

for(int j = 0;j<lent;j++)

glutBitmapCharacter(GLUT_BITMAP_9_BY_15,tempc[j]);

 

glRasterPos2i(cW-i-sw,5);

_gcvt((double)-Mult,5,tempc);

lent = strlen(tempc);

for(int j = 0;j<lent;j++)

glutBitmapCharacter(GLUT_BITMAP_9_BY_15,tempc[j]);

}

Mult = 0;

sw = Height / 15;

k = Multiplication_Marks;

for(int i = 0;i < Height/2-10;i+=sw)

{

glRasterPos2i(Width-30,cH+i);

_gcvt((double)Mult,5,tempc);

lent = strlen(tempc);

Mult+=k;

for(int j = 0;j<lent;j++)

glutBitmapCharacter(GLUT_BITMAP_9_BY_15,tempc[j]);

 

glRasterPos2i(Width-40,cH-i-sw);

_gcvt((double)-Mult,5,tempc);

lent = strlen(tempc);

for(int j = 0;j<lent;j++)

glutBitmapCharacter(GLUT_BITMAP_9_BY_15,tempc[j]);

}

// точки

glPointSize(5);

glBegin(GL_POINTS);

glVertex2i(cW + point1.x*RESIZE_FACTOR_X,cH + point1.y*RESIZE_FACTOR_Y);

glVertex2i(cW + point2.x*RESIZE_FACTOR_X,cH + point2.y*RESIZE_FACTOR_Y);

glVertex2i(cW + point3.x*RESIZE_FACTOR_X,cH + point3.y*RESIZE_FACTOR_Y);

glEnd();

 

//треугольник

glEnable(GL_BLEND);

glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);

glColor4f(0.0,0.0,1.0,0.4);

glBegin(GL_TRIANGLES);

glVertex2i(cW + point1.x*RESIZE_FACTOR_X,cH + point1.y*RESIZE_FACTOR_Y);

glVertex2i(cW + point2.x*RESIZE_FACTOR_X,cH + point2.y*RESIZE_FACTOR_Y);

glVertex2i(cW + point3.x*RESIZE_FACTOR_X,cH + point3.y*RESIZE_FACTOR_Y);

glEnd();

glDisable(GL_BLEND);

 

 

glFlush();

glFinish();

}

 

// перерисовка окна в связи с изменением его размеров

GLvoid GetReshape(GLint gW, GLint gH)

{

Width = gW;

Height = gH;

cW = Width/2;

cH = Height/2;

RESIZE_FACTOR_X = gW / 15 / Multiplication_Marks;

RESIZE_FACTOR_Y = gH / 15 / Multiplication_Marks;

 

glViewport(0,0,gW,gH);

 

glMatrixMode(GL_PROJECTION);

glLoadIdentity();

glOrtho(0,gW,0,gH,-1.0,1.0);

 

glMatrixMode(GL_MODELVIEW);

glLoadIdentity();

}

 

// обработка нажатий клавиш с клавиатуры

GLvoid GetKey(unsigned char key,int _x, int _y)

{

switch(key)

{

case 'q':

case 'Q': exit(0); break;

case 't':

case 'T':

Multiplication_Marks *= 2;

RESIZE_FACTOR_X /= 2;

RESIZE_FACTOR_Y /= 2;

glutPostRedisplay();

break;

case 'r':

case 'R':

Multiplication_Marks /= 2;

if(Multiplication_Marks == 0) Multiplication_Marks = 0.5;

RESIZE_FACTOR_X *= 2;

RESIZE_FACTOR_Y *= 2;

glutPostRedisplay();

break;

default:

break;

}

}

int main(int argc, char* argv[])

{

 

unsigned int diff = INT_MAX;

 

point1.x=-1,point1.y=-1;

point2.x=3,point2.y=3;

point3.x=2,point3.y=0;

 

glutInit(&argc,argv);

 

glutInitDisplayMode(GLUT_RGB|GLUT_SINGLE);

glutInitWindowSize(Width, Height);

glutCreateWindow("Triangle");

 

glutDisplayFunc(GetDisplay);

glutKeyboardFunc(GetKey);

glutReshapeFunc(GetReshape);

 

glutMainLoop();

 

return 0;

}







Дата добавления: 2015-10-19; просмотров: 441. Нарушение авторских прав; Мы поможем в написании вашей работы!




Аальтернативная стоимость. Кривая производственных возможностей В экономике Буридании есть 100 ед. труда с производительностью 4 м ткани или 2 кг мяса...


Вычисление основной дактилоскопической формулы Вычислением основной дактоформулы обычно занимается следователь. Для этого все десять пальцев разбиваются на пять пар...


Расчетные и графические задания Равновесный объем - это объем, определяемый равенством спроса и предложения...


Кардиналистский и ординалистский подходы Кардиналистский (количественный подход) к анализу полезности основан на представлении о возможности измерения различных благ в условных единицах полезности...

Различия в философии античности, средневековья и Возрождения ♦Венцом античной философии было: Единое Благо, Мировой Ум, Мировая Душа, Космос...

Характерные черты немецкой классической философии 1. Особое понимание роли философии в истории человечества, в развитии мировой культуры. Классические немецкие философы полагали, что философия призвана быть критической совестью культуры, «душой» культуры. 2. Исследовались не только человеческая...

Обзор компонентов Multisim Компоненты – это основа любой схемы, это все элементы, из которых она состоит...

Методы анализа финансово-хозяйственной деятельности предприятия   Содержанием анализа финансово-хозяйственной деятельности предприятия является глубокое и всестороннее изучение экономической информации о функционировании анализируемого субъекта хозяйствования с целью принятия оптимальных управленческих...

Образование соседних чисел Фрагмент: Программная задача: показать образование числа 4 и числа 3 друг из друга...

Шрифт зодчего Шрифт зодчего состоит из прописных (заглавных), строчных букв и цифр...

Studopedia.info - Студопедия - 2014-2025 год . (0.013 сек.) русская версия | украинская версия