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

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

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

ui->widget->graph(i)->setVisible(false);

}

}

ui->widget->replot();

}

void MainWindow::createPlot()

{

bool flagPoly = P.ifBump(true); //Проверяем на выпуклость полигон bool flagWind = P.ifBump(false);//Проверяем на выпуклость экран if(flagPoly && flagWind)

{

//ДЛЯ МНОГОУГОЛЬНИКА if(flagFirstPlot)

{//Создаем пять графов для сторон ui->widget->addGraph(); ui->widget->addGraph(); ui->widget->addGraph(); ui->widget->addGraph(); ui->widget->addGraph();

}

//ДЛЯ ЭКРАНА if(flagFirstPlot)

{//Создаем пять графов для сторон ui->widget->addGraph(); ui->widget->addGraph(); ui->widget->addGraph(); ui->widget->addGraph(); ui->widget->addGraph();

}

for(int j = 0; j < P.getNumPoly()+P.getNumWin(); j++)

{

ui->widget->graph(j)->setVisible(true);

}

//Заполняем значенияи int i = 0;

for(;i+1<P.getNumPoly();i++)

{

ui->widget->graph(i)- >setData({P.getxP(i+1),P.getxP(i+2)},{P.getyP(i+1),P.getyP(i+2)}, true);//1

прямая - 1 и 2 точки

}

ui->widget->graph(i)- >setData({P.getxP(i+1),P.getxP(1)},{P.getyP(i+1),P.getyP(1)});

//Заполняем значенияи i = 0;

for(;i+1<P.getNumWin();i++)

{

ui->widget->graph(i+5)- >setData({P.getxW(i+1),P.getxW(i+2)},{P.getyW(i+1),P.getyW(i+2)}, true);//1

прямая - 1 и 2 точки

}

ui->widget->graph(i+5)- >setData({P.getxW(i+1),P.getxW(1)},{P.getyW(i+1),P.getyW(1)});

}

else

11

{

ui->Massage->setText("Сообщения:\nОдна фигура или обе\n не являются выпуклыми");

for(int j = 0; j < 10; j++)

{

ui->widget->graph(j)->setVisible(false);

}

}

ui->widget->replot();

}

void MainWindow::drawInterPoly(QVector<QVector<double> > Points)

{

bool flagPoly = P.ifBump(true); //Проверяем на выпуклость полигон bool flagWind = P.ifBump(false);//Проверяем на выпуклость экран if(flagPoly&&flagWind)

{

if(flagFirstInter)

{

for(int i = 0; i < 10; i++)

{

ui->widget->addGraph();//от 10 до 19 грани области

}

}

for (int i = 10; i < 19; i++)

{

ui->widget->graph(i)->setVisible(false);

}

int size = Points.length(); //Заполняем значенияи

int i = 10; for(;i+1<size+10;i++)

{

ui->widget->graph(i)->setData({Points[i-10][0],Points[i- 9][0]},{Points[i-10][1],Points[i-9][1]}, true);//1 прямая - 1 и 2 точки

}

ui->widget->graph(i)->setData({Points[i- 10][0],Points[0][0]},{Points[i-10][1],Points[0][1]});

//Наведём красоту на график полигон for (int i = 10; i < size+10; i++)

{

ui->widget->graph(i)->setVisible(true); ui->widget->graph(i)->setPen(QColor(0,66,66, 255));//задаем цвет

точки

ui->widget->graph(i)->setLineStyle(QCPGraph::lsLine);//убираем

линии

ui->widget->graph(i)- >setScatterStyle(QCPScatterStyle(QCPScatterStyle::ssDisc, 4));

}

flagFirstInter = false; ui->widget->replot();

}

else

{

ui->Massage->setText("Сообщения:\nОдна фигура или обе\n не являются выпуклыми");

}

}

12

void MainWindow::on_lineNumberPointsPolygon_textChanged(const QString &arg1)

{

int number = arg1.toInt(); if(number == 3){

P.setNumPoly(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); ui->lineX5->setEnabled(false); ui->lineY5->setEnabled(false);

}

else if ( number == 4)

{

P.setNumPoly(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);

}

else if ( number == 5)

{

P.setNumPoly(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);

}

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);

