/astar

Golang A* pathfinding

Primary LanguageGo

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, ▓=blockedS▓▓░░░▓▓▓▓░▓▓▓▓▓▓▓░▓▓▓▓▓░▓░▓▓
▓░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▓▓▓░▓░░░░░▓▓▓░░░▓░░░▓░▓
▓░▓░░▓▓▓░▓▓▓░▓▓▓▓▓░▓▓▓▓▓▓▓▓▓░▓