Скачиваний:
21
Добавлен:
01.05.2014
Размер:
12.91 Кб
Скачать
#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