Выпуклая оболочка множества точек на плоскости. Функция возвращает вектор всех точек, попавших в оболочку. Этот алгоритм описан в книге Меньшикова в разборе задачи 5D.
struct Point{
double x, y;
bool operator < (const Point& p){
return y<p.y || (y==p.y && x<p.x);
}
};
vector <Point> convexHull (vector<Point>& arr){
int start=0;
if(arr.size()<3)
return vector<Point>();
vector<Point> conv;
int end=0;
for (int i=1; i<arr.size(); ++i){
if(arr[i] < arr[start]){
start = i;
}
}
int p=start;
double dx=1.0;
double dy=0;
conv.push_back(arr[start]);
do{
double coss = -2.0;
double len = 0;
int next = -1;
for (int i=0; i<arr.length; ++i){
double sp = dx*(arr[i].x-arr[p].x) + dy*(arr[i].y-arr[p].y);
double leng = sqrt((arr[i].x-arr[p].x)*(arr[i].x-arr[p].x)+(arr[i].y-arr[p].y)*(arr[i].y-arr[p].y));
if(leng>1e-8){
double ccos=sp/leng;
if(ccos>coss){
next=i;
coss=ccos;
len=leng;
}
}
}
if(next==-1)
return vector<Point>();
conv.push_back(arr[next]);
dx=(arr[next].x-arr[p].x)/len;
dy=(arr[next].y-arr[p].y)/len;
p=next;
}while(p!=start);
return conv;
}