Найти точку, которая образует с ломаной максимальный по площади многоугольник

Входные данные: Первая строка: N M. Далее идут N строк, состоящие из координат точек. Первые M строчек - изначальные точки ломаной. Дальше идут коор-ты точек, из которой нужно выбрать искомую.

Пример:

  1. 6 3
  2. -6 -6
  3. -6 6
  4. 6 -6
  5. 0 0
  6. 1 1
  7. 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;
}

Ответы (0 шт):