
#include <windows.h>
#include <math.h>
#include <iostream.h>
#include <fstream.h>

#include <GL/gl.h>
#include <GL/glu.h>
#include <C:\Users\user\Desktop\qt\task33\glaux.h>

#define pii	3.1415926535
#define maxpoint	10
#define maxsection	100



//AUX_RGBImageRec *image;

double	x;
double	x2;
double	a, b;
double	a2, b2;
double	mast[maxpoint][2];
int		mass[maxsection];

double	d;	//	Диаметр многоугольника
double	ms;	//	Масштаб спирали
int		n;	//	Количество вершин 
int		l;	//	Количество сечений

void CALLBACK resize(int width,int height)
{
	glViewport(0,0,width,height);
	glMatrixMode( GL_PROJECTION );
	glLoadIdentity();
	glOrtho(-10,10, -10,10, -10,10);//устанавливаем матрицу перспективы   
	gluLookAt(3,1,1, 0,0,0, 0,1,0 );
//	gluLookAt(0,0,3, 0,0,0, 0,1,0 );
	glMatrixMode(GL_MODELVIEW );
}    

void CALLBACK display(void)
{
	glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
   	double way = 2*pii;
 
	glPushMatrix();//сохраняем текущее состояние
	glTranslated(0,0,-7);//переносим объект по оси z
	glColor3d(1,0,1);//определяем цвет фигуры

	for (int j=0; j<l-1; j++)
	{
		x = way*mass[j]/100;
		x2 = way*mass[j+1]/100;	//	Для закрытия поверхности
		
		a = -sin(x);
		b = cos(x);
		a2 = -sin(x2);
		b2 = cos(x2);
		glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
/*     ОТРИСОВКА БОКОВЫХ ПОВЕРХНОСТЕЙ     */
		for (int q=0; q<n-1; q++)
		{
			glBegin(GL_QUADS);
				glVertex3d(mast[q][0]+ms*cos(x),mast[q][1]+ms*sin(x),-(a*mast[q][0]+b*mast[q][1])+ms*x);
				glVertex3d(mast[q+1][0]+ms*cos(x),mast[q+1][1]+ms*sin(x),-(a*mast[q+1][0]+b*mast[q+1][1])+ms*x);
				glVertex3d(mast[q+1][0]+ms*cos(x2),mast[q+1][1]+ms*sin(x2),-(a2*mast[q+1][0]+b2*mast[q+1][1])+ms*x2);
				glVertex3d(mast[q][0]+ms*cos(x2),mast[q][1]+ms*sin(x2),-(a2*mast[q][0]+b2*mast[q][1])+ms*x2);
			glEnd();
		}			
			glBegin(GL_QUADS);
				glVertex3d(mast[n-1][0]+ms*cos(x),mast[n-1][1]+ms*sin(x),-(a*mast[n-1][0]+b*mast[n-1][1])+ms*x);
				glVertex3d(mast[0][0]+ms*cos(x),mast[0][1]+ms*sin(x),-(a*mast[0][0]+b*mast[0][1])+ms*x);
				glVertex3d(mast[0][0]+ms*cos(x2),mast[0][1]+ms*sin(x2),-(a2*mast[0][0]+b2*mast[0][1])+ms*x2);
				glVertex3d(mast[n-1][0]+ms*cos(x2),mast[n-1][1]+ms*sin(x2),-(a2*mast[n-1][0]+b2*mast[n-1][1])+ms*x2);
			glEnd();
	
		glPushMatrix();
		glTranslated(ms*cos(x),ms*sin(x),ms*x);
		glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
/*  отрисовка сечений*/
		glBegin(GL_POLYGON);
		for (int i=0; i<n-1; i++)
		{
			glVertex3d(mast[i][0],mast[i][1],-(a*mast[i][0]+b*mast[i][1]));
			glVertex3d(mast[i+1][0],mast[i+1][1],-(a*mast[i+1][0]+b*mast[i+1][1]));
		}
		glEnd();
		glPopMatrix();
	}
	glPushMatrix();
	glTranslated(ms*cos(x2),ms*sin(x2),ms*x2);
	glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
	/* ОТРИСОВКА ЗАМЫКАЮЩЕГО СЕЧЕНИЯ*/
	glBegin(GL_POLYGON);
	for (int i=0; i<n-1; i++)
	{
		glVertex3d(mast[i][0],mast[i][1],-(a2*mast[i][0]+b2*mast[i][1]));
		glVertex3d(mast[i+1][0],mast[i+1][1],-(a2*mast[i+1][0]+b2*mast[i+1][1]));
	}
	glEnd();
	glPopMatrix();

     glPopMatrix();
	glRotated(1,0,0,1);
	
	auxSwapBuffers();
}
void CALLBACK OnEnter()
{
	glRotated(1,0,0,1);
	
}


void readdata(void)
{
	double step;
	
	
	ifstream fin("data.dat");	
	fin >> d;	//	Читаем диаметр многоуголника
	fin >> ms;	//	Читаем масштаб спирали
	fin >> n;	//	Читаем количество вершин
	step = 2*pii/n;
	for (int i=0; i<n; i++)
	{
		mast[i][0] = d*sin(step*i);
		mast[i][1] = d*cos(step*i);
	}
	fin >> l;	//	Читаем количество сечений
	for (int j=0; j<l; j++)
		fin >> mass[j];	//	Читаем местоположение сечения от начала пути

}

void main()
{
	int pos[4] = {3,3,5,1};	//	место положение лампы в 3D
	int dir[3] = {-1,-1,-1};	//	Направление освещения
	GLfloat front_mat_specular[] = {1,0,1,1 };//определяем цвет зеркального отажения материала
	
	readdata();//считываем данные из файла

//	image = auxDIBImageLoad("space2.bmp");
    auxInitPosition( 50, 10, 700, 500);//определяем где будет располагаться окно
    auxInitDisplayMode( AUX_RGB | AUX_DEPTH | AUX_DOUBLE );//производим необходимые установки для работы в OpenGL
    

    auxInitWindow( "ALLANAT_RPODUCTION 2003(Лабораторная работа № 3)");//регестрируем окно в ОС
    auxIdleFunc(display);//"фоновая" функция
    auxReshapeFunc(resize);//функция, отвечающая за изменение размеров окна	

	glEnable(GL_ALPHA_TEST); //тестирование по цветовому параметру альфа
	glEnable(GL_DEPTH_TEST);	//	обнавление буфера глубины
	glEnable(GL_TEXTURE_2D);	//	Наложение текстур
	glEnable(GL_COLOR_MATERIAL);	//	Цвет для обьекта
	glEnable(GL_LIGHTING);	//	Включаем освещение
	glEnable(GL_LIGHT0);	//	Включаем нулевую лампу
	glEnable(GL_BLEND);//разрешаем смешение
	glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); // Определяем операцию смешения(реализация прозрачности)
/*     устанавливаем параметры источника света   */
	glLightiv(GL_LIGHT0, GL_POSITION, pos);
	glLightiv(GL_LIGHT0, GL_SPOT_DIRECTION, dir);

	glMaterialfv(GL_FRONT, GL_SPECULAR, front_mat_specular);	//	Отражает свет
    glMateriali(GL_FRONT, GL_SHININESS, 128);	//	Степень зеркального отражения материала
	auxKeyFunc(VK_RETURN,OnEnter);
	auxMainLoop(display);//функция, отвечающая за рисование
}



