07.01.2015 Views

O'Rourke Chapter 7: Search & Intersection in PDF - Computer Science

O'Rourke Chapter 7: Search & Intersection in PDF - Computer Science

O'Rourke Chapter 7: Search & Intersection in PDF - Computer Science

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

UMass Lowell <strong>Computer</strong> <strong>Science</strong> 91.504<br />

Advanced Algorithms<br />

Computational Geometry<br />

Prof. Karen Daniels<br />

Fall, 2012<br />

O’Rourke <strong>Chapter</strong> 7<br />

<strong>Search</strong> & <strong>Intersection</strong>


<strong>Chapter</strong> 7<br />

<strong>Search</strong> & <strong>Intersection</strong><br />

Segment-Segment <strong>Intersection</strong><br />

Segment-Triangle <strong>Intersection</strong><br />

Po<strong>in</strong>t <strong>in</strong> Polygon<br />

Po<strong>in</strong>t <strong>in</strong> Polyhedron<br />

<strong>Intersection</strong> of Convex Polygons<br />

<strong>Intersection</strong> of Segments<br />

<strong>Intersection</strong> of Nonconvex Polygons<br />

Extreme Po<strong>in</strong>t of Convex Polygon<br />

Extremal Polytope Queries<br />

Planar Po<strong>in</strong>t Location


Segment-Segment <strong>Intersection</strong><br />

• F<strong>in</strong>d<strong>in</strong>g the actual <strong>in</strong>tersection po<strong>in</strong>t<br />

• Approach: parametric vs. slope/<strong>in</strong>tercept<br />

• parametric generalizes to more complex<br />

<strong>in</strong>tersectionsi<br />

• Parameterize each segment<br />

L cd<br />

c<br />

a<br />

b<br />

L ab<br />

d<br />

L cd<br />

c<br />

C=d-c<br />

b<br />

a<br />

A=b-a<br />

p(s)=a+sA<br />

source: O’Rourke<br />

L ab<br />

q(t)=c+tC<br />

d<br />

<strong>Intersection</strong>: values of s, t such that p(s) =q(t)<br />

: a+sA=c+tC


Segment-Triangle <strong>Intersection</strong><br />

• Determ<strong>in</strong>e if qr <strong>in</strong>tersects plane π conta<strong>in</strong><strong>in</strong>g<br />

triangle T.<br />

source: O’Rourke<br />

useful <strong>in</strong> ray trac<strong>in</strong>g<br />

• Let N=(A,B,C) be normal to π<br />

r<br />

π :(x,y,z) •(A,B,C)=D (i.e.π π = Ax + By + Cz = D)<br />

π<br />

c N<br />

• F<strong>in</strong>d normal N us<strong>in</strong>g cross-products <strong>in</strong>volv<strong>in</strong>g a, b, c<br />

p<br />

T<br />

• parameterize qr: p(t) = q + t(r-q)<br />

a b<br />

D − ( q • N)<br />

• solve for t :<br />

t<br />

=<br />

q<br />

( r − q)<br />

• N<br />

• us<strong>in</strong>g t, f<strong>in</strong>d po<strong>in</strong>t of <strong>in</strong>tersection p if it exists<br />

• Classify relationship between p and T<br />

• p is <strong>in</strong> T iff its projection p’ is <strong>in</strong> a projection* T’ of T<br />

to xy, xz or yz-plane<br />

+--<br />

• Barycentric coord<strong>in</strong>ates<br />

“left edge” p’ +-+<br />

• Check results of 3 of tests for with<br />

++respect<br />

to T’: +++ means p’ <strong>in</strong>side T’.<br />

+++<br />

-+- -++<br />

--<br />

* avoid degeneracy by project<strong>in</strong>g out largest coord<strong>in</strong>ate<br />

--+<br />

T’


Po<strong>in</strong>t <strong>in</strong> Polygon<br />

An application: GUI mouse click<br />

• W<strong>in</strong>d<strong>in</strong>g number (see Guibas/Stolfi)<br />

• stand<strong>in</strong>g at q, turn to follow border of P<br />

• sum rotation to create signed angular turn + ccw<br />

- cw<br />

• divide by 2π<br />

• elegant but not practical: O(n) with large constant<br />

• Ray cross<strong>in</strong>gs<br />

• extend horizontal ray from q<br />

