КомпГр_ЛР2_Заболотников_Петрова_Романова_9373
.pdfМИНОБРНАУКИ РОССИИ САНКТ-ПЕТЕРБУРГСКИЙ ГОСУДАРСТВЕННЫЙ ЭЛЕКТРОТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ «ЛЭТИ» ИМ. В.И. УЛЬЯНОВА (ЛЕНИНА) Кафедра Информационных сетей
ОТЧЕТ по лабораторной работе№2
по дисциплине «Компьютерная графика» Тема: Формирования различных кривых с использованием
ортогонального проектирования на плоскость визуализации (экран дисплея)
Студент гр. 9373 |
_______________ |
Заболотников М. Е. |
Студентка гр. 9373 |
_______________ |
Петрова С. В. |
Студентка гр. 9373 |
_______________ |
Романова Е. С. |
Преподаватель |
_______________ |
Матвеева И.В. |
Санкт-Петербург
2022
Цель работы.
Сформировать на плоскости кривую Безье на основе задающей ломаной,
определяемой 3 и большим количеством точек. Обеспечить редактирование координат точек задающей ломаной с перерисовкой сплайна Безье.
Задание на работу.
Необходимо написать программу, которая рисует кривую Безье на основе трех и более точек.
Общие сведения.
Для выполнения работы потребовались следующие теоретические сведения.
Кривая Безье – тип кривой, которая строится по некоторому набору так называемых опорных точек. Данная кривая описывается параметрическим уравнением:
!
( ) = ∑ ! ( − )! (1 − )−,
=0
где ( ) – полиноминальная функция, – вес (координата) -ой точки, –
количество опорных точек, – задающий параметр ( [0; 1]).
Точки задания кривой Безье только определяют ход кривой, сама кривая в общем случае не проходит через внутренние точки задающего многоугольника (см. рис. 1).
2
Рисунок 1 – Кривая Безье по четырем точкам
Ход работы.
Рассмотрим работу программы, которая заключается в вызывании цикла для (t [0;1]) с шагом 0,05 и высчитывании полиноминальной функции ( )
для координат X и Y. Следующим шагом является построение кривой Безье по найденным точкам.
Выполнение работы.
Ссылка на видео с демонстрацией работы программы: https://www.youtube.com/watch?v=pzrd5cDvT4U
Программа была написана в приложении Qt на языке С++ с
использованием графических библиотек.
Для работы с программой необходимо ввести количество точек, в
последействии по которым, будет строится кривая Безье, от трех до пяти. В
случае выбора количества точек меньше трех, программа запретит ввод координат. Далее, необходимо ввести координаты точек и нажать на кнопки
«Обновить» и «Построить кривую».
3
Тесты работы программы.
На рис. 2 – 4 представлены результаты выполнения работы программы:
Рисунок 2 – Кривая Безье для трех точек
Рисунок 3 – Кривая Безье для четырех точек
4
Рисунок 4 – Кривая Безье для пяти точек
Выводы.
В данной работе была реализована программа отображения кривой Безье для более трех точек с возможность редактирования координат точек и их количества.
5
ПРИЛОЖЕНИЕ А
Файл «mainwindow.h»
#ifndef MAINWINDOW_H #define MAINWINDOW_H
#include <QMainWindow> #include <QVector> #include <QLabel> #include <QLineEdit> #include <QPushButton> #include "paint.h"
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; } QT_END_NAMESPACE
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr); ~MainWindow();
private slots:
void on_btnUpdate_clicked(); void on_btnBuildLine_clicked();
void on_lineNumberPoints_textChanged(const QString &arg1);
private:
Ui::MainWindow *ui; Paint P;
};
#endif // MAINWINDOW_H
Файл «paint.h»
#ifndef PAINT_H #define PAINT_H #include<QVector>
#include<QtCore/qmath.h>
class Paint
{
public:
Paint();
//Для того, чтобы вытащить полученные значения в дугой класс
QVector<double> getx(int); QVector<double> gety(int); QVector<double> getPx(); QVector<double> getPy();
//Для нахождения x и y void calcP();
double clacPx(double); double clacPy(double); void clearP();
void setNewPoints(double, double, double, double, double, double, double, double, double, double);
6
int findNearest(int, QVector<double>, QVector<double>); void setNum(int);
int getNum(); int fact(int);
private:
QVector<QVector<double>> X; QVector<QVector<double>> Y; int numberOfPoints; QVector<double> Px; QVector<double> Py;
};
#endif // PAINT_H
Файл «main.cpp»
#include "mainwindow.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv); MainWindow w;
w.show();
return a.exec();
}
Файл «mainwindow.cpp»
#include "mainwindow.h" #include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
ui->widget->xAxis->setRange(-10,10); ui->widget->yAxis->setRange(-10,10); ui->widget->setInteraction(QCP::iRangeZoom, true); ui->widget->setInteraction(QCP::iRangeDrag, true);
ui->widget->addGraph(); ui->widget->graph(0)->setData(P.getx(1),P.gety(1)); ui->widget->addGraph(); ui->widget->graph(1)->setData(P.getx(2),P.gety(2)); ui->widget->addGraph(); ui->widget->graph(2)->setData(P.getx(3),P.gety(3)); ui->widget->addGraph();//3 - 4 точка ui->widget->addGraph();//4 - 5 точка
//ui->widget->addGraph();
//ui->widget->graph(3)->setData(P.getPx(),P.getPy());
ui->widget->graph(0)->setPen(QColor(50, 50, 50, 255));//задаем цвет точки ui->widget->graph(0)->setLineStyle(QCPGraph::lsNone);//убираем линии ui->widget->graph(0)-
>setScatterStyle(QCPScatterStyle(QCPScatterStyle::ssDisc, 4));
ui->widget->graph(1)->setPen(QColor(50, 50, 50, 255));//задаем цвет точки ui->widget->graph(1)->setLineStyle(QCPGraph::lsNone);//убираем линии
7
ui->widget->graph(1)- >setScatterStyle(QCPScatterStyle(QCPScatterStyle::ssDisc, 4));
ui->widget->graph(2)->setPen(QColor(50, 50, 50, 255));//задаем цвет точки ui->widget->graph(2)->setLineStyle(QCPGraph::lsNone);//убираем линии ui->widget->graph(2)-
>setScatterStyle(QCPScatterStyle(QCPScatterStyle::ssDisc, 4));
ui->widget->graph(3)->setPen(QColor(50, 50, 50, 255));//задаем цвет точки ui->widget->graph(3)->setLineStyle(QCPGraph::lsNone);//убираем линии ui->widget->graph(3)-
>setScatterStyle(QCPScatterStyle(QCPScatterStyle::ssDisc, 4));
ui->widget->graph(4)->setPen(QColor(50, 50, 50, 255));//задаем цвет точки ui->widget->graph(4)->setLineStyle(QCPGraph::lsNone);//убираем линии ui->widget->graph(4)-
>setScatterStyle(QCPScatterStyle(QCPScatterStyle::ssDisc, 4));
ui->widget->addGraph(); ui->widget->graph(5)->setData(P.getPx(),P.getPy(), true);//5 - график
ui->widget->replot();
P.setNum(3); ui->lineX1->setEnabled(true); ui->lineY1->setEnabled(true); ui->lineX2->setEnabled(true); ui->lineY2->setEnabled(true); ui->lineX3->setEnabled(true); ui->lineY3->setEnabled(true);
ui->lineX4->setEnabled(false); ui->lineY4->setEnabled(false); ui->lineX5->setEnabled(false); ui->lineY5->setEnabled(false);
setMinimumSize(QSize(410,450));
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::on_btnUpdate_clicked()
{
double x1_new = ui->lineX1->text().toDouble(); double x2_new = ui->lineX2->text().toDouble(); double x3_new = ui->lineX3->text().toDouble(); double x4_new = ui->lineX4->text().toDouble(); double x5_new = ui->lineX5->text().toDouble(); double y1_new = ui->lineY1->text().toDouble(); double y2_new = ui->lineY2->text().toDouble(); double y3_new = ui->lineY3->text().toDouble(); double y4_new = ui->lineY4->text().toDouble(); double y5_new = ui->lineY5->text().toDouble();
8
P.setNewPoints(x1_new, x2_new, x3_new,x4_new,x5_new, y1_new, y2_new, y3_new,y4_new,y5_new);
P.clearP(); ui->widget->graph(0)->setData(P.getx(1),P.gety(1)); ui->widget->graph(1)->setData(P.getx(2),P.gety(2)); ui->widget->graph(2)->setData(P.getx(3),P.gety(3)); ui->widget->graph(3)->setData(P.getx(4),P.gety(4)); ui->widget->graph(4)->setData(P.getx(5),P.gety(5)); ui->widget->graph(5)->setVisible(false);
if (P.getNum()==3)
{
ui->widget->graph(3)->setVisible(false); ui->widget->graph(4)->setVisible(false);
}
else if (P.getNum()==4)
{
ui->widget->graph(3)->setVisible(true); ui->widget->graph(4)->setVisible(false);
}
else if (P.getNum()==5)
{
ui->widget->graph(3)->setVisible(true); ui->widget->graph(4)->setVisible(true);
}
ui->widget->replot();
}
void MainWindow::on_btnBuildLine_clicked()
{
if (P.getNum() > 2 && P.getNum() < 6)
{
P.calcP(); ui->widget->graph(5)->setData(P.getPx(),P.getPy(), true); ui->widget->graph(5)->setVisible(true); ui->widget->replot();
}
else
{
ui->widget->graph(5)->setVisible(false);
}
}
void MainWindow::on_lineNumberPoints_textChanged(const QString &arg1)
{
int number = arg1.toInt(); if(number == 3){
P.setNum(number); ui->lineX1->setEnabled(true); ui->lineY1->setEnabled(true); ui->lineX2->setEnabled(true); ui->lineY2->setEnabled(true); ui->lineX3->setEnabled(true); ui->lineY3->setEnabled(true);
ui->lineX4->setEnabled(false); ui->lineY4->setEnabled(false);
9
ui->lineX5->setEnabled(false); ui->lineY5->setEnabled(false); ui->widget->graph(3)->setVisible(false); ui->widget->graph(4)->setVisible(false);
}
else if ( number == 4)
{
P.setNum(number); ui->lineX1->setEnabled(true); ui->lineY1->setEnabled(true); ui->lineX2->setEnabled(true); ui->lineY2->setEnabled(true); ui->lineX3->setEnabled(true); ui->lineY3->setEnabled(true); ui->lineX4->setEnabled(true); ui->lineY4->setEnabled(true);
ui->lineX5->setEnabled(false); ui->lineY5->setEnabled(false); ui->widget->graph(3)->setVisible(true); ui->widget->graph(4)->setVisible(false);
}
else if ( number == 5)
{
P.setNum(number); ui->lineX1->setEnabled(true); ui->lineY1->setEnabled(true); ui->lineX2->setEnabled(true); ui->lineY2->setEnabled(true); ui->lineX3->setEnabled(true); ui->lineY3->setEnabled(true); ui->lineX4->setEnabled(true); ui->lineY4->setEnabled(true);
ui->lineX5->setEnabled(true); ui->lineY5->setEnabled(true); ui->widget->graph(3)->setVisible(true); ui->widget->graph(4)->setVisible(true);
}
else
{
ui->lineX1->setEnabled(false); ui->lineY1->setEnabled(false); ui->lineX2->setEnabled(false); ui->lineY2->setEnabled(false); ui->lineX3->setEnabled(false); ui->lineY3->setEnabled(false); ui->lineX4->setEnabled(false); ui->lineY4->setEnabled(false); ui->lineX5->setEnabled(false); ui->lineY5->setEnabled(false); ui->widget->graph(3)->setVisible(false); ui->widget->graph(4)->setVisible(false);
}
}
Файл «paint.cpp»
#include "paint.h"
10