A kd tree is excellent for locating the points closest or farthest from a
given object. orion supports queries from points, circle/spheres, and
iso_rect/iso_cubes. If a point lies inside the geometry it's distance is 0.
If more points than requested lies inside the geometry a subset of these will
be returned. orion supports approximate queries through the eps
argument.
Using it will speed up searches but may return wrong results (but within the
bounds of the given eps
).
Arguments
- geometries
A vector of geometries to use for queries. Either a
euclid_point
,euclid_circle2
,euclid_sphere
,euclid_iso_rect
, oreuclid_iso_cube
vector.euclid_point_w
will get coerced toeuclid_point
andeuclid_bbox
will get coerced toeuclid_iso_rect
/euclid_iso_cube
- tree
a
orion_kd_tree
- n
An integer vector giving the number of points to find per query. Will recycle to the length of
geometries
- eps
Approximation factor for the search. For nearest neighbor the returned points are no more than
1 + eps
times farther away than the true nearest neighbor, whereas for furthest neighbor the returned points are no less than1/(1 + eps)
nearer than the distance to the true match. Will recycle to the length ofgeometries
- nearest
Should nearest neighbor be search (setting it to
FALSE
results in a furthest neighbor search)- sort
Should the returned points be search by their distance to the query
- ...
Arguments passed on
Value
A list with elements points
holding a euclid_point
vector, id
matching the points
to the index of geometries
, and distance
providing
the distance to the query
See also
Other kd tree queries:
kd_tree_range()
Examples
# Create a kd tree with points
pts <- euclid::point(runif(100), runif(100))
tree <- kd_tree(pts)
# Find furthest neighbor to point
pt <- euclid::point(0.4, 0.7)
neighbors <- kd_tree_search(pt, tree, 10, nearest = FALSE)
plot(pts, cex = 1)
euclid_plot(neighbors$points, cex = 0.6, pch = 16, col = 'red')
euclid_plot(pt, cex = 1, pch = 16, col = 'green')
# Find nearest neighbor to circle
circ <- euclid::circle(pt, 0.01)
neighbors <- kd_tree_search(circ, tree, 10)
plot(pts, cex = 1)
euclid_plot(neighbors$points, cex = 0.6, pch = 16, col = 'red')
euclid_plot(circ, fg = 'green')