Выпуклая оболочка множества точек на плоскости. Функция возвращает вектор всех точек, попавших в оболочку. Этот алгоритм описан в книге Меньшикова в разборе задачи 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; }