Skip to content

Commit 48d3fc2

Browse files
cserteGT3juliohm
andauthored
refactor gjk intersection into separate function (#1338)
* refactor gjk intersection calculation into separate function * Move helper functions to end of file * Minor refactor * Apply suggestion from @juliohm --------- Co-authored-by: Júlio Hoffimann <julio.hoffimann@gmail.com>
1 parent 9f89e8e commit 48d3fc2

File tree

1 file changed

+50
-41
lines changed

1 file changed

+50
-41
lines changed

src/predicates/intersects.jl

Lines changed: 50 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -54,9 +54,6 @@ intersects(c::Chain, g::Geometry) = any(∈(g), eachvertex(c)) || intersects(c,
5454
intersects(g::Geometry, c::Chain) = intersects(c, g)
5555

5656
function intersects(g₁::Geometry, g₂::Geometry)
57-
Dim = embeddim(g₁)
58-
= lentype(g₁)
59-
6057
# must have intersection of bounding boxes
6158
intersects(boundingbox(g₁), boundingbox(g₂)) || return false
6259

@@ -69,6 +66,56 @@ function intersects(g₁::Geometry, g₂::Geometry)
6966
return intersects(g₁, d₂)
7067
end
7168

69+
gjkintersects(g₁, g₂)
70+
end
71+
72+
intersects(m::Multi, g::Geometry) = intersects(parent(m), [g])
73+
74+
intersects(g::Geometry, m::Multi) = intersects(m, g)
75+
76+
intersects(m₁::Multi, m₂::Multi) = intersects(parent(m₁), parent(m₂))
77+
78+
intersects(d::Domain, g::Geometry) = intersects(d, [g])
79+
80+
intersects(g::Geometry, d::Domain) = intersects(d, g)
81+
82+
# fallback with iterators of geometries
83+
function intersects(geoms₁, geoms₂)
84+
for g₁ in geoms₁, g₂ in geoms₂
85+
intersects(g₁, g₂) && return true
86+
end
87+
false
88+
end
89+
90+
# -------------------------
91+
# SOLVE METHOD AMBIGUITIES
92+
# -------------------------
93+
94+
intersects(p::Point, c::Chain) = p c
95+
96+
intersects(c::Chain, p::Point) = intersects(p, c)
97+
98+
intersects(p::Point, m::Multi) = p m
99+
100+
intersects(m::Multi, p::Point) = intersects(p, m)
101+
102+
intersects(c::Chain, m::Multi) = intersects(segments(c), parent(m))
103+
104+
intersects(m::Multi, c::Chain) = intersects(c, m)
105+
106+
# ------------------
107+
# HELPER FUNCTIONS
108+
# ------------------
109+
110+
"""
111+
gjkintersects(g₁::Geometry, g₂::Geometry)
112+
113+
Run the GJK algorithm for two convex geometries.
114+
"""
115+
function gjkintersects(g₁::Geometry, g₂::Geometry)
116+
Dim = embeddim(g₁)
117+
= lentype(g₁)
118+
72119
# initial direction
73120
c₁, c₂ = centroid(g₁), centroid(g₂)
74121
d = c₁ c₂ ? rand(Vec{Dim,ℒ}) : c₂ - c₁
@@ -196,44 +243,6 @@ function _gjk!(::Val{3}, O, points)
196243
d
197244
end
198245

199-
intersects(m::Multi, g::Geometry) = intersects(parent(m), [g])
200-
201-
intersects(g::Geometry, m::Multi) = intersects(m, g)
202-
203-
intersects(m₁::Multi, m₂::Multi) = intersects(parent(m₁), parent(m₂))
204-
205-
intersects(d::Domain, g::Geometry) = intersects(d, [g])
206-
207-
intersects(g::Geometry, d::Domain) = intersects(d, g)
208-
209-
# fallback with iterators of geometries
210-
function intersects(geoms₁, geoms₂)
211-
for g₁ in geoms₁, g₂ in geoms₂
212-
intersects(g₁, g₂) && return true
213-
end
214-
return false
215-
end
216-
217-
# -------------------------
218-
# solve method ambiguities
219-
# -------------------------
220-
221-
intersects(p::Point, c::Chain) = p c
222-
223-
intersects(c::Chain, p::Point) = intersects(p, c)
224-
225-
intersects(p::Point, m::Multi) = p m
226-
227-
intersects(m::Multi, p::Point) = intersects(p, m)
228-
229-
intersects(c::Chain, m::Multi) = intersects(segments(c), parent(m))
230-
231-
intersects(m::Multi, c::Chain) = intersects(c, m)
232-
233-
# ------------------
234-
# utility functions
235-
# ------------------
236-
237246
# support point in Minkowski difference
238247
minkowskipoint(g₁::Geometry, g₂::Geometry, d) = withcrs(g₁, supportfun(g₁, d) - supportfun(g₂, -d))
239248

0 commit comments

Comments
 (0)