• count number of <strong>in</strong>tersections with P<br />

• even q is outside P<br />

• odd q is <strong>in</strong>side P<br />

• beware degenerate <strong>in</strong>tersections!<br />

Compare with us<strong>in</strong>g LeftOn test when polygon is convex<br />

P<br />

P<br />

O(n)<br />

q<br />

q<br />

source: O’Rourke


• W<strong>in</strong>d<strong>in</strong>g number<br />

generalizes to 3D<br />

Po<strong>in</strong>t <strong>in</strong> Polyhedron<br />

• uses solid angle<br />

(fraction of sphere surface<br />

used by cone at po<strong>in</strong>t)<br />

• Ray cross<strong>in</strong>g<br />

generalizes to 3D<br />

• q <strong>in</strong>side P if odd<br />

number of<br />

cross<strong>in</strong>gs<br />

• q outside P if even<br />

number of<br />

cross<strong>in</strong>gs<br />

Runn<strong>in</strong>g Time<br />

(see next slide)<br />

P<br />

q<br />

r<br />

Assume each face is a triangle.<br />

Algorithm: : POINT <strong>in</strong> POLYHEDRON (P, R, q)<br />

Compute bound<strong>in</strong>g radius R<br />

loop forever<br />

r 0 = random ray of length R<br />

r=q+r<br />

r 0<br />

cross<strong>in</strong>gs = 0<br />

for each triangle T of polyhedron P do<br />

SegTriInt(T, q, r)<br />

if degenerate <strong>in</strong>tersection<br />

then go back to loop<br />

else <strong>in</strong>crement cross<strong>in</strong>gs appropriately<br />

if cross<strong>in</strong>gs odd<br />

then q is <strong>in</strong>side P<br />

else q is outside P<br />

Exit<br />

source: O’Rourke


Po<strong>in</strong>t <strong>in</strong> Polyhedron<br />

source: O’Rourke<br />

P<br />

q<br />

r<br />

Expected time O(ρn)<br />

ρ = expected number of tries to get<br />

nondegenerate <strong>in</strong>tersection<br />

• Experiment: One comb<strong>in</strong>atorially dense sample<br />

polyhedron has ρ ~ 1.01.<br />

• Claim: ρ = 1 + ε can be achieved for any ε > 0!<br />

• For analysis, replace sphere with bound<strong>in</strong>g cube.<br />

• In worst case, L <strong>in</strong>teger po<strong>in</strong>ts on cube face<br />

“disqualified” by each edge of polyhedron.<br />

• Probability of hitt<strong>in</strong>g a degeneracy =<br />

• Let E = #edges<br />

• (E x L) out of L 2 disqualified = E/L<br />

• E is a constant, so choos<strong>in</strong>g L large enough<br />

yields any desired ε = E/L.<br />

Assume each face is a triangle.<br />

Imag<strong>in</strong>e <strong>in</strong>teger discretization of L.<br />

Edge e “kills” a l<strong>in</strong>e of po<strong>in</strong>ts on face of<br />

surround<strong>in</strong>g cube.


<strong>Intersection</strong> of Convex Polygons<br />

• For nonconvex n-vertex P and m-vertex<br />

Q, the worst-case size complexity of<br />

P ∩ Q<br />

is <strong>in</strong> Ω(nm)<br />

• For convex P, Q, size is only <strong>in</strong><br />

O ( n + m) )<br />

and can be computed <strong>in</strong> O ( n + m) time<br />

source: O’Rourke<br />

B<br />

A<br />

(example)<br />

Q<br />

P<br />

Algorithm: : INTERSECTION of CONVEX POLYGONS<br />

Choose A and B arbitrarily<br />

/* A is directed edge on P */<br />

repeat<br />

/* B is directed edge on Q */<br />

if A <strong>in</strong>tersects B then /* A, B “chase” each other */<br />

/* A, B meet at each */<br />

Check for term<strong>in</strong>ation<br />

/* boundary cross<strong>in</strong>g */<br />

Update <strong>in</strong>side flag<br />

Advance either A or B<br />

depend<strong>in</strong>g on geometric conditions (see next slide)<br />

until both A and B cycle their polygons<br />

Handle cases: P ⊂ Q P ⊃ Q P ∩ Q = 0/<br />

O(n+m)


<strong>Intersection</strong> of Convex Polygons<br />

