Добавил:
Studfiles2
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Лабораторные работы 1 2 3 5 / displ
.cpp#include <math.h>
#include <stdlib.h>
#include <iostream.h>
#include <conio.h>
#include <windows.h>
#include "displ.h"
#include "addiction.h"
float angle1 = 0;
void Init(void)
{
glClearColor(1,1,1,1);
glEnable(GL_DEPTH_TEST);
glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glColor3f(1, 0, 0);
glTranslatef(0,0,-75);
glRotatef(angle1, 1, 0, 0);
glRotatef(angle1, 0, 1, 0);
glRotatef(angle1, 0, 0, 1);
}
///////////////////////////////////////////////
void Display ()
{
glClearColor(0.7,0.7,0.7,1);
glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glEnable(GL_DEPTH_TEST);
// Установка камеры
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glTranslatef(0,0,-20);
glRotatef(angle1,1,0,0);
glRotatef(angle1/2,0,1,0);
// Рисование пирамиды (по граням)
glColor3f(1,1,0);
glBegin(GL_TRIANGLES);
glVertex3f(0, 4, 0);
glVertex3f(-2, 0.7, 2);
glVertex3f(2, 0.7, 2);
glEnd();
glColor3f(0.8,0.8,0);
glBegin(GL_TRIANGLES);
glVertex3f(0, 4, 0);
glVertex3f(-2, 0.7, -2);
glVertex3f(2, 0.7, -2);
glEnd();
glColor3f(0.5,0.5,0);
glBegin(GL_TRIANGLES);
glVertex3f(0, 4, 0);
glVertex3f(-2, 0.7, 2);
glVertex3f(-2, 0.7, -2);
glEnd();
glColor3f(0.8,0.8,0);
glBegin(GL_QUADS);
glVertex3f(-2, 0.7, -2);
glVertex3f(2, 0.7, -2);
glVertex3f(2, 0.7, 2);
glVertex3f(-2, 0.7, 2);
glEnd();
// Рисование шахматного поля
for (int j=-5;j<5;j++)
for (int i=-5;i<5;i++)
{
if ((abs(i+j)%2)==0)
glColor3f(0.5,0,0);
else
glColor3f(0.9,0.9,0.8);
glBegin(GL_QUADS);
glVertex3f(i,0,j);
glVertex3f(i+1,0,j);
glVertex3f(i+1,0,j+1);
glVertex3f(i,0,j+1);
glEnd();
}
glFlush ();
}
//////////////////////////////////////////////////////////
void Idle()
{
angle1+=0.1;
glutSwapBuffers();
glutPostRedisplay();
}
//////////////////////////////////////////////////////////
void Reshape(int w, int h)
{
glMatrixMode (GL_PROJECTION);
glLoadIdentity ();
gluPerspective(40.0, (GLfloat)w/h, 1,100);
glViewport (0, 0, w, h);
glMatrixMode (GL_MODELVIEW);
glLoadIdentity ();
}
////////////////////////////////////////////////////////////
void Keyboard(unsigned char key, int x, int y)
{
switch (key)
{
// case 'a': xt -= 10.0f; break;
// case 'd': xt += 10.0f; break;
// case 't': glDisable(GL_LIGHTING); break;
case 27: exit(0); break; // Esc
}
}
///////////////////////////////////////////////////////////
void Display1()
{
glClearColor(0.0, 0.0, 0.0, 0); //окрашивание фона
glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
glTranslatef(0,0,-20);
glColor3f(1,1,0);
glBegin(GL_TRIANGLES);
glVertex3f(0, 5, 0);
glVertex3f(-3, 0.7, 0);
glVertex3f(3, 0.7, 0);
glEnd();
glColor3f(1, 0, 1);
glBegin(GL_LINE_LOOP);
glVertex3f(-3, 0.7, 0);
glVertex3f(-1, 0, 0);
glVertex3f(-1, -3, 0);
glVertex3f(-4, -2, 0);
glEnd();
glColor3f(0, 1, 1);
glBegin(GL_LINE_STRIP);
glVertex3f(-4, -2, 0);
glVertex3f(-4, -3, 0);
glVertex3f(-5, -4, 0);
glVertex3f(5, 2, 0);
glEnd();
glColor3f(1, 0, 0);
glBegin(GL_QUADS);
glVertex3f(1, 0, 0);
glVertex3f(0, 1, 0);
glVertex3f(-1, 0, 0);
glVertex3f(0, -1, 0);
glEnd();
}
////////////////////////////////////////////
void Display2()
{
glClearColor(0.0, 0.0, 0.0, 0);
glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
glEnable(GL_BLEND); //Разрешаем смешение цветов
glEnable(GL_SCISSOR_TEST); //Разрешаем отсечение
glEnable(GL_ALPHA_TEST); //Разрешаем прозрачность
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); //Включаем смешение цветов и организовываем прозрачность
glScissor(100, 100, 300, 300); //Определяем прямоугольник вырезки
glColor4f(1, 1, 0, 1); //Цвет с учетом компоненты прозрачности
glTranslatef(0, 0, -20);
glBegin(GL_TRIANGLES);
glVertex3f(0, 0, 0);
glVertex3f(1, 7, 0);
glVertex3f(7, 1, 0);
glEnd();
glColor4f(1, 0.0, 0.0, 0.3);
glBegin(GL_TRIANGLES);
glVertex3f(1, 1, 0);
glVertex3f(2, 5, 0);
glVertex3f(5, 2, 0);
glEnd();
glAlphaFunc(GL_GREATER, 0.4f); //Не пропускаем цвета с прозрачностью больше 0.4
glColor4f(0.0, 1, 0.0, 1);
glColor4f(0.0, 1, 0.0, 1);
glBegin(GL_TRIANGLES);
glVertex3f(0, 0, 0);
glVertex3f(1, -7, 0);
glVertex3f(7, -1, 0);
glEnd();
glEnable(GL_BLEND);
glColor4f(1.0, 1, 0.0, 0.5);
glBegin(GL_TRIANGLES);
glVertex3f(1, -1, 0);
glVertex3f(2, -5, 0);
glVertex3f(5, -2, 0);
glEnd();
glColor4f(0.0, 0.0, 1, 1);
glBegin(GL_TRIANGLES);
glVertex3f(0, 0, 0);
glVertex3f(-1, -7, 0);
glVertex3f(-7, -1, 0);
glEnd();
glColor4f(0.0, 1, 0.0, 0.5);
glBegin(GL_TRIANGLES);
glVertex3f(-1, -1, 0);
glVertex3f(-2, -5, 0);
glVertex3f(-5, -2, 0);
glEnd();
glColor4f(1, 0, 0, 1);
glBegin(GL_TRIANGLES);
glVertex3f(0, 0, 0);
glVertex3f(-1, 7, 0);
glVertex3f(-7, 1, 0);
glEnd();
glColor4f(0.0, 0, 1.0, 0.1);
glBegin(GL_TRIANGLES);
glVertex3f(-1, 1, 0);
glVertex3f(-2, 5, 0);
glVertex3f(-5, 2, 0);
glEnd();
glDisable(GL_BLEND); //Выключаем режим смешения цветов
glDisable(GL_SCISSOR_TEST); //Выключаем режим отсечения
glDisable(GL_ALPHA_TEST); //Выключаем режим прозрачности
}
///////////////////////////////////////////////////
void Display5()
{
glClearColor(0.7,0.7,0.7,1);
glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glEnable(GL_DEPTH_TEST);
// Установка камеры
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glTranslatef(0,0,-20);
glRotatef(angle1,1,0,0);
glRotatef(angle1/2,0,1,0);
// Рисование пирамиды (по граням)
glColor3f(1,0,0);
glBegin(GL_TRIANGLES);
glVertex3f(0, 4, 0);
glVertex3f(-2, 0.7, 2);
glVertex3f(2, 0.7, 2);
glEnd();
glColor3f(0.8,0,0);
glBegin(GL_TRIANGLES);
glVertex3f(0, 4, 0);
glVertex3f(-2, 0.7, -2);
glVertex3f(2, 0.7, -2);
glEnd();
glColor3f(0.5,0,0);
glBegin(GL_TRIANGLES);
glVertex3f(0, 4, 0);
glVertex3f(2, 0.7, -2);
glVertex3f(2, 0.7, 2);
glEnd();
glColor3f(0.3, 0, 0);
glBegin(GL_TRIANGLES);
glVertex3f(0, 4, 0);
glVertex3f(-2, 0.7, 2);
glVertex3f(-2, 0.7, -2);
glEnd();
glColor3f(1,0,0);
glBegin(GL_QUADS);
glVertex3f(-2, 0.7, -2);
glVertex3f(2, 0.7, -2);
glVertex3f(2, 0.7, 2);
glVertex3f(-2, 0.7, 2);
glEnd();
float LP1[]={1,1,3,1};
float amb0[]={1,0,0,0}, diff0[] = {1, 0, 0, 1}, spec0[]={1.0,0.0,0.0,0.0};
float dir[]={0,4.0,0.0};
Light(LP1, amb0, diff0, spec0);
float LP2[] = {-1, -1, 3, 1};
Light(LP2, amb0, diff0, spec0);
// Рисование шахматного поля
for (int j=-5;j<5;j++)
for (int i=-5;i<5;i++)
{
if ((abs(i+j)%2)==0)
glColor3f(1,0.5,0);
else
glColor3f(0.9,0.9,0.8);
glBegin(GL_QUADS);
glVertex3f(i,0,j);
glVertex3f(i+1,0,j);
glVertex3f(i+1,0,j+1);
glVertex3f(i,0,j+1);
glEnd();
}
glClear( GL_DEPTH_BUFFER_BIT) ;
glFlush ();
}
///////////////////////////////////////////
void Light(float *point, float *amb, float *diff, float *spec)
{
float diff1[]= {1, 0, 0.0, 2.0};
float amb1[] = {1, 1, 0, 0};
float spec1[] = {0, 1, 0, 0};
float point1[] = {4, 1, 0, 1};
glLightfv(GL_LIGHT0,GL_AMBIENT,amb);
glLightfv(GL_LIGHT1,GL_AMBIENT,amb1);
glLightfv(GL_LIGHT0,GL_DIFFUSE,diff);
glLightfv(GL_LIGHT1,GL_DIFFUSE,diff1);
glLightfv(GL_LIGHT0,GL_SPECULAR,spec);
glLightfv(GL_LIGHT1,GL_SPECULAR,spec1);
glLightfv(GL_LIGHT0,GL_POSITION, point);
glLightfv(GL_LIGHT1,GL_POSITION, point1);
glMaterialfv(GL_FRONT, GL_DIFFUSE, diff1);
glLightf(GL_LIGHT0, GL_CONSTANT_ATTENUATION,0.5);
glLightf(GL_LIGHT0,GL_SPOT_CUTOFF, 60);// угол пропускания - 60
glLightf(GL_LIGHT0,GL_SPOT_EXPONENT,0.1);// значение Е
glEnable(GL_LIGHTING);//ВКЛЮЧЕНИЕ СВЕТА
glEnable(GL_LIGHT0);//ВКЛЮЧЕНИЕ КОНКРЕТНОГО ИСТОЧНИКА СВЕТА
glEnable(GL_LIGHT1);
}
//////////////////////////////////////////////
void Projector(float *dir, float ang, float *amb)
{
glLightf(GL_LIGHT0,GL_SPOT_CUTOFF,ang);// угол пропускания - 45
glLightf(GL_LIGHT0,GL_SPOT_EXPONENT,0.1);// значение Е
glLightfv(GL_LIGHT0,GL_SPOT_DIRECTION,dir);
glLightfv(GL_LIGHT0,GL_DIFFUSE,amb);
glEnable(GL_LIGHTING);//ВКЛЮЧЕНИЕ СВЕТА
glEnable(GL_LIGHT0);//ВКЛЮЧЕНИЕ КОНКРЕТНОГО ИСТОЧНИКА СВЕТА
}
////////////////////////////////////////////////
void DD1()
{
Init();
// glTranslatef(-xt, -yt, -zt);
float P[4][3] = {{0, 0, 0}, {0, 0, 10}, {0, 10, 10}, {10, 10, 10}},
P1[4][3] = {{0, 0, 0}, {0, 0, -10}, {0, -10, -10}, {-10, -10, -10}},
P2[4][3] = {{0, 0, 0}, {10, 0, 0}, {10, 10, 0}, {10, 10, 10}},
P3[4][3] = {{0, 0, 0}, {-10, 0, 0}, {-10, -10, 0}, {-10, -10, -10}},
Q1[4][3] = {{0, 0, 0}, {0, 10, 0}, {10, 0, 10}, {10, 10, 10}},
Q2[4][3] = {{0, 0, 0}, {0, -10, 0}, {-10, 0, -10}, {-10, -10, -10}},
Q3[4][3] = {{0, 0, 0}, {0, -10, 0}, {10, 0, 10}, {10, 10, 10}},
Q4[4][3] = {{0, 0, 0}, {0, 10, 0}, {-10, 0, -10}, {-10, -10, -10}};
BezieLine(3, P);
BezieLine(3, P1);
BezieLine(3, P2);
BezieLine(3, P3);
BezieLine(3, Q1);
BezieLine(3, Q2);
// BezieLine(3, Q3);
// BezieLine(3, Q4);
/* float X1[100][100] = {{0}};
float Y1[100][100] = {{0}};
float Z1[100][100] = {{0}};
float X[100][100] = {{1, 3, 1}, {-1, 0, 1}, {2, 0, -2}};
float Y[100][100] = {{2, 2, 2}, {0, 0, 0}, {-2, -2, -2}};
float Z[100][100] = {{1, 1, 1}, {0, 1, 0}, {1, 0, 1}};
int i, j;
BezieCurve(3, 3, X, X1);
BezieCurve(3, 3, Y, Y1);
BezieCurve(3, 3, Z, Z1);
for (i = 0; i < 10; i++)
{
glBegin(GL_LINE_STRIP);
for (j = 0; j < 10; j++)
glVertex3f(X1[i][j], Y1[i][j], Z1[i][j]);
glEnd();
}
for (j = 0; j < 10; j++)
{
glBegin(GL_LINE_STRIP);
for (i = 0; i < 10; i++)
glVertex3f(X1[i][j], Y1[i][j], Z1[i][j]);
glEnd();
}
glColor3f(0, 1, 1);
for (j = 0; j < 9; j++)
{
for (i = 0; i < 9; i++)
{
glBegin(GL_POLYGON);
glVertex3f(X1[i][j], Y1[i][j], Z1[i][j]);
glVertex3f(X1[i][j+1], Y1[i][j+1], Z1[i][j+1]);
glVertex3f(X1[i+1][j+1], Y1[i+1][j+1], Z1[i+1][j+1]);
glVertex3f(X1[i+1][j], Y1[i+1][j], Z1[i+1][j]);
glEnd();
}
}
float LP1[]={1,1,-3,-1};
float amb0[]={1,0,0,1}, diff0[] = {1, 0, 0, 0}, spec0[]={0.0,0.0,0.0,0.0};
// Light(LP1, amb0, diff0, spec0);
*/
glFlush();
}
////////////////////////////////////////////////////////////
void Cylinder(void)
{
GLUquadricObj *quadObj1;
quadObj1 = gluNewQuadric();
gluQuadricDrawStyle(quadObj1, GLU_FILL);
gluCylinder(quadObj1, 0.9, 0.9, 0.2, 20, 20);
glRotated(0,1, 0, 0);
}
/////////////////////////////////////////////////////////////
void Sphere(void)
{
GLUquadricObj *quadObj1;
quadObj1 = gluNewQuadric();
gluQuadricDrawStyle(quadObj1, GLU_FILL);
gluSphere(quadObj1, 0.9, 20, 20);
}
//////////////////////////////////////////////////////////////
void BezieLine(unsigned int order, float (*P)[3])
{
if (order < 2)
return;
int i, j;
float *Tb, *Te;
float t = 0, z1 = 0, z2 = 0, z3 = 0;
Tb = (float*)malloc(order*sizeof(float));
Te = (float*)malloc(order*sizeof(float));
glBegin(GL_LINE_STRIP);
while (t <= 1)
{
for (i = 0; i <= order; i++)
{
Tb[i] = power(1-t, i);
Te[i] = power(t, order-i);
}
for (j = 0; j <= order; j++)
{
z1 = z1 + comb(order, j)*Tb[j]*Te[j]*P[j][0];
z2 = z2 + comb(order, j)*Tb[j]*Te[j]*P[j][1];
z3 = z3 + comb(order, j)*Tb[j]*Te[j]*P[j][2];
}
glVertex3f(z1, z2, z3);
z1 = 0; z2 = 0; z3 = 0;
t += 0.01;
}
glEnd();
}
/////////////////////////////////////////////////////////////////////////////
void BezieCurve(unsigned int order1, unsigned int order2, float (*X)[MAXSIZE], float (*QX)[MAXSIZE])
{
if (order1 == 0 || order1 > MAXSIZE || order2 == 0 || order2 > MAXSIZE || X == NULL)
return;
int m = 0, n = 0, i = 0, j = 0;
float t = 0, u = 0;
while (t <= 1)
{
while (u <= 1)
{
QX[m][n] = getel(X, order1, order2, t, u);
n++;
u += 0.1;
}
t += 0.1;
u = 0;
n = 0;
m++;
}
}
Соседние файлы в папке Лабораторные работы 1 2 3 5