Я пытаюсь найти выпуклую оболочку некоторых точек в C++ объектно-ориентированным способом. Итак, для этого я определил пользовательскую функцию сравнения. Но дело в том, что я не могу сортировать значения внутри функции класса. Моя проблема заключается в строке 46, которая является строкой 3 в функции find_convex_hull
: Здесь мой код
#include <iostream>
#include <bits/stdc++.h>
#define x first
#define y second
using namespace std;
typedef pair<int,int> ii;
class convex_hull{
enum point_compare {greater,smaller,equal};
vector<ii> points;
vector<ii> convexHull;
ii p0;
public:
convex_hull(vector<ii> init)
{
sort(init.begin(),init.end());
points = init;
p0 = init[0];
}
int cross_product(ii p1,ii p2,ii p0)
{
return ((p1.x-p0.x)*(p2.y-p0.y))-((p1.y-p0.y)*(p2.x-p0.x));
}
point_compare compare(ii p1,ii p2,ii p0)
{
int d = cross_product(p1,p2,p0);
if(d>0)
return smaller;
else if(d<0)
return greater;
else
return equal;
}
bool sort_compare(ii p1,ii p2)
{
point_compare x = compare(p1,p2,p0);
if(x == smaller)
return true;
else if(x == equal)
return p1<p2;
return false;
}
stack<ii> find_convex_hull()
{
vector<ii> polar_sorted = points;
sort(polar_sorted.begin()+1,polar_sorted.end(),bind(&convex_hull::compare,this,placeholders::_1,placeholders::_2));
stack<ii> res;
res.push(p0);
res.push(polar_sorted[1]);
res.push(polar_sorted[2]);
for(int i=3;i<polar_sorted.size();++i)
{
ii _y = res.top(); res.pop();
ii _x = res.top();
ii _z = polar_sorted[i];
if(compare(_y,_z,_x) != greater)
res.push(_y);
res.push(_z);
}
return res;
}
};
int main()
{
vector<ii> points({{0, 3}, {1, 1}, {2, 2}, {4, 4},
{0, 0}, {1, 2}, {3, 1}, {3, 3}});
convex_hull A(points);
stack<ii> res = A.find_convex_hull();
while(!res.empty())
{
ii x = res.top();
res.pop();
cout<<x.x<<" "<<x.y<<endl;
}
}
Я попробовал это принятое решение, поэтому в строке 46 я использовал функцию bind. Но я получаю много ужасных ошибок. Я не хочу, чтобы статическая причина была функцией сравнения, тогда мне нужно изменить многие вещи на статические. Есть ли способ сделать это?
Здесь BUG находится в вызывающей функции sort(). Как упоминал Петр С. в комментариях, я использовал bind(&convex_hull::compare
который принимает 3 аргумента вместо bind(&convex_hull::sort_compare
который принимает 2 аргумента для std :: sort.
point_compare compare(ii p1,ii p2,ii p0)
принимает три аргумента, тогда как std :: sort ожидаетbinary predicate
. Выbind(&convex_hull::sort_compare
виду использоватьbind(&convex_hull::sort_compare
вместоbind(&convex_hull::compare
?