source: O’Rourke<br />

If B “aims towards” l<strong>in</strong>e conta<strong>in</strong><strong>in</strong>g A but does not cross it then<br />

If B aims towards l<strong>in</strong>e conta<strong>in</strong><strong>in</strong>g A, but does not cross it, then<br />

advance B to “close <strong>in</strong>” on possible <strong>in</strong>tersection with A.


<strong>Intersection</strong> of Segments<br />

• Goal: “Output-size sensitive”<br />

polygon <strong>in</strong>tersection algorithm<br />

• Core Problem: “Output-size<br />

sensitive” l<strong>in</strong>e segment <strong>in</strong>tersection<br />

algorithm<br />

• Bentley-Ottmann plane sweep:<br />

O((n+k)logn) time<br />

• k = number of <strong>in</strong>tersection po<strong>in</strong>ts <strong>in</strong><br />

output<br />

• Intuition: sweep l<strong>in</strong>e (discrete event<br />

ent<br />

simulation)<br />

• First, review algorithm that returns<br />

TRUE iff there exists an <strong>in</strong>tersection


<strong>Intersection</strong> of >2 L<strong>in</strong>e Segments<br />

Sweep-L<strong>in</strong>e Algorithmic Paradigm:<br />

33.4<br />

source: 91.503 textbook Cormen et al.


<strong>Intersection</strong> of >2 L<strong>in</strong>e Segments<br />

Sweep-L<strong>in</strong>e Algorithmic Paradigm:<br />

source: 91.503 textbook Cormen et al.


<strong>Intersection</strong> of >2 L<strong>in</strong>e Segments<br />

Time to decide if any 2<br />

segments <strong>in</strong>tersect:<br />

segments <strong>in</strong>tersect:O(n lg n)<br />

Balanced BST stores segments <strong>in</strong> order<br />

of <strong>in</strong>tersection with sweep l<strong>in</strong>e.<br />

Associated operations take O(lgn) time.<br />

(See next slide.)<br />

Note that it exits as soon as one <strong>in</strong>tersection is detected.<br />

33.5<br />

source: source: 91.503 91.503 textbook Cormen et al.


<strong>Intersection</strong> of >2 L<strong>in</strong>e Segments<br />

Balanced BST stores segments <strong>in</strong> order of <strong>in</strong>tersection with sweep l<strong>in</strong>e.<br />

Associated operations take O(lgn) time.<br />

Each segment has a leaf node.<br />

At each <strong>in</strong>ternal node, store<br />

segment from rightmost leaf <strong>in</strong> its<br />

left subtree.<br />

What does this allow us to do<br />

source: deBerg et al.


<strong>Intersection</strong> of Segments<br />

• Goal: “Output-size sensitive” l<strong>in</strong>e segment <strong>in</strong>tersection algorithm<br />

that actually computes all <strong>in</strong>tersection po<strong>in</strong>ts<br />

• Bentley-Ottmann plane sweep: O((n+k)log(n+k))= O((n+k)logn) time<br />

• k = number of <strong>in</strong>tersection po<strong>in</strong>ts <strong>in</strong> output<br />

• Intuition: sweep vertical l<strong>in</strong>e rightwards<br />

• just before <strong>in</strong>tersection, 2 segments are adjacent <strong>in</strong> sweep-l<strong>in</strong>e <strong>in</strong>tersection structure<br />

• check for <strong>in</strong>tersection only adjacent segments<br />

• <strong>in</strong>sert <strong>in</strong>tersection event <strong>in</strong>to sweep-l<strong>in</strong>e structure<br />

• event types:<br />

(example on previous slide)<br />

• left endpo<strong>in</strong>t of a segment<br />

• right endpo<strong>in</strong>t of a segment<br />

• <strong>in</strong>tersection between 2 segments<br />

• swap order<br />

Improved to O(nlogn+k) [Chazelle/Edelsbrunner]<br />

l source: O’Rourke, Computational Geometry <strong>in</strong> C


<strong>Intersection</strong> of Nonconvex Polygons<br />

• Variation on Bentley-<br />

Ottmann sweep<br />

• Ma<strong>in</strong>ta<strong>in</strong> status for<br />

each piece of sweep<br />

l<strong>in</strong>e:<br />

• 0: exterior to P, Q<br />

• P: <strong>in</strong>side P, outside Q<br />

