Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

КомпГр_ЛР3_Заболотников_Петрова_Романова_9373

.pdf
Скачиваний:
23
Добавлен:
20.06.2023
Размер:
1.31 Mб
Скачать

МИНОБРНАУКИ РОССИИ САНКТ-ПЕТЕРБУРГСКИЙ ГОСУДАРСТВЕННЫЙ ЭЛЕКТРОТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ «ЛЭТИ» ИМ. В.И. УЛЬЯНОВА (ЛЕНИНА) Кафедра ИС

ОТЧЕТ по лабораторной работе№3

по дисциплине «Компьютерная графика» Тема: Формирования различных поверхностей с использованием ее

пространственного разворота и ортогонального проецирования на плоскость при ее визуализации (выводе на экран дисплея)

Студент гр. 9373

_______________

Заболотников М. Е.

Студентка гр. 9373

_______________

Петрова С. В.

Студентка гр. 9373

_______________

Романова Е. С.

Преподаватель

_______________

Матвеева И.В.

Санкт-Петербург

2022

Цель работы.

Сформировать поверхность Безье для различного задающего многогранника. Обеспечить поворот сформированной поверхности вокруг

осей X и Y.

Задание на работу.

Необходимо написать программу, которая рисует поверхность Безье по координатам вершин многогранника и предусматривает возможность поворота вокруг осей X и Y.

Общие сведения.

Для выполнения работы потребовались следующие теоретические

сведения.

 

Поверхность Безье порядка ( , )

задается ( + 1)( + 1)

контрольными точками . Точки поверхности задаются параметрическим

 

 

 

 

 

 

 

образом:

 

 

 

 

 

 

 

 

 

 

 

 

 

 

( , ) = ∑ ∑ ( ) ( ) ,

 

 

 

 

 

 

 

=0 =0

 

 

 

 

где , (0,1), B – многочлен

Бернштейна, который выглядит

следующим образом:

 

 

 

 

 

 

( ) = ( ) (1 − )

=

!

(1 − )

 

 

 

 

 

 

 

 

! ( − )!

 

 

 

 

 

В компьютерной графике построение поверхности Безье на трёхмерных объектах позволяет сгладить неровности фигуры.

Ход работы.

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

2

точек поверхности по выше описанной формуле и выводе поверхности на экран с выделенными точками задающего многогранника.

Выполнение работы.

Ссылка на видео с демонстрацией работы программы: https://www.youtube.com/watch?v=dkzuR6ck8KQ

Программа была написана в приложении Qt на языке С++ с

использованием графических библиотек.

Для работы с программой необходимо ввести количество столбцов и строк, затем нажать на «Ок». После данных манипуляций откроется окно для ввода координат многогранника и глубины D, и чтобы построить поверхность Безье необходимо нажать на кнопку «Ок». Поверхность отобразится ниже,

взаимодействовать с ней можно через кнопки «Отразить по Х», «Отразить по

Y», вращать по оси X, Y и Z и изменить масштаб с помощью «+» увеличить, а «–» уменьшить. Также можно изменить исходные данные и опять отобразить новую поверхность Безье.

3

Тесты работы программы.

На рис. 1 – 7 представлены результаты выполнения работы программы:

Рисунок 1 – Поверхность Безье по 9 точкам

Рисунок 2 – Поворот поверхности Безье на 90° по оси X

4

Рисунок 3 – Поворот поверхности Безье на 180° по оси Y

Рисунок 4 – Поворот поверхности Безье на 150° по оси Z

5

Рисунок 5 – Отображение плоскостей

Рисунок 6 – Отражение поверхности Безье относительно оси X

6

Рисунок 7 – Отражение поверхности Безье относительно оси Y

Выводы.

В данной работе была реализована программа отображения поверхности Безье с возможностью редактирования координат точек многоугольника, а

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

7

ПРИЛОЖЕНИЕ А

Файл «mainwindow.h»

#ifndef MAINWINDOW_H #define MAINWINDOW_H

#include <QMainWindow> #include <QVBoxLayout> #include <QHBoxLayout> #include <QGridLayout> #include <qpushbutton.h> #include <QSpinBox> #include <QCheckBox> #include <QLabel> #include "scene.h"

