Wednesday, July 31, 2019

[Template] Convex Hull


  1. struct Point {  
  2.       int x, y;  
  3.       Point(int x = 0, int y = 0)  
  4.             : x(x), y(y) {}  
  5. };  
  6.   
  7. bool cmp(Point a, Point b) {  
  8.       return a.x < b.x || (a.x == b.x && a.y < b.y);  
  9. }  
  10.   
  11. bool cw(Point a, Point b, Point c) {  
  12.       return a.x * (b.y - c.y) + b.x * (c.y - a.y) + c.x * (a.y - b.y) < 0;  
  13. }  
  14.   
  15. bool ccw(Point a, Point b, Point c) {  
  16.     return a.x * (b.y - c.y) + b.x * (c.y - a.y) + c.x * (a.y - b.y) > 0;  
  17. }  
  18.   
  19. vector <Point> convex_hull(vector <Point>& a) {  
  20.       if (a.size() == 1) {  
  21.             return {};  
  22.       }  
  23.       sort(a.begin(), a.end(), &cmp);  
  24.       Point p1 = a[0];  
  25.       Point p2 = a.back();  
  26.       vector <Point> up;  
  27.       vector <Point> down;  
  28.       up.push_back(p1);  
  29.       down.push_back(p1);  
  30.       for (int i = 1; i < (int)a.size(); i++) {  
  31.             if (i == a.size() - 1 || cw(p1, a[i], p2)) {  
  32.                   while (up.size() >= 2 && !cw(up[up.size()-2], up[up.size()-1], a[i])) {  
  33.                         up.pop_back();  
  34.                   }  
  35.                   up.push_back(a[i]);  
  36.             }  
  37.             if (i == a.size() - 1 || ccw(p1, a[i], p2)) {  
  38.                   while(down.size() >= 2 && !ccw(down[down.size()-2], down[down.size()-1], a[i])) {  
  39.                         down.pop_back();  
  40.                   }  
  41.                   down.push_back(a[i]);  
  42.             }  
  43.       }  
  44.       vector <Point> hull;  
  45.       for (int i = 0; i < (int)up.size(); i++) {  
  46.             hull.push_back(up[i]);  
  47.       }  
  48.       for (int i = down.size() - 2; i > 0; i--) {  
  49.             hull.push_back(down[i]);  
  50.       }  
  51.       return hull;  
  52. }  

No comments:

Post a Comment

Note: Only a member of this blog may post a comment.