# Computing Convex Hulls CLRS 33.3

## Presentation on theme: "Computing Convex Hulls CLRS 33.3"— Presentation transcript:

Computing Convex Hulls CLRS 33.3

Computational Geometry
Studies algorithms for solving geometric problems Applications in many fields Computer graphics Robotics VLSI design Computer-aided design, etc.

Geometric algorithms The input (typically): a description of a set of geometric objects A set of points A set of line segments Vertices of a polygon Etc. We will look at sample problems in two dimensions, that is, in the plane

Convex hulls in two dimensions
What is a convex hull? What is convexity? A subset S of the plane is called convex if and only if for any pair of points p, q in S, the line segment pq is completely contained in S p q p q not convex convex

Convex Hull The convex hull CH(S) of a set s is the smallest convex set that contains S. Consider the problem of computing the convex hull of a finite set P of n points in the plane.

Convex Hull

Convex Hull

Convex Hull Alternative Definition: It is the unique convex polygon whose vertices are points from P and contains all the points of P

Problem Given P, compute a list of points that contains the vertices of CH(P), listed in clockwise (CW) order Expected output:

Brute-Force Solution Consider an edge of the convex hull between vertices p and q Consider the directed line passing through p and q Observe that CH(P) lies to the right of this line q p

Brute-Force Solution Reverse holds too:
If all points in lie to the right of the directed line through p and q, the pq is an edge of CH(P) q p

BruteForce_ConvexHull(P) {
E=empty set for all ordered pairs (p,q) in PxP, and p!= q do { isEdge = true for all points r in P, r!=p and r!=q do if r lies to the left of directed line from p to q isEdge= false if isEdge the add pq to E } from the set of edges in E, construct a list L of vertices of CH(P), in CW order return L

How to test? if r lies to the left of directed line from p to q

Orientation test Given an ordered triple of points <p,q,r> in the plane, we say that they have positive orientation if they define a CCW oriented triangle negative orientation if they define a CW oriented triangle Zero orientation if they are collinear p q r Positive orientation p q r r is to the left of pq

Orientation test Given an ordered triple of points <p,q,r> in the plane, we say that they have positive orientation if they define a CCW oriented triangle negative orientation if they define a CW oriented triangle Zero orientation if they are collinear q q r r p p negative orientation r is to the right of pq

Orientation test Given an ordered triple of points <p,q,r> in the plane, we say that they have positive orientation if they define a CCW oriented triangle negative orientation if they define a CW oriented triangle Zero orientation if they are collinear q q r r p p zero orientation r is on pq

Orientation

How about the last step? Given E, construct the list of vertices of CH(P) in CW order?

How about the last step? Given E, construct the list L of vertices of CH(P) in CW order? Remove an arbitrary edge pq from E, put p and q in L Now find in E the edge with origin q (say qr), remove that edge from E and add r to L Keep doing this until E has only one edge left time to contsruct L why?

Overall, BruteForce takes How many ordered pairs?
n (n-1) For each we compare n-2 other points (r)

Can we do better? A number of algorithms that can compute CH(P) in O(n log n) We will study the Incremental Algorithm Points are added one at a time and the hull is updated at each insertion

Incremental Algorithm
At any intermediate step of the algorithm There is a current hull of points Add point Update the hull Add points in order of increasing x-coordinate To guarantee that the new point is outside the current hull If same x-coordinate, then in increasing order of y

Upper Hull and Lower Hull
We will construct the hull in two pieces: construct upper hull from left to right construct lower hull from right to left

Construction of the Upper Hull

Construction of the Upper Hull
Observation: for a convex polygon, if we walk through the boundary in CW order, we always make a right turn i.e. if we consider any three consecutive points: p, q, r Orient(p,q,r) should be negative How can we use this?

Construction of the Upper Hull
Check whether the last two points on the current hull and make a right turn Left turn

Construction of the Upper Hull
If a left turn, remove the last point from the current hull and try again Left turn

Construction of the Upper Hull
If a left turn, remove the last point from the current hull and try again Left turn

Construction of the Upper Hull
If a left turn, remove the last point from the current hull and try again Left turn

Construction of the Upper Hull
If a right turn, add to the current hull right turn

Construction of the Upper Hull
If a right turn, add to the current hull right turn

Store current hull on a stack U
U.top() returns the last point on the current hull U.second() returns the second to last point on the current hull while ( Orient(U.second(), U.top() ) >= 0) U.push( ) U.pop()

IncrementalConvexHull(P) {
sort points in increasing order of their x-coordinate U.push(p[1]) U.push(p[2]) for i=3 to n do while U.size() >= 2 and orient(U.second(), U.top(), p[i]) >= 0) do U.pop() U.push(p[i]) L.push(p[n]) L.push(p[n-1]) for i=n-2 to 1 do while L.size() >= 2 and Orient(L.second(), L.top(), p[i]) >= 0) do L.pop() L.push(p[i]) Combine U and L into a single list of points in CW direction

Incremental Convex Hull
Running time? Sort: O(n log n) Each point is removed from the stack U at most once: O(n) Each point is entered into the stack U once: O(n) Thus, O(n) for upper hull Similarly O(n) for lower hull Total: O(n log n)