libssrckdtree 1.0.8 C++ Unit Test Coverage |
|
|
|
|
Branch data Line data Source code
1 : : /*
2 : : * Copyright 2010 Savarese Software Research Corporation
3 : : *
4 : : * Licensed under the Apache License, Version 2.0 (the "License");
5 : : * you may not use this file except in compliance with the License.
6 : : * You may obtain a copy of the License at
7 : : *
8 : : * https://www.savarese.com/software/ApacheLicense-2.0
9 : : *
10 : : * Unless required by applicable law or agreed to in writing, software
11 : : * distributed under the License is distributed on an "AS IS" BASIS,
12 : : * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 : : * See the License for the specific language governing permissions and
14 : : * limitations under the License.
15 : : */
16 : :
17 : : #ifndef __SSRC_SPATIAL_DETAIL_KDTREE_NEAREST_NEIGHBOR_H
18 : : #define __SSRC_SPATIAL_DETAIL_KDTREE_NEAREST_NEIGHBOR_H
19 : :
20 : : #include <ssrc/spatial/detail/coordinate_limits.h>
21 : : #include <ssrc/spatial/distance.h>
22 : :
23 : : __BEGIN_NS_SSRC_SPATIAL
24 : :
25 : : namespace detail {
26 : :
27 : : template<typename TreeTraits, typename Distance>
28 : : class kd_tree_nearest_neighbor {
29 : : typedef TreeTraits traits;
30 : : typedef typename traits::key_type key_type;
31 : : typedef typename traits::node_type node_type;
32 : : typedef typename traits::discriminator_type discriminator_type;
33 : : typedef Distance distance_type;
34 : :
35 : : mutable bool _omit_query_point;
36 : : mutable distance_type _min_distance;
37 : : mutable node_type *_nearest;
38 : : mutable key_type _query;
39 : :
40 : 207 : void find(node_type * const node) const {
41 [ + + ][ + + ]: 207 : if(node == 0)
[ + + ]
42 : 207 : return;
43 : :
44 : 151 : const discriminator_type discriminator = node->discriminator;
45 : 151 : const key_type & point = node->point();
46 : 151 : distance_type d2 = euclidean_distance<key_type>::d2(_query, point);
47 : :
48 [ + + ][ + + ]: 151 : if(d2 < _min_distance && (d2 != 0 || !_omit_query_point)) {
[ + + + + ]
[ + + ]
[ + + + + ]
[ + + ][ + + ]
49 : 80 : _min_distance = d2;
50 : 80 : _nearest = node;
51 : : }
52 : :
53 : : // Distance to partition plane.
54 : : const distance_type dp =
55 : : static_cast<distance_type>(_query[discriminator]) -
56 : 151 : static_cast<distance_type>(point[discriminator]);
57 : :
58 : 151 : d2 = dp*dp;
59 : :
60 [ + + + + : 151 : if(dp < 0) {
+ + ]
61 : 91 : find(node->child_low);
62 [ + + + + : 91 : if(d2 < _min_distance) {
+ + ]
63 : 13 : find(node->child_high);
64 : : }
65 : : } else {
66 : 60 : find(node->child_high);
67 [ + + + + : 60 : if(d2 < _min_distance) {
+ + ]
68 : 20 : find(node->child_low);
69 : : }
70 : : }
71 : : }
72 : :
73 : : public:
74 : :
75 : 23 : kd_tree_nearest_neighbor() { }
76 : :
77 : 23 : node_type * find(node_type * const root, const key_type & query,
78 : : const bool omit_query_point) const
79 : : {
80 : 23 : _omit_query_point = omit_query_point;
81 : 23 : _min_distance = coordinate_limits<distance_type>::highest();
82 : 23 : _nearest = 0;
83 : 23 : _query = query;
84 : :
85 : 23 : find(root);
86 : :
87 : 23 : return _nearest;
88 : : }
89 : : };
90 : :
91 : : }
92 : :
93 : : __END_NS_SSRC_SPATIAL
94 : :
95 : : #endif
|
Copyright © 2017 Savarese Software Research Corporation. All rights reserved