Divide and Conquer - The Algorithm and It's Dual



Algorithm Outline
The algorithm for computing the upper and lower convex hull for a set of points dualizes to computing the lower and upper envelope for a set of lines (an arrangement).

The difficulty consists in dualizing the merging alghorithm, so that it will allow the user to obtain an O(n) time.
# Primal Dual
1
Sort the points by x coordinate

Sort the lines by their slope
2
Divide the points into 2 sets, A and B,
A containing the left [n/2] points, 
and B the right [n/2] points. 

Divide the lines into 2 sets, A and B, 
A containing the lines with the first 
half of smallest slopes, and B the 
right [n/2] slopes.
3
Compute the CH H(A) and H(B) recursively.

Compute the upper/lower envelopes of the 
2 sets, E(A) and E(B) recursively. 
4
Merge H(A) and H(B).


Merge E(A) and E(B).

 
We can compute only the upper CH, 
that is the set of lines obtained by 
joining the points on the hull that have all the 
other points below them, and then apply the 
same algorithm for the lower one 
(the only change will be that the set of points 
will have the others above 
them). 


We can compute only the lower envelope, 
that is the set of points obtained
 by intersecting the lines on the 
envelope, that have all the 
other lines above them, and then apply 
the same algorithm for the upper one 
(the only change will be that the set 
of points will have the lines below 
them). 

For one point x, CH is that point.
For one line D(x), the upper envelope is the half plane above it, and the lower one is the half plane below it.

For the upper CH, the goal is to find a tangent line that contains all the points below (and two of them on it).

For the lower envelope, the goal is to find the point of intersection so that the point is below all the lines in the envelope (and on two of them).

We let the upper tangent be T=ab, where a and b are the rightmost and leftmost respectively points on A and B. Then we "walk" it upwards till we find the tangent (the line with all the points on or below). Sometimes, we will have to change the fixed point to a point from the other CH (a <- b or b <- a , depending on which one was fixed before).

We let the point D(T) be the intersection of D(a) and D(b), the lines with the greatest/smallest slope in their envelopes. Then we walk on the lines downwards until we find D(T) the dual of the tangent, i.e. the point that has all the other lines above. Sometimes, we will have to change the fixed line we were walking on to a line from the other envelope (in the order of their slopes).
  Repeat for the lower CH. Repeat for the upper envelope.