🎨 A* 示例测试实现
This commit is contained in:
parent
3e07449c87
commit
46c262574b
|
@ -0,0 +1,60 @@
|
||||||
|
package astar_test
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/kercylan98/minotaur/utils/astar"
|
||||||
|
"github.com/kercylan98/minotaur/utils/geometry"
|
||||||
|
)
|
||||||
|
|
||||||
|
type Graph struct {
|
||||||
|
geometry.FloorPlan
|
||||||
|
}
|
||||||
|
|
||||||
|
func (slf Graph) Neighbours(point geometry.Point[int]) []geometry.Point[int] {
|
||||||
|
neighbours := make([]geometry.Point[int], 0, 4)
|
||||||
|
for _, direction := range geometry.DirectionUDLR {
|
||||||
|
np := geometry.GetDirectionNextWithCoordinateArray(direction, point)
|
||||||
|
if slf.IsFree(np) {
|
||||||
|
neighbours = append(neighbours, np)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return neighbours
|
||||||
|
}
|
||||||
|
|
||||||
|
func ExampleFind() {
|
||||||
|
graph := Graph{
|
||||||
|
FloorPlan: geometry.FloorPlan{
|
||||||
|
"===========",
|
||||||
|
"X XX X X",
|
||||||
|
"X X XX X",
|
||||||
|
"X XX X",
|
||||||
|
"X XXX X",
|
||||||
|
"X XX X X",
|
||||||
|
"X XX X X",
|
||||||
|
"===========",
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
paths := astar.Find[geometry.Point[int], int](graph, geometry.NewPoint(1, 1), geometry.NewPoint(8, 6), func(a, b geometry.Point[int]) int {
|
||||||
|
return geometry.CalcDistance(geometry.DoublePointToCoordinate(a, b))
|
||||||
|
}, func(a, b geometry.Point[int]) int {
|
||||||
|
return geometry.CalcDistance(geometry.DoublePointToCoordinate(a, b))
|
||||||
|
})
|
||||||
|
|
||||||
|
for _, path := range paths {
|
||||||
|
graph.Put(path, '.')
|
||||||
|
}
|
||||||
|
|
||||||
|
fmt.Println(graph)
|
||||||
|
|
||||||
|
// Output:
|
||||||
|
// ===========
|
||||||
|
// X.XX X X
|
||||||
|
// X. X XX X
|
||||||
|
// X.XX......X
|
||||||
|
// X.... XXX.X
|
||||||
|
// X XX X ..X
|
||||||
|
// X XX X . X
|
||||||
|
// ===========
|
||||||
|
}
|
Loading…
Reference in New Issue