Convex Hull Example in Data Structures

Here we will see one example on convex hull. Suppose we have a set of points. We have to make a polygon by taking less amount of points, that will cover all given points. In this section we will see the Jarvis March algorithm to get the convex hull.

Jarvis March algorithm is used to detect the corner points of a convex hull from a given set of data points.

Starting from left most point of the data set, we keep the points in the convex hull by anti-clockwise rotation. From a current point, we can choose the next point by checking the orientations of those points from current point. When the angle is largest, the point is chosen. After completing all points, when the next point is the start point, stop the algorithm.

Input − Set of points: {(-7,8), (-4,6), (2,6), (6,4), (8,6), (7,-2), (4,-6), (8,-7),(0,0), (3,-2),(6,-10),(0,-6),(-9,-5),(-8,-2),(-8,0),(-10,3),(-2,2),(-10,4)}

Output − Boundary points of convex hull are −

(-9, -5) (6, -10) (8, -7) (8, 6) (-7, 8) (-10, 4) (-10, 3)


findConvexHull(points, n)
Input: The points, number of points.
Output: Corner points of convex hull.
   start := points[0]
   for each point i, do
      if points[i].x < start.x, then // get the left most point
         start := points[i]
   current := start
   add start point to the result set.
   define colPts set to store collinear points
   while true, do //start an infinite loop
      next := points[i]
      for all points i except 0th point, do
         if points[i] = current, then
            skip the next part, go for next iteration
         val := cross product of current, next, points[i]
         if val > 0, then
            next := points[i]
            clear the colPts array
         else if cal = 0, then
            if next is closer to current than points[i], then
               add next in the colPts
               next := points[i]
               add points[i] in the colPts
      add all items in the colPts into the result
      if next = start, then
         break the loop
      insert next into the result
      current := next
   return result


 Live Demo

using namespace std;
struct point{ //define points for 2d plane
   int x, y;
   bool operator==(point p2){
      if(x == p2.x && y == p2.y)
         return 1;
      return 0;
   bool operator<(const point &p2)const{ //dummy compare function used to sort in set
      return true;
int crossProduct(point a, point b, point c){ //finds the place of c from ab vector
   int y1 = a.y - b.y;
   int y2 = a.y - c.y;
   int x1 = a.x - b.x;
   int x2 = a.x - c.x;
   return y2*x1 - y1*x2; //if result < 0, c in the left, > 0, c in the right, = 0, a,b,c are collinear
int distance(point a, point b, point c){
   int y1 = a.y - b.y;
   int y2 = a.y - c.y;
   int x1 = a.x - b.x;
   int x2 = a.x - c.x;
   int item1 = (y1*y1 + x1*x1);
   int item2 = (y2*y2 + x2*x2);
   if(item1 == item2)
      return 0; //when b and c are in same distance from a
   else if(item1 < item2)
      return -1; //when b is closer to a
   return 1; //when c is closer to a
set<point> findConvexHull(point points[], int n){
   point start = points[0];
   for(int i = 1; i<n; i++){ //find the left most point for starting
      if(points[i].x < start.x)
         start = points[i];
   point current = start;
   set<point> result; //set is used to avoid entry of duplicate points
   vector<point> *collinearPoints = new vector<point>;
      point nextTarget = points[0];
      for(int i = 1; i<n; i++){
         if(points[i] == current) //when selected point is current point, ignore rest part
         int val = crossProduct(current, nextTarget, points[i]);
         if(val > 0){ //when ith point is on the left side
            nextTarget = points[i];
            collinearPoints = new vector<point>; //reset collinear points
         }else if(val == 0){ //if three points are collinear
            if(distance(current, nextTarget, points[i]) < 0){ //add closer one to collinear list
               nextTarget = points[i];
               collinearPoints->push_back(points[i]); //when ith point is closer or same as nextTarget
      vector<point>::iterator it;
      for(it = collinearPoints->begin(); it != collinearPoints->end(); it++){
         result.insert(*it); //add allpoints in collinear points to result set
      if(nextTarget == start) //when next point is start it means, the area covered
      current = nextTarget;
   return result;
int main(){
   point points[] = {
      int n = 18;
      set<point> result;
      result = findConvexHull(points, n);
      cout << "Boundary points of convex hull are: "<<endl;
      set<point>::iterator it;
      for(it = result.begin(); it!=result.end(); it++)
         cout << "(" << it->x << ", " <<it->y <<") ";


Boundary points of convex hull are:
(-9, -5) (6, -10) (8, -7) (8, 6) (-7, 8) (-10, 4) (-10, 3)

Updated on: 27-Aug-2019

2K+ Views

Kickstart Your Career

Get certified by completing the course

Get Started