Rotating Calipers

function dist(p1,p2,p) {

  var A = p.x - p1.x;
  var B = p.y - p1.y;
  var C = p2.x - p1.x;
  var D = p2.y - p1.y;

  var dot = A * C + B * D;
  var len_sq = C * C + D * D;
  var param = -1;
  if (len_sq != 0) //in case of 0 length line
      param = dot / len_sq;

  var xx, yy;

  if (param < 0) {
    xx = p1.x;
    yy = p1.y;
  }
  else if (param > 1) {
    xx = p1.x;
    yy = p1.y;
  }
  else {
    xx = p1.x + param * C;
    yy = p1.y + param * D;
  }

  var dx = p.x - xx;
  var dy = p.y - yy;
  return Math.sqrt(dx * dx + dy * dy);
}

// Rotating Calipers Code

vector<point> p;

int n; // number of points

typedef pair<point,point> pp;

set<pp> antipodes;

int k=1;

while (dist(p[n-1],p[0],p[k+1]) > dist(p[n-1],p[1],p[k])
    ++k;

int i=1;
int j=k;

while (i <= k && j < n) {
  antipodes.add(pp(p[i],p[k]));
  while (dist(p[i],p[i+1],p[j+1]) > dist(p[i],p[i+1],p[j]) && j<m) {
     antipodes.add(pp(p[i],p[j]));
     ++j;
  }
  ++i;
}