КомпГр_ЛР4_Заболотников_Петрова_Романова_9373
.pdfui->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