Convex Hull | Monotone chain algorithm - GeeksforGeeks

27 Jul, 2021
Given a set of points, the task is to find the convex hull of the given points. The convex hull is the smallest convex polygon that contains all the points. Please check this article first: Convex Hull | Set 1 (Jarvis’s Algorithm or Wrapping)  
Examples:
Input: Points[] = {{0, 3}, {2, 2}, {1, 1}, {2, 1}, {3, 0}, {0, 0}, {3, 3}} Output: (0, 0) (3, 0) (3, 3) (0, 3)  
 
Approach: Monotone chain algorithm constructs the convex hull in O(n * log(n)) time. We have to sort the points first and then calculate the upper and lower hulls in O(n) time. The points will be sorted with respect to x-coordinates (with respect to y-coordinates in case of a tie in x-coordinates), we will then find the left most point and then try to rotate in clockwise direction and find the next point and then repeat the step until we reach the rightmost point and then again rotate in the the clockwise direction and find the lower hull.Below is the implementation of the above approach: 
CPP
// C++ implementation of the approach#include <bits/stdc++.h>#define llu long long intusing namespace std;  struct Point {      llu x, y;      bool operator<(Point p)    {        return x < p.x || (x == p.x && y < p.y);    }};  // Cross product of two vectors OA and OB// returns positive for counter clockwise// turn and negative for clockwise turnllu cross_product(Point O, Point A, Point B){    return (A.x - O.x) * (B.y - O.y)           - (A.y - O.y) * (B.x - O.x);}  // Returns a list of points on the convex hull// in counter-clockwise ordervector<Point> convex_hull(vector<Point> A){    int n = A.size(), k = 0;      if (n <= 3)        return A;      vector<Point> ans(2 * n);      // Sort points lexicographically    sort(A.begin(), A.end());      // Build lower hull    for (int i = 0; i < n; ++i) {          // If the point at K-1 position is not a part        // of hull as vector from ans[k-2] to ans[k-1]         // and ans[k-2] to A[i] has a clockwise turn        while (k >= 2 && cross_product(ans[k - 2],                           ans[k - 1], A[i]) <= 0)            k--;        ans[k++] = A[i];    }      // Build upper hull    for (size_t i = n - 1, t = k + 1; i > 0; --i) {          // If the point at K-1 position is not a part        // of hull as vector from ans[k-2] to ans[k-1]         // and ans[k-2] to A[i] has a clockwise turn        while (k >= t && cross_product(ans[k - 2],                           ans[k - 1], A[i - 1]) <= 0)            k--;        ans[k++] = A[i - 1];    }      // Resize the array to desired size    ans.resize(k - 1);      return ans;}  // Driver codeint main(){    vector<Point> points;      // Add points    points.push_back({ 0, 3 });    points.push_back({ 2, 2 });    points.push_back({ 1, 1 });    points.push_back({ 2, 1 });    points.push_back({ 3, 0 });    points.push_back({ 0, 0 });    points.push_back({ 3, 3 });      // Find the convex hull    vector<Point> ans = convex_hull(points);      // Print the convex hull    for (int i = 0; i < ans.size(); i++)        cout << "(" << ans[i].x << ", "              << ans[i].y << ")" << endl;      return 0;}
(0, 0)
(3, 0)
(3, 3)
(0, 3)
 
surinderdawra388
Competitive Programming
Geometric
Sorting
Sorting
Geometric
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
Multistage Graph (Shortest Path)
Breadth First Traversal ( BFS ) on a 2D array
Difference between Backtracking and Branch-N-Bound technique
5 Best Languages for Competitive Programming
Minimum changes required to make all Array elements Prime
How to check if a given point lies inside or outside a polygon?
Closest Pair of Points using Divide and Conquer algorithm
Program for distance between two points on earth
How to check if two given line segments intersect?
Convex Hull | Set 1 (Jarvis's Algorithm or Wrapping)