13

ui->lineY4->setEnabled(false); ui->lineX5->setEnabled(false); ui->lineY5->setEnabled(false);

}

}

void MainWindow::on_lineNumberPointsWindow_textChanged(const QString &arg1)

{

int number = arg1.toInt(); if(number == 3){

P.setNumWin(number); ui->lineX1_W->setEnabled(true); ui->lineY1_W->setEnabled(true); ui->lineX2_W->setEnabled(true); ui->lineY2_W->setEnabled(true); ui->lineX3_W->setEnabled(true); ui->lineY3_W->setEnabled(true);

ui->lineX4_W->setEnabled(false); ui->lineY4_W->setEnabled(false); ui->lineX5_W->setEnabled(false); ui->lineY5_W->setEnabled(false);

}

else if ( number == 4)

{

P.setNumWin(number); ui->lineX1_W->setEnabled(true); ui->lineY1_W->setEnabled(true); ui->lineX2_W->setEnabled(true); ui->lineY2_W->setEnabled(true); ui->lineX3_W->setEnabled(true); ui->lineY3_W->setEnabled(true); ui->lineX4_W->setEnabled(true); ui->lineY4_W->setEnabled(true);

ui->lineX5_W->setEnabled(false); ui->lineY5_W->setEnabled(false);

}

else if ( number == 5)

{

P.setNumWin(number); ui->lineX1_W->setEnabled(true); ui->lineY1_W->setEnabled(true); ui->lineX2_W->setEnabled(true); ui->lineY2_W->setEnabled(true); ui->lineX3_W->setEnabled(true); ui->lineY3_W->setEnabled(true); ui->lineX4_W->setEnabled(true); ui->lineY4_W->setEnabled(true);

ui->lineX5_W->setEnabled(true); ui->lineY5_W->setEnabled(true);

}

else

{

ui->lineX1_W->setEnabled(false); ui->lineY1_W->setEnabled(false);

14

ui->lineX2_W->setEnabled(false); ui->lineY2_W->setEnabled(false); ui->lineX3_W->setEnabled(false); ui->lineY3_W->setEnabled(false); ui->lineX4_W->setEnabled(false); ui->lineY4_W->setEnabled(false); ui->lineX5_W->setEnabled(false); ui->lineY5_W->setEnabled(false);

}

}

void MainWindow::on_btnBuildLine_clicked()

{

QVector<double> point; QVector<QVector<double>> pointsOfI; int i2,j2;

//Сначал нйдём точки пересечения экрана и полигона for(int i = 0; i<P.getNumPoly();i++)

{

//Берём две точки полигона

for(int j = 0; j<P.getNumWin();j++)

{point.clear();

i2 = (i+1 == P.getNumPoly())?0:i+1;

j2 = (j+1 == P.getNumWin())?0:j+1; //Берём две точки экрана

point = P.XOfInter(i,i2,j,j2); if(point[0]<1000000000 && point[0]>-1000000000)

{

pointsOfI.push_back(point);

}

}

}

//Теперь необходимо выделить все точки экрана внутри полигона //Берём точку экрана

QVector<double> buf; double sumOfAngle = 0;

for(int i = 0; i<P.getNumWin();i++)

{

sumOfAngle = 0;

//Берём две точки полигона

for(int j = 0; j<P.getNumPoly();j++)

{

point.clear();

j2 = (j+1 == P.getNumPoly())?0:j+1; buf = P.pointAngle(i,j,j2); point.push_back(buf[0]); point.push_back(buf[1]);

sumOfAngle += buf[2];

}

int buff = sumOfAngle; if(buff == 360)

{

pointsOfI.push_back(point);

}

}

//Теперь необходимо выделить все точки полигона внутри 'экрана //Берём точку полигона

buf.clear(); sumOfAngle = 0;

15

for(int i = 0; i<P.getNumPoly();i++)

{

sumOfAngle = 0;

//Берём две точки полигона

for(int j = 0; j<P.getNumWin();j++)

{

point.clear();

j2 = (j+1 == P.getNumWin())?0:j+1; buf = P.pointAngle2(i,j,j2); point.push_back(buf[0]); point.push_back(buf[1]); sumOfAngle += buf[2];

}

int buff = sumOfAngle; if(buff == 360)

{

pointsOfI.push_back(point);

}

}

if(pointsOfI.length() > 0)

{

pointsOfI = P.sortPoints(pointsOfI); drawInterPoly(pointsOfI);

}

else

{

ui->Massage->setText("Сообщения:\nФигуры не имеют\nпересечений");

}

}