• Q: <strong>in</strong>side Q, outside P<br />

• PQ: <strong>in</strong>side P , <strong>in</strong>side Q<br />

• Useful for CAD/CAM<br />

P<br />

source: O’Rourke<br />

Q<br />

For n-vertex<br />

P, , m-vertex<br />

Q, , O((n+m<br />

n+m)log( )log(n+m)+k) time to compute:<br />

P ∩ Q<br />

P ∪ Q<br />

P \ Q


Extreme Po<strong>in</strong>t of Convex Polygon<br />

Algorithm: HIGHEST POINT of CONVEX POLYGON<br />

Initialize a and b<br />

/* highest h po<strong>in</strong>t is <strong>in</strong> [a,b] */<br />

repeat forever<br />

c <strong>in</strong>dex midway from a to b<br />

if P[c] is locally highest then return c<br />

if A po<strong>in</strong>ts up and C po<strong>in</strong>ts down<br />

then [a,b] [a,c]<br />

/* highest po<strong>in</strong>t is <strong>in</strong> [a,c] */<br />

else if A po<strong>in</strong>ts down and C po<strong>in</strong>ts up<br />

then [a,b] [c,b]<br />

/* highest po<strong>in</strong>t is <strong>in</strong> [c,b] */<br />

else if A po<strong>in</strong>ts up and C po<strong>in</strong>ts up<br />

if P[a] is above P[c]<br />

then [a,b] [a,c]<br />

else [a,b] [c,b]<br />

/* highest po<strong>in</strong>t is <strong>in</strong> [c,b] */<br />

else if A po<strong>in</strong>ts down and C po<strong>in</strong>ts down<br />

if P[a] is below P[c]<br />

then [a,b] [a,c]<br />

/* highest po<strong>in</strong>t is <strong>in</strong> [a,c] */<br />

else [a,b] [c,b]<br />

/* highest po<strong>in</strong>t is <strong>in</strong> [c,b] */<br />

source: O’Rourke<br />

I iti li d b A Geometric<br />

B<strong>in</strong>ary <strong>Search</strong><br />

C<br />

c<br />

b<br />

A<br />

Unimodality<br />

allows<br />

B<br />

B<strong>in</strong>ary <strong>Search</strong><br />

O(lg n)<br />

a


Stabb<strong>in</strong>g a Convex Polygon<br />

source: O’Rourke<br />

Extreme-F<strong>in</strong>d<strong>in</strong>g algorithm can stab a convex polygon<br />

extreme <strong>in</strong> + u direction<br />

a<br />

+u<br />

y<br />

L<br />

x<br />

b<br />

extreme <strong>in</strong> - u direction<br />

If a and b straddle L,<br />

b<strong>in</strong>ary search on [a,b] yields x<br />

b<strong>in</strong>ary search on [b,a] yields y<br />

O(lg n)


Extremal Polytope Queries:<br />

Ma<strong>in</strong> Idea<br />

source: O’Rourke<br />

• Form sequence of O(log n) simpler nested<br />

polytopes <strong>in</strong> O(n) time (see next slide)<br />

• To answer a (w.l.o.g.. vertical) query <strong>in</strong><br />

O(logn<br />

logn) time: (see slide after next)<br />

• F<strong>in</strong>d extreme with respect to <strong>in</strong>ner polytope,<br />

then work outwards<br />

• Need only check small number of candidate<br />

vertices <strong>in</strong> next polytope<br />

• Key idea:<br />

• <strong>in</strong>dependent sets <strong>in</strong> planar graphs are<br />

“large”; vertices of “low” degree<br />

• to construct next (<strong>in</strong>ner) polytope, remove<br />

<strong>in</strong>dependent set of vertices<br />

• delet<strong>in</strong>g constant fraction of vertices at each<br />

step produces O(logn<br />

logn) polytopes lt (derivation<br />

derivation)<br />

O(log n)<br />

An <strong>in</strong>dependent set of a polytope graph of n vertices<br />

produced by INDEPENDENT SET has size at least n/18 (to be shown later).


Extremal Polytope Queries:<br />

Ma<strong>in</strong> Idea (cont<strong>in</strong>ued)<br />

source: O’Rourke


Extremal Polytope Queries:<br />

Ma<strong>in</strong> Idea (cont<strong>in</strong>ued)<br />

source: O’Rourke<br />

