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

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

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






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



Композиция из абстрактных геометрических фигур Данная композиция состоит из линий, штриховки, абстрактных геометрических форм...

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

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

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

Законы Генри, Дальтона, Сеченова. Применение этих законов при лечении кессонной болезни, лечении в барокамере и исследовании электролитного состава крови Закон Генри: Количество газа, растворенного при данной температуре в определенном объеме жидкости, при равновесии прямо пропорциональны давлению газа...

Ганглиоблокаторы. Классификация. Механизм действия. Фармакодинамика. Применение.Побочные эфффекты Никотинчувствительные холинорецепторы (н-холинорецепторы) в основном локализованы на постсинаптических мембранах в синапсах скелетной мускулатуры...

Шов первичный, первично отсроченный, вторичный (показания) В зависимости от времени и условий наложения выделяют швы: 1) первичные...

Этические проблемы проведения экспериментов на человеке и животных В настоящее время четко определены новые подходы и требования к биомедицинским исследованиям...

Классификация потерь населения в очагах поражения в военное время Ядерное, химическое и бактериологическое (биологическое) оружие является оружием массового поражения...

Факторы, влияющие на степень электролитической диссоциации Степень диссоциации зависит от природы электролита и растворителя, концентрации раствора, температуры, присутствия одноименного иона и других факторов...

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