Файл «paint.cpp»

#include "paint.h" using namespace std;

Paint::Paint()

{

//Для полигона заполним массив точек

double massiveX[5][1] = {{1},{3},{8},{10},{0}}; double massiveY[5][1] = {{2},{7},{8},{2},{0}};

for(int i = 0; i < 5; i ++)

{

QVector<double> tempX; QVector<double> tempY;

for (int j = 0; j < 1; j++)

{

tempX.push_back(massiveX[i][j]); tempY.push_back(massiveY[i][j]);

}

Px.push_back(tempX);

Py.push_back(tempY);

}

numberOfPointsPolygon = 4;

//Для Окна заполним массив точек

double massiveX2[5][1] = {{2},{5},{9},{0},{0}}; double massiveY2[5][1] = {{1},{9},{3},{0},{0}}; for(int i = 0; i < 5; i ++)

{

16

QVector<double> tempX; QVector<double> tempY;

for (int j = 0; j < 1; j++)

{

tempX.push_back(massiveX2[i][j]); tempY.push_back(massiveY2[i][j]);

}

Wx.push_back(tempX);

Wy.push_back(tempY);

}

numberOfPointsWindow = 3;

}

double Paint::getxP(int point)

{

return Px[point-1][0];

}

double Paint::getyP(int point)

{

return Py[point-1][0];

}

double Paint::getxW(int point)

{

return Wx[point-1][0];

}

double Paint::getyW(int point)

{

return Wy[point-1][0];

}

QVector<double> Paint::getPx()

{

QVector<double> tempX;

for (int i = 0; i < numberOfPointsPolygon; i++)

{

tempX.push_back(Px[i][0]);

}

tempX.push_back(Px[0][0]); return tempX;

}

QVector<double> Paint::getPy()

{

QVector<double> tempY; QVector<double> tempX = getPx();

for (int i = 0; i < numberOfPointsPolygon; i++)

{

tempY.push_back(Py[i][0]);

}

tempY.push_back(Py[0][0]); return tempY;

}

QVector<double> Paint::getWx()

{

QVector<double> tempX;

for (int i = 0; i < numberOfPointsWindow; i++)

{

17

tempX.push_back(Wx[i][0]);

}

tempX.push_back(Wx[0][0]); return tempX;

}

QVector<double> Paint::getWy()

{

QVector<double> tempY;

for (int i = 0; i < numberOfPointsWindow; i++)

{

tempY.push_back(Wy[i][0]);

}

tempY.push_back(Wy[0][0]); return tempY;

}

void Paint::clearP()

{

Px.clear();

Py.clear();

}

void Paint::clearW()

{

Wx.clear();

Wy.clear();

}

void Paint::setNewPointsPoly(double x1N, double x2N, double x3N, double x4N, double x5N, double y1N, double y2N, double y3N, double y4N, double y5N)

{

Px.clear();

Py.clear();

double massiveX[5][1] = {{x1N},{x2N},{x3N},{x4N},{x5N}}; double massiveY[5][1] = {{y1N},{y2N},{y3N},{y4N},{y5N}};

for(int i = 0; i < 5; i ++)

{

QVector<double> tempX; QVector<double> tempY;

for (int j = 0; j < 1; j++)

{

tempX.push_back(massiveX[i][j]); tempY.push_back(massiveY[i][j]);

}

Px.push_back(tempX);

Py.push_back(tempY);

}

}

void Paint::setNewPointsWin(double x1N, double x2N, double x3N, double x4N, double x5N, double y1N, double y2N, double y3N, double y4N, double y5N)

