КомпГр_ЛР4_Заболотников_Петрова_Романова_9373
.pdfans.push_back(Px[PolygonIndex1][0]); ans.push_back(kWind*ans[0] + bWind);
}
else if(abs(Wx[WindowsIndex2][0]-Wx[WindowsIndex1][0]) < 0.0000000000001)
{
ans.push_back(Wx[WindowsIndex1][0]); ans.push_back(kPoly*ans[0] + bPoly);
}
else { ans.push_back((bWind-bPoly)/(kPoly-kWind)); ans.push_back(kPoly*ans[0] + bPoly);
}
maxPX = Px[PolygonIndex1][0]>Px[PolygonIndex2][0]?Px[PolygonIndex1][0]:Px[PolygonInde x2][0];
minPX = Px[PolygonIndex1][0]<Px[PolygonIndex2][0]?Px[PolygonIndex1][0]:Px[PolygonInde x2][0];
maxPY = Py[PolygonIndex1][0]>Py[PolygonIndex2][0]?Py[PolygonIndex1][0]:Py[PolygonInde x2][0];
minPY = Py[PolygonIndex1][0]<Py[PolygonIndex2][0]?Py[PolygonIndex1][0]:Py[PolygonInde x2][0];
maxWX = Wx[WindowsIndex1][0]>Wx[WindowsIndex2][0]?Wx[WindowsIndex1][0]:Wx[WindowsInde x2][0];
minWX = Wx[WindowsIndex1][0]<Wx[WindowsIndex2][0]?Wx[WindowsIndex1][0]:Wx[WindowsInde x2][0];
maxWY = Wy[WindowsIndex1][0]>Wy[WindowsIndex2][0]?Wy[WindowsIndex1][0]:Wy[WindowsInde x2][0];
minWY = Wy[WindowsIndex1][0]<Wy[WindowsIndex2][0]?Wy[WindowsIndex1][0]:Wy[WindowsInde x2][0];
if(minPX<=ans[0] |
&& ans[0]<=maxPX && |
minWX <= |
ans[0] && ans[0]<=maxWX && |
minPY <= |
ans[1] && ans[1]<=maxPY && |
minWY <= |
ans[1] && ans[1]<=maxWY) |
{ |
|
return ans; |
|
} |
|
else |
|
{ |
|
return {-1000000000,-1000000000};
}
}
}
QVector<double> Paint::pointAngle(int indexWin, int indexPoly1, int indexPoly2)
{
21
double angle = Angle(Px[indexPoly1][0],Py[indexPoly1][0],Wx[indexWin][0],Wy[indexWin][0],Px[ indexPoly2][0],Py[indexPoly2][0]);
return {Wx[indexWin][0],Wy[indexWin][0],angle};
}
double Paint::Angle(double PX1, double PY1, double PX2, double PY2, double PX3, double PY3)
{
//Координаты векторов
QVector<double> Vec21;
QVector<double> Vec23; Vec21.push_back(PX1-PX2); Vec21.push_back(PY1-PY2); Vec23.push_back(PX3-PX2); Vec23.push_back(PY3-PY2); //Длины векторов
double len21 = sqrt(Vec21[0]*Vec21[0]+Vec21[1]*Vec21[1]); double len23 = sqrt(Vec23[0]*Vec23[0]+Vec23[1]*Vec23[1]); //Найдем косинус угла между ними
double cos = (Vec21[0]*Vec23[0]+Vec21[1]*Vec23[1])/(len21*len23); double angle = acos(cos)*180/3.1415;
return angle;
}
QVector<double> Paint::pointAngle2(int indexPoly, int indexWin1, int indexWin2)
{
double angle = Angle(Wx[indexWin1][0],Wy[indexWin1][0],Px[indexPoly][0],Py[indexPoly][0],Wx[ indexWin2][0],Wy[indexWin2][0]);
return {Px[indexPoly][0],Py[indexPoly][0],angle};
}
QVector<QVector<double>> Paint::sortPoints(QVector<QVector<double>> Points)
{
QVector<double> AlreadyIn; QVector<QVector<double>> answer; double min = 10000;
int minIndex = 0; QVector<double> buf;
int size = Points.length(); int j;
for (int i = 0; i < size; i++)
{
buf.clear(); min = 10000;
for (j = i; j<size;j++)
{
//Находимм минимум if(min>Points[j][1])
{
min = Points[j][1]; minIndex = j;
}
}
//Меняем местами j = j - 1;
buf.push_back(Points[minIndex][0]); buf.push_back(Points[minIndex][1]); Points[minIndex] = Points[i]; Points[i] = buf;
}
22
//Выбираем точки с наибольшими y и соединяем их answer.push_back(Points[size-1]); answer.push_back(Points[size-2]); AlreadyIn.push_back(size-1); AlreadyIn.push_back(size-2); while(answer.length()!=Points.length())
{
double angle;
double maxangle = 0; int correctPointIndex;
for (int h = 0; h < Points.length(); h++) //Перебираем оставшиеся
точки
{
if(!AlreadyIn.contains(h))
{
double expX = Points[h][0]; double expY = Points[h][1];
angle = Angle(answer[answer.length()- 2][0],answer[answer.length()-2][1],answer[answer.length()- 1][0],answer[answer.length()-1][1], expX, expY);
if(maxangle<angle)
{
maxangle = angle; correctPointIndex = h;
}
}
}
answer.push_back(Points[correctPointIndex]); AlreadyIn.push_back(correctPointIndex);
}
return answer;
}
23