0% found this document useful (0 votes)
104 views52 pages

Ch.3 Art Gallery Problem & Triangulating Polygons

This document discusses the art gallery problem and triangulating polygons. It begins by introducing the art gallery problem of determining the minimum number of cameras needed to surveil an art gallery modeled as a simple polygon. It then proves that every simple polygon can be triangulated, or decomposed into triangles, and that the number of triangles equals n-2, where n is the number of vertices. This allows surveilling the gallery with n-2 cameras, one in each triangle. However, it shows this is an overestimate and presents an algorithm using graph coloring to show only floor(n/3) cameras are needed. The document then discusses a sweep line algorithm that can triangulate a monotone polygon in linear time
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
104 views52 pages

Ch.3 Art Gallery Problem & Triangulating Polygons

This document discusses the art gallery problem and triangulating polygons. It begins by introducing the art gallery problem of determining the minimum number of cameras needed to surveil an art gallery modeled as a simple polygon. It then proves that every simple polygon can be triangulated, or decomposed into triangles, and that the number of triangles equals n-2, where n is the number of vertices. This allows surveilling the gallery with n-2 cameras, one in each triangle. However, it shows this is an overestimate and presents an algorithm using graph coloring to show only floor(n/3) cameras are needed. The document then discusses a sweep line algorithm that can triangulate a monotone polygon in linear time
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 52

Ch.

3 Art Gallery Problem &


Triangulating Polygons

Art Gallery Problem


!

Problem : Want to place


cameras so that entire
gallery can be viewed

How many cameras do


we need to guard a
given gallery?
How do we decide
where to place them?

!
paintings

Floor plan of 1 floor

Assumptions/Definitions
!Floor

plan of gallery is a simple polygon

( i.e., a region enclosed by a single closed polygon


chain that does not intersect itself. So no holes in
gallery. )
!Camera

corresponds to point light source in polygon

a camera sees all point in the polygon that can be


connected to it by an open segment that lies in interior
of polygon.

Assumptions/Definitions
!Number

of cameras depends on particular polygon

a convex polygon can be guarded with one camera


the problem of finding minimum number of
cameras for a specific polygon is NP-Hard problem
Well look at worst-case, that is how many
cameras are needed to guard a simple-polygon
with n vertices in the worst-case

!Let

P be a simple polygon with n vertices

Approach: Well decompose P into piece that can be


guarded with one camera
-- convex pieces would do the trick
-- well go all the way and decompose P into triangles
( ok for our worst-case scenario )
!Def

: A diagonal of a simple polygon P is an open


line segment connecting tow vertices of P that lies in
the interior of P.

!Def

: A triangulation of a simple polygon P is a


decomposition of P into triangles by a maximal set of
non-intersecting diagonals. ( a maximal set ensures no
triangle has a vertex in its interior )

-- triangulation #1
-- triangulation #2

triangulations generally
not unique

So what ?
Can we guard a polygon by placing a camera in every
triangle? (actually overkill, but well come back to this later)

Questions :
1.

Does a triangulation always exist?

2.

How many triangles can there be in the


triangulation?

Theorem 3.1
Every simple polygon has a triangulations. Every triangulation
of an n-vertex simple polygon has exactly n-2 triangles.

Proof
By induction on n, number of vertices of polygon P.
basis : n=3 P is a triangle and n-2 = 3-2 = 1
inductive hypothesis : every polygon with n < n vertices
has a triangulation with exactly n-2 triangles.
inductive step :
Let P be a polygon with n vertices

We

first argue P has a diagonal ( & can be triangulated )

this will break P into two subpolygons, each with <n vertices
let v be leftmost vertes in P (lowest if tie) and let u & w be
vertices adjecent to v on Ps boundary
Case 1 open segment uw lies in interior of P ( & is a diagonal )

uw is a diagonal

Case 2 open segment uw intersects boundary of P ( & is


not diagonal )
there is at least one vertex of P on uw or inside
(u,v,w)
let v be the farthest from uw of thest vertices
v v cannot intersect any edge of P because that edge
would have vertex farther from uw (contradicting choice of
v )
v v is a diagonal