{

Wx.clear();

Wy.clear();

double massiveX[5][1] = {{x1N},{x2N},{x3N},{x4N},{x5N}}; double massiveY[5][1] = {{y1N},{y2N},{y3N},{y4N},{y5N}};

for(int i = 0; i < 5; i ++)

{

QVector<double> tempX; QVector<double> tempY;

for (int j = 0; j < 1; j++)

18

{

tempX.push_back(massiveX[i][j]); tempY.push_back(massiveY[i][j]);

}

Wx.push_back(tempX);

Wy.push_back(tempY);

}

}

void Paint::setNumPoly(int num)

{

numberOfPointsPolygon = num;

}

bool Paint::ifBump(bool Poly)//

{

QVector<QVector<double>> VectorsPoly; QVector<QVector<double>> X = Poly?Px:Wx; QVector<QVector<double>> Y = Poly?Py:Wy; QVector<int> direction;

bool flag = false;

int valueOfPoints = Poly?numberOfPointsPolygon:numberOfPointsWindow;

//Создадим для полигона векотра - стороны и запишем в матрицу

for(int i = 0; i+1 < valueOfPoints; i ++)

{

QVector<double> temp; temp.push_back(X[i+1][0]-X[i][0]); temp.push_back(Y[i+1][0]-Y[i][0]); VectorsPoly.push_back(temp); if(i+2>=valueOfPoints)

{

i++;

temp.clear(); temp.push_back(X[0][0]-X[i][0]); temp.push_back(Y[0][0]-Y[i][0]); VectorsPoly.push_back(temp);

}

}

for (int i = 0; i+1 < valueOfPoints; i++)

{

if(VectorsPoly[i][0]*VectorsPoly[i+1][1]- VectorsPoly[i+1][0]*VectorsPoly[i][1] < 0)

{

direction.push_back(1); //Поворот напрраво

}

else

{

direction.push_back(0); //Поворот налево

}

if(i+2>=valueOfPoints)

{

i++; if(VectorsPoly[i][0]*VectorsPoly[0][1]-

VectorsPoly[0][0]*VectorsPoly[i][1] < 0)

{

direction.push_back(1); //Поворот напрраво

}

else

19

{

direction.push_back(0); //Поворот налево

}

}

}

if(direction.contains(0) && direction.contains(1))

{

flag = false;

}

else

{

flag = true;

}

return flag;

}

void Paint::setNumWin(int num)

{

numberOfPointsWindow = num;

}

int Paint::getNumPoly()

{

return numberOfPointsPolygon;

}

int Paint::getNumWin()

{

return numberOfPointsWindow;

}

int Paint::fact(int val)

{

if(val == 0) return 1; else

{

return val*fact(val-1);

}

}

QVector<double> Paint::XOfInter(int PolygonIndex1,int PolygonIndex2, int WindowsIndex1,int WindowsIndex2)

{

QVector<double> ans;

double maxPX, minPX, maxWX, minWX,maxPY, minPY, maxWY, minWY; double bPoly = (-Px[PolygonIndex1][0]*Py[PolygonIndex2][0] + Px[PolygonIndex2][0]*Py[PolygonIndex1][0])/(Px[PolygonIndex2][0]-

Px[PolygonIndex1][0]);

double bWind = (-Wx[WindowsIndex1][0]*Wy[WindowsIndex2][0] + Wx[WindowsIndex2][0]*Wy[WindowsIndex1][0])/(Wx[WindowsIndex2][0]- Wx[WindowsIndex1][0]);

double kPoly = (Py[PolygonIndex2][0]- Py[PolygonIndex1][0])/(Px[PolygonIndex2][0]-Px[PolygonIndex1][0]);

double kWind = (Wy[WindowsIndex2][0]- Wy[WindowsIndex1][0])/(Wx[WindowsIndex2][0]-Wx[WindowsIndex1][0]);

if(kWind==kPoly)

{

return {1000000000,1000000000};

}

else

{

if(abs(Px[PolygonIndex2][0]- Px[PolygonIndex1][0]) < 0.0000000000001

)

{

20