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

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

.pdf
Скачиваний:
27
Добавлен:
20.06.2023
Размер:
854.54 Кб
Скачать

МИНОБРНАУКИ РОССИИ САНКТ-ПЕТЕРБУРГСКИЙ ГОСУДАРСТВЕННЫЙ ЭЛЕКТРОТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ «ЛЭТИ» ИМ. В.И. УЛЬЯНОВА (ЛЕНИНА) Кафедра Информационных сетей

ОТЧЕТ по лабораторной работе№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