BotByte

Convex Hull

Aug 21st, 2017
127
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.50 KB | None | 0 0
  1. /* Convex Hull */
  2. /* Author : M. A. Rafsan Mazumder */
  3.  
  4. #include <bits/stdc++.h>
  5.  
  6. using namespace std;
  7.  
  8. struct point
  9. {
  10.     int x, y;
  11. };
  12.  
  13. stack<point> S;
  14. point p0;
  15.  
  16. int orientation(point p0, point p1, point p2)
  17. {
  18.     int t = (p2.y - p1.y) * (p1.x - p0.x) - (p1.y - p0.y) * (p2.x - p1.x);
  19.     return t;
  20. }
  21.  
  22. bool comp1(point p1, point p2)
  23. {
  24.     int o = orientation(p0, p1, p2);
  25.     if(o > 0) return true;
  26.     else if(o < 0) return false;
  27.     else {
  28.         int d1 = (p1.x - p0.x) * (p1.x - p0. x) + (p1.y - p0.y) * (p1.y - p0.y);
  29.         int d2 = (p2.x - p0.x) * (p2.x - p0. x) + (p2.y - p0.y) * (p2.y - p0.y);
  30.         if(d1 < d2) return true;
  31.         else return false;
  32.     }
  33. }
  34.  
  35. bool comp2(point p1, point p2)
  36. {
  37.     if(p1.y < p2.y) return true;
  38.     else if(p1.y > p2.y) return false;
  39.     else {
  40.         if(p1.x < p2.x) return true;
  41.         else return false;
  42.     }
  43. }
  44.  
  45. point nextTop(stack<point> S)
  46. {
  47.     S.pop();
  48.     return S.top();
  49. }
  50.  
  51. void convexHull(point p[], int n)
  52. {
  53.     sort(p, p+n, comp2);
  54.     p0 = p[0];
  55.     sort(p, p+n, comp1);
  56.     S.push(p[0]);
  57.     S.push(p[1]);
  58.     S.push(p[2]);
  59.     for(int i=3; i<n; i++){
  60.         while(orientation(nextTop(S), S.top(), p[i]) < 0) S.pop();
  61.         S.push(p[i]);
  62.     }
  63.     while(!S.empty()){
  64.         cout << S.top().x << " " << S.top().y << endl;
  65.         S.pop();
  66.     }
  67. }
  68.  
  69. int main()
  70. {
  71.     int n;
  72.     scanf("%d", &n);
  73.     point p[n];
  74.     for(int i=0; i<n; i++) scanf("%d %d", &p[i].x, &p[i].y);
  75.     convexHull(p, n);
  76. }
Advertisement
Add Comment
Please, Sign In to add comment