1
1
package sketchy
2
2
3
- import "github.com/tdewolff/canvas"
3
+ import (
4
+ "container/heap"
5
+ "github.com/tdewolff/canvas"
6
+ )
4
7
5
8
type KDTree struct {
6
9
point * Point
@@ -67,6 +70,27 @@ func (k *KDTree) Query(r Rect) []Point {
67
70
return results
68
71
}
69
72
73
+ func (k * KDTree ) NearestNeighbors (point Point , s int ) []Point {
74
+ var result []Point
75
+ if s <= 0 {
76
+ return result
77
+ }
78
+ ph := & PointHeap {
79
+ size : s ,
80
+ points : []MetricPoint {},
81
+ }
82
+ heap .Init (ph )
83
+ k .pushOnHeap (point , ph )
84
+ result = ph .Report ()
85
+ return result
86
+ }
87
+
88
+ func (k * KDTree ) Clear () {
89
+ k .point = nil
90
+ k .left = nil
91
+ k .right = nil
92
+ }
93
+
70
94
func (k * KDTree ) Size () int {
71
95
count := 1
72
96
if k .left != nil {
@@ -86,12 +110,6 @@ func (k *KDTree) DrawWithPoints(s float64, ctx *canvas.Context) {
86
110
k .draw (ctx , 0 , s )
87
111
}
88
112
89
- func (k * KDTree ) Clear () {
90
- k .point = nil
91
- k .left = nil
92
- k .right = nil
93
- }
94
-
95
113
func (k * KDTree ) insert (p Point , d int ) {
96
114
if k .point == nil {
97
115
k .point = & p
@@ -188,3 +206,18 @@ func (k *KDTree) draw(ctx *canvas.Context, depth int, pointSize float64) {
188
206
k .right .draw (ctx , depth + 1 , pointSize )
189
207
}
190
208
}
209
+
210
+ func (k * KDTree ) pushOnHeap (target Point , h * PointHeap ) {
211
+ if k .point != nil {
212
+ heap .Push (h , MetricPoint {
213
+ Metric : SquaredDistance (target , * k .point ),
214
+ Point : * k .point ,
215
+ })
216
+ }
217
+ if k .left != nil {
218
+ k .left .pushOnHeap (target , h )
219
+ }
220
+ if k .right != nil {
221
+ k .right .pushOnHeap (target , h )
222
+ }
223
+ }
0 commit comments