always has a diagonal

-- cuts P into P1 + P2 with m1 < n & m2 < n vertices,


-- so, by induction, P1 + P2 can be triangulated, so can P
Now show triangulation of P has n-2 triangles
Let Tp be triangulation of P and let d be any diagonal of
Tp, which breaks P into P1 & P2

n = 11
m1 = 7
m2 = 6

D cuts P into P1 + P2 with m1 < n & m2 < n vertices,


m1+m2 = n+2 ( diagonals vertices appear in P1 & P2 )
by induciton: triangulation of P1 has m1-2 triangles
P2 has m2-2 triangles
So, triangulation of P has (m1-2)+ (m2-2) = m1+m2-4 =
n+2-4 = n-2 triangles.

Any polygon can be guarded by n-2 cameras


seems overkill
camera on diagonal sees both adjacent triangles
n/2 cameras?
camera at vertex sees all incident triangles
? Cameras?
Idea : Select a subset of vertices of P so that every
triangle in Tp has at least one selected vertex
(
place cameras at vertices )
Def : A coloring of a graph is an assignment of colors to the
vertices so that the endpoints of every edge have different
colors.

We want a 3-coloring of Tp
That is, a coloring of Tp with 3 colors.
every triangle will have a red,blue & green vertex
place cameras at, say, every red vertex (all triangles
visible) choose smallest color class & well need at most
n/3 cameras
Does a 3-coloring of Tp always exist ?
YES
Consider dual graph of Tp, G(Tp)
-- has vertex for every Tp ( v = node
in G(Tp), (v) = in Tp
-- edge (v,w) G(Tp) (v) & (w) share
diagonal in Tp
( so, every edge in G(Tp) corresponds to
diagonals in Tp )

Key observation: G(Tp) is a tree ( no cycles! )


Diagonals cut Tp in two so the removal of edge in G(Tp)
disconnects it ( every edge is a cut edge )
( not true if P has holes )
Since G(Tp) is a tree, we can 3-color the vertices of Tp
by a simple graph traversal, e.g., DFS of G(Tp)
-- Visit of Tp & color its vertices.
-- Just visit neighbors according to travel order & color the
(last) vertex.
Any simple polygon can be guarded with n/3 cameras.

Can we do better? i.e. is there a simple polygon with


requires n/3 cameras?
YES

Art Gallery Theorem ( Thrm 3.2 )


n/3 cameras are always sufficient and sometimes
necessary to have every point in an n-vertex simple polygon
visible from at least one of the cameras.

Triangulating a Simple Polygon


First Try:
We proved that every simple polygon can be triangulated.
That proof was constructive
!We

proved that every polygon had a diagonal by finding one

!Can

be applied recursively to completely triangulate P

How long does this take?


!At each iteration find leftmost vertex & check if two neighbors form
a diagonal (& possibly choose farthest) Linear Time
!Could have n-3 iterations (if break into P1 & P2 of size n-1+3)
Total = Quadratic Time
But, it could sometimes be faster

Convex Polygons: Triangulate easily in O(n) time

So,
!Possible

approach: Decompose P into convex pieces?

!Unfortunately,

decomposition is as hard as triangulation

But, something similar can be done

DEF:
Y-monotone: A simple polygon, P, is y-monotone if the intersection
of P with any horizontal line is connected (i.e. a point, a segment,
or ).
(P is strictly y-monotone if it has no horizontal edges.)
FACT:
Let P be y-monotone,
and let v & w be top and
bottom vertices. If we
move on left (or right)
boundary chain of P
from v to w, then we
always move down or
horizontally (never up).

y-monotone

Not y-monotone

Triangulating a Strictly Y-monotone


Polygon
Basic Idea: Work our way down P on both left
and right chains, adding diagonals whenever
possible
A Greedy Plane Sweep Algorithm:
!
!
!

Process vertices in order of decreasing y-coordinate (left if tie)


Stack keeps vertices that have been encountered, but not yet
used in a diagonal. (Stack ordered by increasing y, LIFO)
When a vertex is encountered, add as many diagonals as possible
from it to the stack vertices. (Each diagonal splits off a triangle
and a vertex from the stack)

Funnel Structure of Stack Vertices


Untriangulated portion of P above lowest encountered vertex is a
funnel:
!One

Split off triangles


1

3
4
5

Funnel

Partial Edge

Reflex Chain
7

boundary is chain of
reflex vertices (interior angles
at least 180) except for lowest
vertex (top of stack).
!Other

boundary is (partial)
edge. (We have not seen
bottom endpoint yet).

8
9
10
11

12

Last encountered
Vertex

Sweepline Invariant: Vertices


on the stack conform to this
funnel structure.

What happens when we encounter the next vertex?


Case 1: Vj is on the side opposite the reflex chain on the stack
!Vj

3
4

Vl

5
6

7
8

Vj

10
11

12

Vk

is lower endpoint to edge e


bounding funnel
!Can add diagonals from Vj to all
vertices on reflex chain except Vl
(bottom of stack/highest) which is
already connected
!Can pop vertices on reflex
chain except Vk first (top of
stack/lowest)
!Push Vj & Vk
!Left

with new funnel: Vj & Vk

What happens when we encounter the next vertex?


Case 2: Vj is on the same side as the reflex chain on the stack
!Can

add diagonals from Vj to a consecutive set (possibly empty) of vertices in


its same reflex chain (starting from the top of the stack/lowest vertex)
!Check

each vertex in turn until finding one that does not make a diagonal
Popped and
pushed
popped
Popped and
pushed
Vj

In this case the first vertex


popped cannot be connected
to Vj, so we push it back onto
the stack.

pushed
pushed
Vj

In this case, we can connect


some popped vertices to Vj.
The last one is pushed back
onto the stack.

Note: Checking if each diagonal can be drawn from Vj to Vk on the stack can be done by looking at Vj,
Vk and previously popped vertex.

Sweep-line Algorithm to Triangulate a


Monotone Polygon
!
!

Input: A strictly monotone polygon P, represented by a doublyconnected edge list D


Output: A triangulation of P, stored in doubly-connected edge list
D
u
1

u1

u2

u2
u3

u4
u5

u3

u4
u5

u6

u7
u8

u9

u6

u7
u8

u9

Merge vertices in left and right chains sorted on


decreasing y-coordinate (breaking ties by increasing
x-coordinate), producing an ordering of vertices u1,
u2, , un
Push u1 and u2 onto stack S
u1
u2
u3

u4
u5

u2

u6

u7
u8

u9

u1

for j=3 to (n-1)


if (uj and top(S) are on different chains) then
!
!
!

Pop all vertices from S


Insert into D diagonals from uj to all popped vertices (except
last)
Push uj-1 and uj onto S
u1
u2
u3

u4
u5
u6

u7
u8

u4
u3

u9

else
!
!
!

Pop one vertex from S


Pop vertices from S and insert diagonals from uj to popped vertices, so
long as they are in P
Push last popped vertex and vj onto S

u1
u2
u3

u4
u5
u6

u7
u8

u6
u4

u9

Add diagonals to D from un to all stack vertices except first and


last

u1
u2
u3

u4
u5
u6

u7
u8

u9

Running Time of the Algorithm

Merging the vertices takes linear time


There are (n-3) iterations of the for loop, each of which can push at
most two vertices, which gives a maximum number of pushes of
2(n-3) + 2 (from Step 2) = 2n 4 pushes, and the total number of
pops cannot exceed the total number of pushes, so overall the
event processing takes linear time
Add diagonals from the last vertex takes linear time

Theorem
A strictly monotone polygon can be triangulated in linear time

Non-strict Monotonicity
The algorithm still works if two vertices have the same ycoordinate; they may be processed in increasing order of their xcoordinates

Decomposing a Polygon into Monotone


Pieces

!
!

If you walk down a boundary chain of a polygon and at some


vertex you switch directions, it is not monotone
These turn vertices must be removed by adding diagonals,
breaking the polygon into sub-polygons, each of which is
monotone

Split and Merge Vertices

Merge Vertex
Both neighbors are above it
Interior angle > 1800
Need to add diagonals down

Split Vertex
Both neighbors are below it
Interior angle > 1800
Need to add diagonals up

Lemma
A polygon P is y-monotone if and only if it has no split or merge
vertices

Proof

Suppose P is not y-monotone. Then some horizontal line l


intersects P in more than one component. Without loss of
generality, assume the leftmost component is segment pq.
Start at q and follow the boundary to the left. Let r be the first
point encountered where the boundary of P intersects l.

Case 1: If (r p), then the highest encountered vertex was a


split vertex

There must be a split vertex


here somewhere

Case 2: If (r = p), then


Follow the boundary of P to the right again. Since l
intersects P in two components, there will be a point r p
where l again intersects the boundary of P
The lowest vertex encountered from q to r is a merge
vertex

There must be a merge


vertex here somewhere

Sweepline Algorithm
!
!
!

Sweep down by the y-coordinate


Event points are vertices of P
GOAL of SWAP

To add diagonals from split vertices to


vertices above
To add diagonals from merge vertices to
vertices below

Definition
!

Let ej be an edge intersection the current


sweepline l helper(ei) = lowest vertex v
above l that can see ej horizontally.

Helper(ej) can change as l moves down, and


can be the upper endpoint of ej (initially)

Sweepline Status

Edges of P intersection l stored in Binary Search


Tree, left to right
Store helpers with edges (so will need to update
them as l moves)

Handle Split Vertex


!HandleSplitVertex(vi)
!(add

diagonal from split vertex up)


!1. Search T for Edge ej directly left of vi
!2. Add diagonal from vi to helper (ej)
!/* Note: vi can always see it */
!3. Set helper (ej):= Vi (update helper)
!4. Insert ei in T and set helper(ei) := vi (upper
! endpoint

Helper(ej)
ej

vi
ei-1

ei

New Helper (e) and


first helper(ej)

Handle Split Vertex


!HandleSplitVertex(vi)
!(add

diagonal from split vertex up)


!1. Search T for Edge ej directly left of vi
!2. Add diagonal from vi to helper (ej)
!/* Note: vi can always see it */
!3. Set helper (ej):= Vi (update helper)
!4. Insert ei in T and set helper(ei) := vi (upper
! endpoint

Helper(ej)
ej

vi
ei-1

ei

New Helper (e) and


first helper(ej)

Handle Split Vertex


!HandleSplitVertex(vi)
!(add

diagonal from split vertex up)


!1. Search T for Edge ej directly left of vi
!2. Add diagonal from vi to helper (ej)
!/* Note: vi can always see it */
Convention: vertices
!3. Set helper (ej):= Vi (update helper)
numbered counter
!4. Insert ei in T and set helper(ei) := vi
clockwise and ed =(v,v)
!(upper endpoint)

Helper(ej)
ej

vi
ei-1

ei

New helper (ej) and


first helper(ej)

Handle Merge Vertex


!HandleMergeVertex(vi)
!(add

diagonals from higher merge vertices down to this merge vertex)


!1. If helper (ei-1) is merge vertex add diagonal vi to
! helper (ei-1)
!2. Delete ej-1 from T
!3. Search T for edge ej directly to left of vi
!4. If helper (ej) is merge vertex add diagonal vi to
! helper(ei)
!5. Helper (ej) := vi (update helper)

helper(ej)

Vi+1

Vi-1
ei

ej
(merge vertex)

vi

helper(ei-1)
(merge vertex)
New helper (ej)

Handle Merge Vertex


!HandleMergeVertex(vi)
!(add

diagonals from higher merge vertices down to this merge vertex)


!1. If helper (ei-1) is merge vertex add diagonal vi to
! helper (ei-1)
!2. Delete ej-1 from T
!3. Search T for edge ej directly to left of vi
!4. If helper (ej) is merge vertex add diagonal vi to
! helper(ei)
!5. helper (ej) := vi (update helper)

helper(ej)

Vi+1

Vi-1
ei

ej
(merge vertex)

vi

New helper (ej)

helper(ei-1)
(merge
vertex)

Handle Merge Vertex


!HandleMergeVertex(vi)
!(add

diagonals from higher merge vertices down to this merge vertex)


!1. If helper (ei-1) is merge vertex add diagonal vi to
! helper (ei-1)
!2. Delete ej-1 from T
!3. Search T for edge ej directly to left of vi
!4. If helper (ej) is merge vertex add diagonal vi to
! helper(ei)
!5. helper (ej) := vi (update helper)

helper(ej)

Vi+1

Vi-1
ei

ej
(merge vertex)

vi

New helper (ej)

helper(ei-1)
(merge
vertex)

Handle Merge Vertex


!HandleMergeVertex(vi)
!(add

diagonals from higher merge vertices down to this merge vertex)


!1. If helper (ei-1) is merge vertex add diagonal vi to
! helper (ei-1)
!2. Delete ej-1 from T
!3. Search T for edge ej directly to left of vi
!4. If helper (ej) is merge vertex add diagonal vi to
! helper(ei)
!5. Helper (ej) := vi (update helper)

helper(ej)

Vi+1

Vi-1
ei

ej
(merge vertex)

vi

new helper(ej)

helper(ei-1)
(merge
vertex)

General Strategy
!
!

Always add a diagonal for Split


Vertex (diagonal up)
Add diagonal when replace helper
and previous helper was the verge
vertex

For these we may change the helpers


and thus might add diagonals

In addition to split & merge vertices we have


Start vertex vs
!

both neighbors below vs

interior angle < 180

Regular vertex vi
!

one neighbor above & one below vi

interior angle doesnt matter

End vertex ve

both neighbors above ve

interior angle < 180

regular vertex
end vertex

we may change helpers and thus add diagonals !

vi

Start vertex
!First

event point
!Highest vertex

Handle start vertex (vs=vi)


!Insert

ei in T
!Set helper (ei)=vi

ei
ei-1

End vertex
!Last

event
!Lowest vertex

helper(ei-1)
ei

ei-1
vi
Handle end vertex (ve=vi)
!If

helper(ei-1) is a merge vertex, add diagonal vi to helper(ei-1)


!Delete ei-1from T

Handle regular vertex (vi)


Case 1:
Polygon lies to the right of vi
!If helper(ei-1) is a merge
vertex then add diagonal vi to
helper(ei-1)
!Delete ei-1 from T
!Insert ei in T
!Set helper(ei):=vi

helper(ei-1)

ei-1
vi
ei

Handle regular vertex (vi)


Case 2:
Polygon lies to the left of vi
!Search T for edge ej directly
to the left of vi
!If helper(ej) is a merge vertex
then add diagonal vi to
helper(ej)
!Set helper(ej):=vi

helper(ej)

ei

ej
vi
ei-1

Lemma 3.5 (Correctness)


The algorithm adds a set of non-intersecting diagonals
that partition P into monotone pieces.
Proof
Easy to see P contains no split or merge vertices now. So
need to argue diagonals were valid, that is, they dont intersect P
or each other.

Consider handling split vertex (others similar)


! helper(vi):=ej
! vivm is added diagonal
!No vertices of P in Q (since vm=helper(ej))
!No edge of P intersects vmvi
- Since no verts in Q, any edge
intersecting vivm would have to pass
through at least one of (vm-ej) or (vi-ej)
- But this is not possible since vi&vm are
closest to ej
!No (previous) diagonal intersects vivm
- All are above vi and no vertices in Q

vm

ej

vi

Running Time
1.

Sort vertices by y-coord => O(nlogn)

2.

Handle each vertex ~ O(logn), there are n vertices => O(nlogn)

Total: O(nlogn)
Storage O(n)

Theorem 3.6
A simple polygon with n vertices can be partitioned into ymonotone polygones in O(nlogn) time using O(n) storage

Triangulation of simple polygon


1.

O(nlogn) to partition into monotone pieces

2.

O(n) to triangulate monotone pieces

O(nlogn)

We can decompose P into monotone pieces, triangulate pieces,


and color resulting triangulation and place cameras in O(nlogn)
time.

You might also like