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

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

Внимание! внимание! внимание!






Пример 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; просмотров: 367. Нарушение авторских прав; Мы поможем в написании вашей работы!



Важнейшие способы обработки и анализа рядов динамики Не во всех случаях эмпирические данные рядов динамики позволяют определить тенденцию изменения явления во времени...

ТЕОРЕТИЧЕСКАЯ МЕХАНИКА Статика является частью теоретической механики, изучающей условия, при ко­торых тело находится под действием заданной системы сил...

Теория усилителей. Схема Основная масса современных аналоговых и аналого-цифровых электронных устройств выполняется на специализированных микросхемах...

Логические цифровые микросхемы Более сложные элементы цифровой схемотехники (триггеры, мультиплексоры, декодеры и т.д.) не имеют...

КОНСТРУКЦИЯ КОЛЕСНОЙ ПАРЫ ВАГОНА Тип колёсной пары определяется типом оси и диаметром колес. Согласно ГОСТ 4835-2006* устанавливаются типы колесных пар для грузовых вагонов с осями РУ1Ш и РВ2Ш и колесами диаметром по кругу катания 957 мм. Номинальный диаметр колеса – 950 мм...

Философские школы эпохи эллинизма (неоплатонизм, эпикуреизм, стоицизм, скептицизм). Эпоха эллинизма со времени походов Александра Македонского, в результате которых была образована гигантская империя от Индии на востоке до Греции и Македонии на западе...

Демографияда "Демографиялық жарылыс" дегеніміз не? Демография (грекше демос — халық) — халықтың құрылымын...

Пункты решения командира взвода на организацию боя. уяснение полученной задачи; оценка обстановки; принятие решения; проведение рекогносцировки; отдача боевого приказа; организация взаимодействия...

Что такое пропорции? Это соотношение частей целого между собой. Что может являться частями в образе или в луке...

Растягивание костей и хрящей. Данные способы применимы в случае закрытых зон роста. Врачи-хирурги выяснили...

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