Найти точку, которая образует с ломаной максимальный по площади многоугольник
Входные данные: Первая строка: N M. Далее идут N строк, состоящие из координат точек. Первые M строчек - изначальные точки ломаной. Дальше идут коор-ты точек, из которой нужно выбрать искомую.
Пример:
- 6 3
- -6 -6
- -6 6
- 6 -6
- 0 0
- 1 1
- 6 6
Вывод: 144.0
Что я сделал: В входных данных есть точки, с которыми образуются невыпуклые многоугольники, по условию задачи такие нужно фильтровать, что я и попытался сделать в функции bool check, однако при выполнении программы ни одна из точек не проходит мой фильтр. Для проверки выпуклости использовал факт, заключающийся в том, что при обходе по часовой стрелке все повороты между ребрами будут одного знака (взял отсюда https://ru.stackoverflow.com/questions/745141/Определение-выпуклости-многоугольника). После отбора потенциальных точек, я вычислял площадь многоугольника, и если таких несколько, то выбирал из них максимальную, но до этого не доходит, т.к ни одна из точек не появляется в векторе praviln. Прошу помочь с поиском проблемы.
Сама программа
class Point{
public:
int x, y;
Point(){}
Point(int x, int y): x{x}, y{y} {}
friend istream& operator>>(istream& stream, Point& v);
friend ostream& operator<<(ostream&, Point v);
};
istream& operator>>(istream& stream, Point& v){ cin >> v.x >> v.y; return stream; }
ostream& operator<<(ostream&, Point v){ cout << v.x << ' ' << v.y; }
bool poloz(double res){
if(res>0) return true;
return false;
}
bool check(vector<Point> p){
vector<double> results;
Point po(p[0].x, p[0].y); //копирую начальную точку в конец, чтобы зациклить вектор(нужно для проверки последней и первой точки)
p.push_back(po);
int n{p.size()};
for(int i=0; i<p.size(); i++){
Point ab((p[i].x - p[(i-1+n)%n].x), (p[i].y - p[(i-1+n)%n].y)),
bc((p[(i+1)%n].x-p[i].x),(p[(i+1)%n].y-p[i].y));
double res=ab.x*bc.y-ab.y*bc.x;
if(res){
results.push_back(res);
}
}
p.pop_back();
if(all_of(results.begin(), results.end(), poloz)){ //проверка на то, что поворот между вершинами всегда идет в одну сторону(определение выпуклости)
return true;
}
return false;
}
double find_sqr(vector<Point> p){
double res{0};
Point po(p[0].x, p[0].y);
p.push_back(po);
int n{p.size()};
for(int i=0; i<p.size(); i++){
res+=(p[(i-1+n)%n].x*p[i].y - p[(i-1+n)%n].y*p[i].x);
}
p.pop_back();
return res/2.0;
}
int main(){
int n, m;
cin >> n >> m;
//надо проверить все точки на выпуклость, если прямоугольник с новой точкой выпуклый, значит что дальше можно считать его площадь
vector<Point> lom(m), dop(n-m), praviln;
vector<double> sqrs;
for(int i=0; i<lom.size();i++){
cin >> lom[i];
}
for(int i=0; i<dop.size();i++){
cin >> dop[i];
lom.push_back(dop[i]);
if(check(lom)){
praviln.push_back(dop[i]);
}
lom.pop_back();
} //вычисление площади
for(int i=0; i<praviln.size();i++){
lom.push_back(praviln[i]);
sqrs.push_back(find_sqr(lom));
lom.pop_back();
}
cout << *max_element(sqrs.begin(), sqrs.end());
return 0;
}