#include "surface_bezier.h" #include "setsizewindow.h" #include "QTime"

namespace Ui { class MainWindow;

}

class MainWindow : public QMainWindow

{

Q_OBJECT

public:

explicit MainWindow(QWidget *parent = 0); ~MainWindow();

public slots:

void scale_Plus(); void scale_Minus(); void rotation_X(int); void rotation_Y(int); void rotation_Z(int);

void show_AddLine(bool); void invert_X();

void invert_Y();

void build_WindowOfTools();

void build_WindowOfMatrice(int row, int col); private:

Ui::MainWindow *ui; bool flagFirst; Scene *scene;

QWidget *qw_Main;

QWidget *qw_buttons;

QVBoxLayout *qvbl_MainWindow;

QVBoxLayout *qvbl_Main;

QHBoxLayout *qhbl_buttons;

Surface_Bezier *surface;

QPushButton *qpb_Scale_Plus;

QPushButton *qpb_Scale_Minus;

8

QSpinBox *qsb_Rotation_X;

QSpinBox *qsb_Rotation_Y;

QSpinBox *qsb_Rotation_Z;

QLabel *ql_Rotation_X;

QLabel *ql_Rotation_Y;

QLabel *ql_Rotation_Z;

QLabel *ql_Scale;

QLabel *ql_AddLine;

QCheckBox *qcb_AddLine;

SetSizeWindow *setSizeWindow;

vector <vector<double> > x; vector <vector<double> > y; vector <vector<double> > z;

QPushButton *qpb_ValueOfMatrice; QSpinBox *qsb_Depth;

vector <vector<QSpinBox*> > qsb_X; vector <vector<QSpinBox*> > qsb_Y; vector <vector<QSpinBox*> > qsb_Z;

vector <vector<QLabel*> > ql_XYZ; QWidget *qw_WindowEntireData;

QGridLayout *qgl_Main;

QPushButton *qpb_Inv_X;

QPushButton *qpb_Inv_Y;

};

#endif

Файл «scene.h»

#ifndef SCENE_H #define SCENE_H

#include <QOpenGLWidget> #include <QOpenGLFunctions> #include <qDebug>

#include <QtGui>

#include "surface_bezier.h"

class Scene : public QOpenGLWidget

{

public:

Scene();

Scene(vector <vector<double> > x, vector <vector<double> > y, vector <vector<double> > z, Surface_Bezier surface);

void set_scene(vector <vector<double> > x, vector <vector<double> > y, vector <vector<double> > z, Surface_Bezier surface);

void scale_Plus(); void scale_Minus(); void rotation_X(int); void rotation_Y(int);

9

void

rotation_Z(int);

void

show_AddLine(bool);

void

keyPressEvent(QKeyEvent *);

void

invert_X();

void

invert_Y();

protected:

void

initializeGL();

void

resizeGL(int nWidth, int nHeight);

void

paintGL();

private:

 

void

draw_XYZ();

void

draw_Surface_Bezier();

void

draw_Polyhedron();

vector <vector<double> > x; vector <vector<double> > y; vector <vector<double> > z;

Surface_Bezier surface;

double var_Scale = 1; int var_Rot_X = 25; int var_Rot_Y = -45; int var_Rot_Z = 0;

bool var_Alpha = 0;

vector <double> x_test; vector <double> y_test; vector <double> z_test;

int var_Inv_X = 1; int var_Inv_Y = 1;

};

#endif

Файл «setsizewindow.h»

#ifndef SETSIZEWINDOW_H #define SETSIZEWINDOW_H

#include <QWidget> #include <QHBoxLayout> #include <QSpinBox> #include <QLabel> #include <QPushButton>

class SetSizeWindow : public QWidget

{

Q_OBJECT public:

explicit SetSizeWindow(QWidget *parent = 0); public slots:

void emitSignalOfMatrice(); signals:

void ValueOfMatrice(int row,int col); private:

QSpinBox *qsb_ValueOfRow;

QSpinBox *qsb_ValueOfCol;

10