#include #include GLint winWidth = 1024, winHeight = 768; // Исходный размер окна на экране. bool drawLineSegments; bool drawLineSplines; class Point { public: GLint x, y; // ДОБАВИТЬ ПАРАМЕТРИЧЕСКУЮ КООРДИНАТУ t }; std::list PtListCtr; std::list PtList; std::list ::iterator i; void calculateLineSplines() { Point pt; // текущая контрольная точка i Point ptNext; // контрольная точка i+1 Point ptFirst; // первая контрольная точка Point ptLast; // последняя контрольная точка Point ptNew; //новая точка сплайна PtList.clear(); // очистка предыдущих добавленных точек ptFirst = PtListCtr.front(); ptLast = PtListCtr.back(); // ДОБАВИТЬ ПЕРЕМЕННЫЕ И ИНИЦИАЛИЗАЦИЮ ШАГА ПО ПАРАМЕТРИЧЕСКОЙ КООРДИНАТЕ t i = PtListCtr.begin(); pt = *i; i++; ptNext = *i; while (i != PtListCtr.end()) { // РАСЧЕТ КООРДИНАТ ТОЧКИ СПЛАЙНА //ptNew = f(pt,ptNext) PtList.push_back(ptNew); while (true) // НАПИСАТЬ ВМЕСТО true УСЛОВИЕ ПЕРЕХОДА К СЛЕДУЮЩЕЙ ПАРЕ КОНТРОЛЬНЫХ ТОЧЕК { pt = ptNext; i++; if (i == PtListCtr.end()) { PtList.push_back(ptLast); break; } else ptNext = *i; } } } void init(void) { glClearColor(1.0, 1.0, 1.0, 1.0); // Цвет окна выбран белым. glMatrixMode(GL_PROJECTION); gluOrtho2D(0.0, (GLdouble)winWidth, 0.0, (GLdouble)winHeight); drawLineSegments = false; drawLineSplines = false; } void plotPoint(Point pt) { glBegin(GL_POINTS); glVertex2i(pt.x, pt.y); glEnd(); } void plotLineSegments() { glBegin(GL_LINE_STRIP); for (i = PtListCtr.begin(); i != PtListCtr.end(); i++) { glVertex2i(i->x, i->y); } glEnd(); } void displayFnc(void) { glClear(GL_COLOR_BUFFER_BIT); glColor3f(0.0, 0.0, 0.0); // Цвет рисования выбран черным glPointSize(10.0); for (i = PtListCtr.begin(); i != PtListCtr.end(); i++) { plotPoint(*i); } if (drawLineSplines) { glColor3f(1.0, 0.0, 0.0); // Цвет рисования выбран красным glPointSize(7.0); for (i = PtList.begin(); i != PtList.end(); i++) { plotPoint(*i); } } if (drawLineSegments) { glColor3f(0.0, 0.0, 0.0); // Цвет рисования выбран черным plotLineSegments(); } glFlush(); } void winReshapeFnc(GLint newWidth, GLint newHeight) { // Обновление параметров размера окна. winWidth = newWidth; winHeight = newHeight; // Обновление точки обзора и проекционных параметров. glViewport(0, 0, newWidth, newHeight); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluOrtho2D(0.0, (GLdouble)winWidth, 0.0, (GLdouble)winHeight); } void plotMode(GLint selectedOption) { switch (selectedOption) { case 1: drawLineSplines = !drawLineSplines; if (drawLineSplines) { calculateLineSplines(); } break; case 2: drawLineSegments = !drawLineSegments; break; } glutPostRedisplay(); } void addPoint(GLint button, GLint action, GLint xMouse, GLint yMouse) { Point pt; Point ptPrev; if (button == GLUT_LEFT_BUTTON && action == GLUT_DOWN) { pt.x = xMouse; pt.y = winHeight - yMouse; if (PtListCtr.empty()) { ptPrev = pt; //ИНИЦИАЛИЗАЦИЯ ПАРАМЕТРИЧЕСКОЙ КООРДИНАТЫ t В ПЕРВОЙ КОНТРОЛЬНОЙ ТОЧКЕ } else { ptPrev = PtListCtr.back(); } // ДОБАВИТЬ ИНИЦИАЛИЗАЦИЮ ПАРАМЕТРИЧЕСКОЙ КООРДИНАТЫ t PtListCtr.push_back(pt); glutPostRedisplay(); } } void main(int argc, char** argv) { glutInit(&argc, argv); // Инициализация GLUT glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); // Установка режима дисплея glutInitWindowPosition(0, 0); // Задает верхнее левое положение окна изображения. glutInitWindowSize(winWidth, winHeight); glutCreateWindow("Лабораторная работа № 1"); //Создает окно изображения init(); // Процедура инициализации. glutDisplayFunc(displayFnc); glutCreateMenu(plotMode); glutAddMenuEntry("Линейный сплайн", 1); glutAddMenuEntry("Ломаная линия", 2); glutAttachMenu(GLUT_RIGHT_BUTTON); // ВЫбор опции меню с использованием правой кнопки мыши. glutReshapeFunc(winReshapeFnc); glutMouseFunc(addPoint); glutMainLoop(); }