-
Notifications
You must be signed in to change notification settings - Fork 0
/
geo_test.go
92 lines (76 loc) · 1.85 KB
/
geo_test.go
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
package astar
import (
"fmt"
"testing"
"github.com/wkhere/astar/graphs/geo"
)
var Point = geo.Point
// TODO:
// need more dense graph to test & benchmark non-trivial paths
func ExampleL() {
fmt.Println(Astar(L("Wałcz"), L("")))
fmt.Println(Astar(L("Wałcz"), L("Wałcz")))
fmt.Println(Astar(L("Wałcz"), L("Warszawa")))
fmt.Println(Astar(L("Warszawa"), L("Wałcz")))
fmt.Println(Astar(L("Wałcz"), L("Poznań")))
// Output:
// []
// []
// [Warszawa]
// [Wałcz]
// [Trzcianka Poznań]
}
func BenchmarkGeo(b *testing.B) {
for n := 0; n < b.N; n++ {
Astar(L("Wałcz"), L("Wałcz"))
Astar(L("Wałcz"), L("Warszawa"))
Astar(L("Wałcz"), L("Poznań"))
}
}
type L string // Location
func (l1 L) Nbs() []Node {
return nbs[l1]
}
func (l1 L) DistanceTo(n2 Node) (v Cost) {
l2 := n2.(L)
v, ok := distLookup(l1, l2)
if !ok {
panic(fmt.Sprintf("no dist for %v,%v", l1, l2))
}
return
}
func (l1 L) EstimateTo(n2 Node) Cost {
return Cost(geo.H(coords[l1], coords[n2.(L)]))
}
var coords = map[L]geo.Pt{
"Wałcz": Point(53.283853, 16.470173),
"Trzcianka": Point(53.0427712, 16.3763841),
"Piła": Point(53.1347933, 16.6195561),
"Poznań": Point(52.408031, 16.920613),
"Warszawa": Point(52.230069, 21.018513),
}
type locationPair struct{ l1, l2 L }
var distances = map[locationPair]Cost{
// these are arbitrary distances taken from real maps
{"Wałcz", "Trzcianka"}: 31,
{"Trzcianka", "Poznań"}: 88,
{"Wałcz", "Piła"}: 28,
{"Piła", "Poznań"}: 96,
{"Wałcz", "Warszawa"}: 421,
{"Poznań", "Warszawa"}: 310,
}
var nbs = map[Node][]Node{}
func init() {
for k := range distances {
nbs[k.l1] = append(nbs[k.l1], k.l2)
nbs[k.l2] = append(nbs[k.l2], k.l1)
}
}
func distLookup(l1, l2 L) (v Cost, ok bool) {
v, ok = distances[locationPair{l1, l2}]
if ok {
return
}
v, ok = distances[locationPair{l2, l1}]
return
}