For maximal z query:<br />

Mov<strong>in</strong>g from P i+1 to P i<br />

is like rais<strong>in</strong>g a plane<br />

orthogonal to z axis<br />

from a i+1 1(<br />

(highest<br />

po<strong>in</strong>t on P i+1 ) to<br />

a i …a 0


Extremal Polytope Queries<br />

Details<br />

source: O’Rourke<br />

Maximum Independent Set is NP-complete,<br />

but greedy heuristic performs well.<br />

Choose vertex of lowest degree, not<br />

adjacent to vertices already chosen.<br />

Algorithm 7.4: : INDEPENDENT SET<br />

Input: : graph G<br />

Output: : <strong>in</strong>dependent set I<br />

I 0<br />

Mark all nodes of G of degree >= 9<br />

while some nodes rema<strong>in</strong> unmarked<br />

do<br />

Choose an unmarked node v<br />

Mark v and all neighbors of v<br />

I I U {v}<br />

spurious<br />

edge<br />

Goal: tetrahedron<br />

triangulate<br />

polytope: lt use convex hll hull<br />

(d) octahedron<br />

(a) Icosahedron<br />

Schlegel<br />

diagram: 5<br />

triangles meet at<br />

each vertex.<br />

There exist at least n/2 vertices of degree<br />

at most 8 (derivation<br />

derivation).<br />

An <strong>in</strong>dependent set of a polytope graph of n vertices<br />

produced by INDEPENDENT SET has size at least n/18 (derivation).


Extremal Polytope Queries<br />

Details (cont<strong>in</strong>ued)<br />

source: O’Rourke<br />

(creation)<br />

i<br />

← i +1<br />

1<br />

(creation)


Extremal Polytope Queries<br />

Details (cont<strong>in</strong>ued)<br />

• To use nested polytope hierarchy to<br />

answer an extreme po<strong>in</strong>t query:<br />

• F<strong>in</strong>d extreme with respect to <strong>in</strong>ner<br />

polytope P k (brute-force search)<br />

• Move from polytope P i+1 to P i<br />

• Let a i and a i+1 be uniquely highest h vertices of<br />

P i and P i+1 . Then (Lemma 7.10.2) either:<br />

• a i = a i+1 or<br />

• a i+1 is the highest among the vertices adjacent to a i<br />

(See proof sketch <strong>in</strong> next slide.)<br />

source: O’Rourke<br />

(Assume w.l.o.g. . vertical query direction)<br />

π<br />

(Plane effect )


Extremal Polytope Queries<br />

Dtil Details (cont<strong>in</strong>ued)<br />

source: O’Rourke<br />

• Lemma 7.10.2: (repeated) Let a i and a i+1 be uniquely highest vertices<br />

of P i and P i+1 . Then either:<br />

• a i = a i+1 or<br />

• a i+1 is the highest among the vertices adjacent to a i<br />

• Proof Sketch: (by cases)<br />

• a i is vertex of both P i and P i+1<br />

• a i = a i+1<br />

• else a i deleted <strong>in</strong> construction of P i+1<br />

• Let b i+1 = highest vertex of P i+1 among<br />

those adjacent to a i <strong>in</strong> P i<br />

• Claim: b i+1 is highest vertex of P i+1<br />

• Proof uses polygonal-faced “cone”<br />

• See book for further details<br />

But we still need bound on #<br />

vertices adjacent to a i+1 …


Extremal Polytope Queries<br />

Dtil Details (cont<strong>in</strong>ued)<br />

source: O’Rourke<br />

• Lemma7103:Leta 7.10.3: Let a i and a i+1 be uniquely highest vertices of P i and<br />

P i+1 . Then either (to provide constant-time search):<br />

• a i = a i+1 or<br />

• a i is the highest among the parents of the extreme edges L i+1 and<br />

R i+1<br />

• Proof Sketch: π<br />

• Project P i+1 onto plane orthogonal to π<br />

(e.g. xz plane)<br />

• Let L i+1 , R i+1 = 2 edges of P i+1 project<strong>in</strong>g to 2<br />

edges of P’ i+1 <strong>in</strong>cident to a’ i+1<br />

• Parents of edge are vertices of P i from<br />

L’<br />

π’ i+1 = R’ i+1<br />

which it “derives” (dur<strong>in</strong>g P i+1 creation)<br />

tetrahedron<br />

• New extreme edges are “close” to the old.<br />

projected<br />

onto xz plane<br />

• See p. 281-283 for rema<strong>in</strong><strong>in</strong>g details. P’ i+1<br />

tetrahedron


Extremal Polytope Queries<br />

Summary<br />

Algorithm: EXTREME POINT of a POLYTOPE<br />

Input: polytope P and direction vector u<br />

Output: vertex a of P extreme <strong>in</strong> u direction<br />

Construct nested polytope p hierarchy P = P 0 0, , P 1 1, ,...,, P k<br />

a k<br />

vertex of P k extreme <strong>in</strong> u direction<br />

Compute L k and R k<br />

for i = k - 1, k - 2, ...,1, 0 do<br />

a i extreme vertex among a i+1 and parents of L i+1 and R i+1<br />

if a i = a i+1 then<br />

i i 1<br />

for all edges <strong>in</strong>cident to a i do<br />

source: O’Rourke<br />

π<br />

u<br />

P k<br />

P 0<br />

save extreme edges L i and R i<br />

else (a i = a i+1 ) compute L i from L i+1 etc...<br />

After O(n) time and space preprocess<strong>in</strong>g, a polytope<br />

extreme-po<strong>in</strong>t query can be answered <strong>in</strong> O(log n) time


Planar Po<strong>in</strong>t Location<br />

source: O’Rourke<br />

• Goal: Given a planar subdivision of n<br />

vertices, preprocess it so that po<strong>in</strong>t location<br />

query can be quickly answered.<br />

• A polygonal planar subdivision can be<br />

preprocessed <strong>in</strong> O(n) time and space for<br />

O(log n) query.<br />

• 2D version/variant of <strong>in</strong>dependent set/nested<br />

approach ( may need to triangulate polygonal faces)<br />

• Monotone subdivision approach*<br />

• Randomized dtrapezoidal decomposition*<br />

i * See next slides.


Planar Po<strong>in</strong>t Location (cont<strong>in</strong>ued)<br />

• Monotone subdivision approach:<br />

-Partition subdivision (e.g.<br />

Voronoi diagram) <strong>in</strong>to<br />

“horizontal” strips.<br />

-Double b<strong>in</strong>ary search:<br />

-Vertical search on<br />

strips to locate query<br />

po<strong>in</strong>t between 2<br />

separators<br />

-Horizontal search to<br />

locate it with<strong>in</strong> 1 strip<br />

-O(log<br />

2 n) query time<br />

source: O’Rourke


Planar Po<strong>in</strong>t Location (cont<strong>in</strong>ued)<br />

• And now for someth<strong>in</strong>g completely different…<br />

source: O’Rourke<br />

• As foreshadowed <strong>in</strong> Ch. 2 (polygon partition<strong>in</strong>g/triangulation)<br />

• Seidel’s randomized trapezoidal decomposition for non-cross<strong>in</strong>g<br />

segments:<br />

* *<br />

O(nlogn)<br />

construction<br />

Assume no 2 po<strong>in</strong>ts are at same height.<br />

time: extend<br />

horizontal l<strong>in</strong>e<br />

through each<br />

endpo<strong>in</strong>t.<br />

O(logn)<br />

query time.<br />

* can build<br />

b<strong>in</strong>ary tree


Planar Po<strong>in</strong>t Location (cont<strong>in</strong>ued)<br />

source: O’Rourke<br />

• Lemma allows us to <strong>in</strong>crementally build b<strong>in</strong>ary search tree.<br />

• 3 types of nodes:<br />

1. <strong>in</strong>ternal X nodes, which branch left or right of a segment s i<br />

2. <strong>in</strong>ternal Y nodes, which branch above or below a segment endpo<strong>in</strong>t<br />

3. Leaf trapezoid nodes.<br />

Identify each trapezoid cut by s 1 .<br />

B<br />

C


Planar Po<strong>in</strong>t Location (cont<strong>in</strong>ued)<br />

source: O’Rourke


Planar Po<strong>in</strong>t Location (cont<strong>in</strong>ued)<br />

source: O’Rourke


Planar Po<strong>in</strong>t Location (cont<strong>in</strong>ued)<br />

source: O’Rourke<br />

query po<strong>in</strong>t q<br />

search path for<br />

query po<strong>in</strong>t q

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!