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

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

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

ans.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