GO-PATH [WIP]
A* pathfinding and optional smoothing. Support the grid width, height in (0, 65535)
Usage
array2d := [][]int{
{1, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1},
{1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 1, 1, 0},
{1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0},
{0, 1, 0, 1, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 1},
{1, 1, 0, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 0},
{1, 0, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 0, 1, 0, 0, 1, 0, 0, 0, 1, 1, 1, 0, 1, 0, 1, 1, 1, 0},
{1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1},
{1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 0, 1},
{0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 1},
{1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 1, 1, 1, 1, 0, 1, 0, 0, 1, 0, 1},
{0, 1, 0, 1, 0, 1, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 1, 1, 0, 1, 0, 1},
{1, 1, 0, 1, 0, 0, 0, 0, 1, 1, 0, 1, 0, 1, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 1, 1, 1},
{1, 0, 0, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 1, 0, 0, 0, 1, 0},
{1, 1, 0, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 0},
{0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 0, 1, 0, 0, 1},
{1, 1, 1, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1},
{1, 0, 1, 0, 0, 0, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 0, 1, 1, 0, 0, 1},
{0, 0, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 1},
{1, 1, 1, 0, 1, 0, 0, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0},
{1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1},
{1, 1, 1, 0, 0, 1, 1, 1, 0, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0, 1},
{1, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 1},
{1, 0, 1, 0, 1, 1, 0, 1, 1, 1, 0, 1, 0, 1, 0, 0, 1, 1, 0, 1, 1, 1, 0, 0, 0, 1, 0, 1, 0, 0},
{1, 0, 1, 1, 1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 0, 1},
{1, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 1, 1, 1},
{1, 0, 1, 0, 1, 1, 1, 0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 0, 1, 1, 0, 0, 0, 1},
{1, 1, 1, 0, 1, 0, 1, 1, 0, 1, 1, 0, 0, 1, 0, 0, 1, 1, 1, 0, 1, 1, 0, 0, 0, 1, 1, 1, 0, 1},
{0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 0, 1, 0, 1},
{1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 0, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1},
{1, 0, 1, 0, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1},
}
var width = 30
var height = 30
buf, err := g.BytesFrom2DArray(width, height, array2d)
if err != nil {
fmt.Println(err)
}
grid := g.Grid{
Width: width,
Height: height,
Bytes: buf,
}
sF := syncfinder.SyncFinder{}
path, _, err := sF.FindPath(1, 0, 6, 28, grid, true, true, false)
if err != nil {
fmt.Println(err)
}
fmt.Println(grid.ToString(1<<16|0, 6<<16|28, path))
[Grid(width=30, height=30)]
Dump: ░=walkable, ▓=blocked
▓S▓▓░░░▓▓▓▓░▓▓▓▓▓▓▓░▓▓▓▓▓░▓░▓▓
▓░1▓▓▓▓▓░░▓▓░░░▓░░▓░░▓░░▓░▓▓▓░
▓▓2▓░░░░░░░▓▓▓░▓░░▓░░▓░▓▓░▓░▓░
░▓3▓▓▓░▓▓░▓▓░▓░▓▓░▓░▓▓░▓░░▓░▓▓
▓▓░4░▓░▓░░▓░░▓░░▓░▓▓▓░░▓▓░▓░░░
▓░▓▓5▓░▓▓▓▓▓░▓░░▓░░░▓▓▓░▓░▓▓▓░
▓░▓░░67890123░▓░▓▓▓░░░░░▓░░░▓▓
▓▓▓░░▓▓▓▓▓▓▓▓4▓░░░▓▓▓▓▓░▓▓▓░░▓
░░░▓▓▓░░98765░▓▓▓▓░░░░▓░░░▓▓░▓
▓▓░▓░▓░▓0▓▓▓▓▓░░░▓░▓▓▓▓░▓░░▓░▓
░▓░▓░▓▓1░▓░▓░░░░▓▓░░░▓░░▓▓░▓░▓
▓▓░▓░32░▓▓░▓░▓▓▓▓░░░▓▓░░▓░░▓▓▓
▓░░▓4░▓▓▓░░▓▓▓░░░░▓▓▓░▓▓▓░░░▓░
▓▓░▓5▓▓░░░░░░░░░▓▓▓░░░░░▓░▓▓▓░
░▓░▓6▓░▓▓▓▓▓▓▓░▓▓░▓▓░▓▓▓▓░▓░░▓
▓▓▓▓7▓░░░▓░░░▓░░░░░▓░░░▓░░▓░░▓
▓░▓░░8▓▓░▓▓▓░▓▓▓▓▓░▓░▓▓▓░▓▓░░▓
░░▓▓▓░9▓▓░░▓░░░░░▓▓▓░░▓░░▓░░▓▓
▓▓▓░▓░0░▓▓░▓▓░▓▓░░░░▓▓▓▓▓▓▓▓▓░
▓░░░▓░░1░▓░░▓▓▓░░▓░░▓░░░░░░░▓▓
▓▓▓░░▓▓▓2▓▓▓░░▓▓░▓▓▓▓░▓▓▓▓░░░▓
▓░▓░░▓░▓░3░▓░▓░▓▓░░░░▓▓░░▓░▓▓▓
▓░▓░▓▓░▓▓▓4▓░▓░░▓▓░▓▓▓░░░▓░▓░░
▓░▓▓▓░▓765░▓░▓░░░▓▓▓░▓▓░▓▓░▓░▓
▓░░░░░▓8▓▓▓▓░▓░░░░░░░░▓░▓░░▓▓▓
▓░▓░▓▓▓9░░▓░░▓▓▓▓░▓▓▓░▓░▓▓░░░▓
▓▓▓░▓░▓▓0▓▓░░▓░░▓▓▓░▓▓░░░▓▓▓░▓
░▓░░▓░21░▓░▓▓▓▓▓░░░░░▓▓▓░▓░▓░▓
▓▓▓░▓▓E▓▓▓░▓░░░░░▓▓▓░░░▓░░░▓░▓
▓░▓░░▓▓▓░▓▓▓░▓▓▓▓▓░▓▓▓▓▓▓▓▓▓░▓
enable smoothing
sF.FindPath(1, 0, 6, 28, grid, true, true, true)
▓S▓▓░░░▓▓▓▓░▓▓▓▓▓▓▓░▓▓▓▓▓░▓░▓▓
▓░░░▓▓▓▓░░▓▓░░░▓░░▓░░▓░░▓░▓▓▓░
▓▓░░░░░░░░░▓▓▓░▓░░▓░░▓░▓▓░▓░▓░
░▓░░░▓░▓▓░▓▓░▓░▓▓░▓░▓▓░▓░░▓░▓▓
▓▓░░░▓░▓░░▓░░▓░░▓░▓▓▓░░▓▓░▓░░░
▓░▓░1▓░▓▓▓▓▓░▓░░▓░░░▓▓▓░▓░▓▓▓░
▓░▓░░2░░░░░░3░▓░▓▓▓░░░░░▓░░░▓▓
▓▓▓░░░▓▓▓▓▓▓▓4▓░░░▓▓▓▓▓░▓▓▓░░▓
░░░▓▓▓░░6░░░5░▓▓▓▓░░░░▓░░░▓▓░▓
▓▓░▓░▓░▓7▓▓▓▓▓░░░▓░▓▓▓▓░▓░░▓░▓
░▓░▓░▓▓░░▓░▓░░░░▓▓░░░▓░░▓▓░▓░▓
▓▓░▓░░8░▓▓░▓░▓▓▓▓░░░▓▓░░▓░░▓▓▓
▓░░▓9░▓▓▓░░▓▓▓░░░░▓▓▓░▓▓▓░░░▓░
▓▓░▓░▓▓░░░░░░░░░▓▓▓░░░░░▓░▓▓▓░
░▓░▓░▓░▓▓▓▓▓▓▓░▓▓░▓▓░▓▓▓▓░▓░░▓
▓▓▓▓0▓░░░▓░░░▓░░░░░▓░░░▓░░▓░░▓
▓░▓░░░▓▓░▓▓▓░▓▓▓▓▓░▓░▓▓▓░▓▓░░▓
░░▓▓▓░░▓▓░░▓░░░░░▓▓▓░░▓░░▓░░▓▓
▓▓▓░▓░1░▓▓░▓▓░▓▓░░░░▓▓▓▓▓▓▓▓▓░
▓░░░▓░░░░▓░░▓▓▓░░▓░░▓░░░░░░░▓▓
▓▓▓░░▓▓▓░▓▓▓░░▓▓░▓▓▓▓░▓▓▓▓░░░▓
▓░▓░░▓░▓░░░▓░▓░▓▓░░░░▓▓░░▓░▓▓▓
▓░▓░▓▓░▓▓▓2▓░▓░░▓▓░▓▓▓░░░▓░▓░░
▓░▓▓▓░▓4░3░▓░▓░░░▓▓▓░▓▓░▓▓░▓░▓
▓░░░░░▓░▓▓▓▓░▓░░░░░░░░▓░▓░░▓▓▓
▓░▓░▓▓▓5░░▓░░▓▓▓▓░▓▓▓░▓░▓▓░░░▓
▓▓▓░▓░▓▓6▓▓░░▓░░▓▓▓░▓▓░░░▓▓▓░▓
░▓░░▓░87░▓░▓▓▓▓▓░░░░░▓▓▓░▓░▓░▓
▓▓▓░▓▓E▓▓▓░▓░░░░░▓▓▓░░░▓░░░▓░▓
▓░▓░░▓▓▓░▓▓▓░▓▓▓▓▓░▓▓▓▓▓▓▓▓▓░▓