@@ -3,15 +3,24 @@ package sketchy
3
3
import "github.com/tdewolff/canvas"
4
4
5
5
type KDTree struct {
6
- point Point
6
+ point * Point
7
7
region Rect
8
8
left * KDTree
9
9
right * KDTree
10
10
}
11
11
12
- func NewKDTree (p Point , r Rect ) * KDTree {
12
+ func NewKDTree (r Rect ) * KDTree {
13
13
return & KDTree {
14
- point : p ,
14
+ point : nil ,
15
+ region : r ,
16
+ left : nil ,
17
+ right : nil ,
18
+ }
19
+ }
20
+
21
+ func NewKDTreeWithPoint (p Point , r Rect ) * KDTree {
22
+ return & KDTree {
23
+ point : & p ,
15
24
region : r ,
16
25
left : nil ,
17
26
right : nil ,
@@ -29,8 +38,8 @@ func (k *KDTree) Insert(p Point) {
29
38
func (k * KDTree ) Query (r Rect ) []Point {
30
39
var results []Point
31
40
if k .IsLeaf () {
32
- if r .ContainsPoint (k .point ) {
33
- results = append (results , k .point )
41
+ if r .ContainsPoint (* k .point ) {
42
+ results = append (results , * k .point )
34
43
}
35
44
return results
36
45
}
@@ -77,11 +86,16 @@ func (k *KDTree) DrawWithPoints(s float64, ctx *canvas.Context) {
77
86
}
78
87
79
88
func (k * KDTree ) Clear () {
89
+ k .point = nil
80
90
k .left = nil
81
91
k .right = nil
82
92
}
83
93
84
94
func (k * KDTree ) insert (p Point , d int ) {
95
+ if k .point == nil {
96
+ k .point = & p
97
+ return
98
+ }
85
99
if d % 2 == 0 { // compare x value
86
100
if p .X < k .point .X {
87
101
if k .left == nil {
@@ -91,7 +105,7 @@ func (k *KDTree) insert(p Point, d int) {
91
105
W : k .point .X - k .region .X ,
92
106
H : k .region .H ,
93
107
}
94
- k .left = NewKDTree (p , rect )
108
+ k .left = NewKDTreeWithPoint (p , rect )
95
109
} else {
96
110
k .left .insert (p , d + 1 )
97
111
}
@@ -103,7 +117,7 @@ func (k *KDTree) insert(p Point, d int) {
103
117
W : k .region .W - (k .point .X - k .region .X ),
104
118
H : k .region .H ,
105
119
}
106
- k .right = NewKDTree (p , rect )
120
+ k .right = NewKDTreeWithPoint (p , rect )
107
121
} else {
108
122
k .right .insert (p , d + 1 )
109
123
}
@@ -117,7 +131,7 @@ func (k *KDTree) insert(p Point, d int) {
117
131
W : k .region .W ,
118
132
H : k .point .Y - k .region .Y ,
119
133
}
120
- k .left = NewKDTree (p , rect )
134
+ k .left = NewKDTreeWithPoint (p , rect )
121
135
} else {
122
136
k .left .insert (p , d + 1 )
123
137
}
@@ -129,7 +143,7 @@ func (k *KDTree) insert(p Point, d int) {
129
143
W : k .region .W ,
130
144
H : k .region .H - (k .point .Y - k .region .Y ),
131
145
}
132
- k .right = NewKDTree (p , rect )
146
+ k .right = NewKDTreeWithPoint (p , rect )
133
147
} else {
134
148
k .right .insert (p , d + 1 )
135
149
}
@@ -139,7 +153,7 @@ func (k *KDTree) insert(p Point, d int) {
139
153
140
154
func (k * KDTree ) reportSubtree () []Point {
141
155
var results []Point
142
- results = append (results , k .point )
156
+ results = append (results , * k .point )
143
157
if k .left != nil {
144
158
results = append (results , k .left .reportSubtree ()... )
145
159
}
@@ -150,6 +164,9 @@ func (k *KDTree) reportSubtree() []Point {
150
164
}
151
165
152
166
func (k * KDTree ) draw (ctx * canvas.Context , depth int , pointSize float64 ) {
167
+ if k .point == nil {
168
+ return
169
+ }
153
170
if depth % 2 == 0 {
154
171
ctx .MoveTo (k .point .X , k .region .Y )
155
172
ctx .LineTo (k .point .X , k .region .Y + k .region .H )
0 commit comments