Lecture 5: DCEL's and Subdivision Intersection
(Tuesday, Jan 20).
Reading: Chapter 2 in the 4M's.

Topological Information: In most applications of segment intersection
problems, we are not in terested in just a listing of the segment
intersections, but want to know how the segments are connected
together. Typically, the plane has been subdivided into regions, and
we want to store these regions in a way that allows us to reason about
their properties efficiently.  This leads to the concept of a planar
straight line graph (PSLG) or planar subdivision (or what might be
called a cell complex in topology). A PSLG is a graph embedded in the
plane with straight line edges so that no two edges intersect, except
possibly at their endpoints. (The condition that the edges be straight
line segments may be relaxed to allow curved segments, but we will
assume line segments here.) Such a graph naturally subdivides the
plane into regions.  The 0 dimensional vertices, 1 dimensional edges,
and 2 dimensional faces. We consider these three types of objects to
be disjoint, implying each edge is topologically open (it does not
include it endpoints) and that each face is open (it does not include
its boundary). There is always one unbounded face, that stretches to
infinity. Note that the underlying planar graph need not be a
connected graph. In particular, faces may contain holes (and these
holes may contain other holes.


Figure 19: Planar straight line subdivision.

Planar subdivisions will form the basic objects of many different
structures that we will discuss later this semester (triangulations
and Voronoi diagrams in particular) so this is a good time to consider
them in greater detail. The first question is how should we represent
such structures so that they are easy to manipulate and reason
about. For example, at a minimum we would like to be able to list the
edges that bound each face of the subdivision in cyclic order, and we
would like to be able to list the edges that surround each vertex.

Planar graphs: There are a number of important facts about planar
graphs that we should discuss.  Generally speaking, an (undirected)
graph is just a finite set of vertices, and collection of unordered
pairs of distinct vertices called edges. A graph is planar if it can
be drawn in the plane (the edges need not be straight lines) so that
no two distinct edges cross each other. An embedding of a planar graph
is any such drawing. In fact, in specifying an embedding it is
sufficient just to specify the counterclockwise cyclic list of the
edges that are incident to each vertex. Since we are interested in
geometric graphs, our embeddings will contain complete geometric
information (coordinates of vertices in particular).  There is an
important relationship between the number of vertices, edges, and
faces in a planar graph (or more generally an embedding of any graph
on a topological 2 manifold, but we will stick to the plane). Let V
denote the number of vertices, E the number of edgs, F the number of
faces in a connected planar graph.

Euler's formula states that
V - E + F = 2:

If we allow the graph to be disconnected, and let C denote the number
of connected compo nents, then we have the more general formula

V - E + F - C = 1:

In our example above we have V = 13, E = 12, F = 4 and C = 4, which
clearly satisfies this formula. An important fact about planar graphs
follows from this.

Theorem: A planar graph with V vertices has at most 3(V - 2) edges and
at most 2(V - 2) faces.

Proof: We assume (as is typical for graphs) that there are no multiple
edges between the same pair of vertices and no self loop edges.  We
begin by triangulating the graph. For each face that is bounded by
more than three edges (or whose boundary is not connected) we
repeatedly insert new edges until every face in the graph is bounded
by exactly three edges. An example is shown in the figure below in
which the original graph edges are shown as solid lines.


Figure 20: Triangulating a planar graph.

Let E' >= E and F' >= F denote the number edges and faces in the
modified graph.  The resulting graph has the property that it has one
connected component, every face is bounded by exactly three edges, and
each edge has a different face on either side of it.  (The last claim
may involve a little thought.)  If we count the number of faces and
multiply by 3, then every edge will be counted exactly twice, once by
the face on either side of the edge. Thus, 3F' = 2E' , that is E' =
3F' =2.

Euler's formula states that V + E' - F' = 2, and hence
V - 3F'/2 + F' = 2, so  F <= F' = 2(V - 2);
and using the fact that F' = 2E' / 3 we have
V - E' + 2E'/3 = 2, so  E <= E' = 3(V - 2):
This completes the proof.

There are a number of reasonable representations that are used in
practice. The most widely used on is the winged edge data
structure. Unfortunately, it is probably also the messiest.  There is
another called the quad edge data structure which is quite elegant,
and has the nice property of being self dual. (We will discuss duality
later in the semester.) We discuss a simple and relatively elegant
data structure called a doubly connected edge list (or DCEL).

Doubly connected Edge List: Like most representations for PSLGs, the
DCEL is an edge based representation, but vertex and face information
is also included for whatever geometric application is using the data
structure. There are three sets of records one for each element in the
PSLG: vertex records, a edge records, and face records. For the
purposes of unambiguously defining left and right, each undirected
edge is represented by two directed half edges.

We will make a simplifying assumption that faces do not have holes
inside of them. This assumption can be satisfied by introducing some
number of dummy edges joining each hole either to the outer boundary
of the face, or to some other hole that has been connected to the
outer boundary in this way. With this assumption, it may be assumed
that the edges bounding each face form a single cyclic list.

Vertex: Each vertex stores its coordinates, along with a pointer to
any incident directed edgethat has this vertex as its origin, v.inc
edge.  

Edge: Each undirected edge is represented as two directed edges. Each
edge has a pointer to the oppositely directed edge, called its
twin. Each directed edge has an origin and destination vertex. Each
directed edge is associate with two faces, one to its left and one to
its right.

We store a pointer to the origin vertex e.org. (We do not need to
define the destination, e.dest, since it may be defined to be
e.twin.org.)  We store a pointer to the face to the left of the edge
e.left (we can access the face to the right from the twin edge). This
is called the incident face. We also store the next and previous
directed edges in counterclockwise order about the incident face,
e.next and e.prev, respectively.


Face: Each face f stores a pointer to a single edge for which this
face is the incident face, f.inc edge. (See the text for the more
general case of dealing with holes.)  The figure shows two ways of
visualizing the DCEL. One is in terms of a collection of doubled up
directed edges. An alternative way of viewing the data structure that
gives a better sense of the connectivity structure is based on
covering each edge with a two element block, one for e and the other
for its twin. The next and prev pointers provide links around each
face of the polygon. The next pointers are directed counterclockwise
around each face and the prev pointers are directed clockwise.  Of
course, in addition the data structure may be enhanced with whatever
application data is relevant. 

In some applications, it is not necessary to know either the face or
vertex information (or both) at all, and if so these records may be
deleted. See the book for a complete example.


Figure 21: Doubly connected edge list.

Merging subdivisions: Let us return to the applications problem that
lead to the segment inter section problem. Suppose that we have two
planar subdivisions, S 1 and S 2 , and we want to compute their
overlay. In particular, this is a subdivision whose vertices are the
union of the vertices of each subdivision and the points of
intersection of the line segments in the subdivision. (Because we
assume that each subdivision is a planar graph, the only new vertices
that could arise will arise from the intersection of two edges, one
from S 1 and the other from S 2 .)  Suppose that each subdivision is
represented using a DCEL. Can we adapt the plane sweep algorithm to
generate the DCEL of the overlaid subdivision?


The answer is yes. The algorithm will destroy the original
subdivisions, so it may be desirable to copy them before beginning
this process. The first part of the process is straightforward, but
perhaps a little tedious. This part consists of building the edge and
vertex records for the new subdivision. The second part involves
building the face records. It is more complicated because it is
generally not possible to know the face structure at the moment that
the sweep is advancing, without looking ``into the future'' of the
sweep to see whether regions will merge.  (You might try to convince
yourself of this.) The entire subdivision is built first, and then the
face information is constructed and added later. We will skip the part
of updating the face information (see the text).

For the first part, the most illustrative case arises when the sweep
is processing an intersection event. In this case the two segments
arise as two edges a 1 and b 1 from the two subdivisions.  We will
assume that we select the half edges that are directed from left to
right across the sweep line. The process is described below (and is
illustrated in the figure below).

It makes use of two auxiliary procedures. 

Split(a 1 ; a 2 ) splits an edge a 1 at its midpoint into two
consecutive edges a 1 followed by a 2 , and links a 2 into the
structure.

Splice(a 1 ; a 2 ; b 1 ; b 2 ) takes two such split edges and links
them all together.

Merge two edges into a common subdivision
Merge(a1 ; b1 ) :

(1) Create a new vertex v at the intersection point.

(2) Split each of the two intersecting edges, by adding a vertex at
the common intersection point. Let a2 and b2 be the new edge
pieces. They are created by the calls a2 = Split(a1 ) and b2 =
Split(b1 ) given below.

(3) Link the four edges together by invoking Splice(a1 ; a2 ; b1 ; b2),
given below.  The splitting procedure creates the new edge, links
it into place. After this the edges have been split, but they are not
linked to each other. The edge constructor is given the origin and
destination of the new edge and creates a new edge and its twin. The
procedure below initializes all the other fields. Also note that the
destination of a 1 , that is the origin of a 1 's twin must be
updated, which we have omitted. The splice procedure interlinks four
edges around a common vertex in the counterclockwise order a 1
(entering), b 1 (entering), a 2 (leaving), b 2 (leaving).


Split an edge into two edges
Split(edge &a1, edge &a2) -- // a2 is returned
a2 = new edge(v, a1.dest()); // create edge (v,a1.dest)
a2.next = a1.next; a1.next.prev = a2;
a1.next = a2; a2.prev = a1;
a1t = a1.twin; a2t = a2.twin; // the twins
a2t.prev = a1t.prev; a1t.prev.next = a2t;
a1t.prev = a2t; a2t.next = a1t;

Splice four edges together
Splice(edge &a1, edge &a2, edge &b1, edge &b2) --
a1t = a1.twin; a2t = a2.twin; // get the twins
b1t = b1.twin; b2t = b2.twin;
a1.next = b2; b2.prev = a1; // link the edges together
b2t.next = a2; a2.prev = b2t;
a2t.next = b1t; b1t.prev = a2t;
b1.next = a1t; a1t.prev = b1;



Figure 22: Updating the DCEL.


This course is modeled on the Computational Geometry Course taught by Dave Mount, at the University of Maryland. These notes are modifications of his Lecture Notes, which are copyrighted as follows: Copyright, David M. Mount, 2000, Dept. of Computer Science, University of Maryland, College Park, MD, 20742. These lecture notes were prepared by David Mount for the course CMSC 754, Computational Geometry, at the University of Maryland, College Park. Permission to use, copy, modify, and distribute these notes for educational purposes and without fee is hereby granted, provided that this copyright notice appear in all copies.