我试图以面向对象的方式在C ++中找到某些点的凸包。所以,为此,我定义了一个自定义比较函数。但问题是我无法对类函数中的值进行排序。我的问题是在第46行,即find_convex_hull
函数的第3行:
这是我的代码
#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;
}
}
我尝试了this接受的解决方案,所以在第46行我使用了bind函数。但是我收到了很多可怕的错误。我不想让比较函数静态,因此我必须将许多东西改为静态。有没有办法做到这一点?
答案 0 :(得分:-1)
这里的BUG在调用函数sort()中。正如Piotr S.在评论中提到的,我使用了bind(&convex_hull::compare
,它取3个参数而不是bind(&convex_hull::sort_compare
。它为std :: sort提供了2个参数。