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
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