While a kd tree is often used to locate nearest neighbors, it works equally
well for quickly looking up points contained within a geometry. This type of
query obviously doesn't work for points but only circles/spheres and
rectangles/cubes. As with kd_tree_search()
it is possible to do a fuzzy
search by providing an eps
, but it works differently. For kd_tree_range()
the eps
argument provides a fuzzy zone around the query geometry. For
circle/spheres, this means that all points inside radius - eps
will get
reported, points inside radius + eps
, but outside radius - eps
may get
reported, and points outside radius + eps
will not get reported. For
rectangles/cubes it works the same but instead it dilates and expands the box
by the eps
arguments to create the fuzzy zones.
Arguments
- geometries
A vector of geometries to use for queries. Either a
euclid_circle2
,euclid_sphere
,euclid_iso_rect
, oreuclid_iso_cube
vector.euclid_bbox
will get coerced toeuclid_iso_rect
/euclid_iso_cube
- tree
a
orion_kd_tree
- eps
Fuzzyness factor for the query. See the description. Will recycle to the length of
geometries
- ...
Arguments passed on
Value
A list with elements points
holding a euclid_point
vector and id
matching the points
to the index of geometries
See also
Other kd tree queries:
kd_tree_search()
Examples
# Create a kd tree with points
pts <- euclid::point(runif(100), runif(100))
tree <- kd_tree(pts)
# Do an exact range query (eps = 0)
pt <- euclid::point(0.4, 0.7)
circ <- euclid::circle(pt, 0.02)
inside <- kd_tree_range(circ, tree)
plot(pts, cex = 1)
euclid_plot(inside$points, cex = 0.6, pch = 16, col = 'red')
euclid_plot(circ, fg = 'green')
# Do a fuzzy range query
circ <- euclid::circle(pt, 0.04)
inside <- kd_tree_range(circ, tree, 0.1)
plot(pts, cex = 1)
euclid_plot(inside$points, cex = 0.6, pch = 16, col = 'red')
euclid_plot(circ, fg = 'green')
euclid_plot(circle(pt, 0.1^2), fg = 'green', lty = 2)
euclid_plot(circle(pt, 0.3^2), fg = 'green', lty = 2)