КомпГр_ЛР3_Заболотников_Петрова_Романова_9373
.pdfМИНОБРНАУКИ РОССИИ САНКТ-ПЕТЕРБУРГСКИЙ ГОСУДАРСТВЕННЫЙ ЭЛЕКТРОТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ «ЛЭТИ» ИМ. В.И. УЛЬЯНОВА (ЛЕНИНА) Кафедра ИС
ОТЧЕТ по лабораторной работе№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