-
-
Notifications
You must be signed in to change notification settings - Fork 152
/
Copy pathkd-tree-set.ts
92 lines (73 loc) · 1.82 KB
/
kd-tree-set.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
// SPDX-License-Identifier: Apache-2.0
import type { ICopy, IEmpty, Pair } from "@thi.ng/api";
import type { DistanceFn, ReadonlyVec } from "@thi.ng/vectors";
import type { IRegionQuery, ISpatialSet } from "./api.js";
import { KdTreeMap } from "./kd-tree-map.js";
export class KdTreeSet<K extends ReadonlyVec>
implements
ICopy<KdTreeSet<K>>,
IEmpty<KdTreeSet<K>>,
IRegionQuery<K, K, number>,
ISpatialSet<K>
{
protected tree: KdTreeMap<K, K>;
constructor(dim: number, keys?: Iterable<K>, distanceFn?: DistanceFn) {
this.tree = new KdTreeMap(dim, undefined, distanceFn);
keys && this.into(keys);
}
[Symbol.iterator]() {
return this.tree.keys();
}
keys() {
return this.tree.keys();
}
values() {
return this.tree.keys();
}
get size() {
return this.tree.size;
}
get height() {
return this.tree.height;
}
get ratio() {
return this.tree.ratio;
}
copy() {
return new KdTreeSet<K>(this.tree.dim, this, this.tree.distanceFn);
}
clear() {
this.tree.clear();
}
empty() {
return new KdTreeSet<K>(this.tree.dim, undefined, this.tree.distanceFn);
}
add(key: K, eps?: number) {
return this.tree.set(key, key, eps);
}
into(ks: Iterable<K>, eps?: number) {
let ok = true;
for (let k of ks) {
ok = this.tree.set(k, k, eps) && ok;
}
return ok;
}
remove(key: K) {
return this.tree.remove(key);
}
has(key: K, eps?: number) {
return this.tree.has(key, eps);
}
get(key: K, eps?: number) {
return this.tree.get(key, eps);
}
query(q: K, maxDist: number, limit?: number, acc?: Pair<K, K>[]) {
return this.tree.query(q, maxDist, limit, acc);
}
queryKeys(q: K, maxDist: number, limit?: number, acc?: K[]) {
return this.tree.queryKeys(q, maxDist, limit, acc);
}
queryValues(q: K, maxDist: number, limit?: number, acc?: K[]) {
return this.tree.queryKeys(q, maxDist, limit, acc);
}
}