astar

package
v0.6.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Aug 14, 2024 License: MIT Imports: 2 Imported by: 0

Documentation

Index

Examples

Constants

This section is empty.

Variables

This section is empty.

Functions

func Find

func Find[I constraints.Ordered, T any](graph Graph[I, T], start, end T, cost, heuristic func(a, b T) float64) []T

Find 使用 A* 算法在导航网格上查找从起点到终点的最短路径,并返回路径上的节点序列。

参数:

  • graph: 图对象,类型为 Graph[Node],表示导航网格。
  • start: 起点节点,类型为 Node,表示路径的起点。
  • end: 终点节点,类型为 Node,表示路径的终点。
  • cost: 路径代价函数,类型为 func(a, b Node) V,用于计算两个节点之间的代价。
  • heuristic: 启发函数,类型为 func(a, b Node) V,用于估计从当前节点到目标节点的启发式代价。

返回值:

  • []Node: 节点序列,表示从起点到终点的最短路径。如果找不到路径,则返回空序列。

注意事项:

  • graph 对象表示导航网格,其中包含了节点和连接节点的边。
  • start 和 end 分别表示路径的起点和终点。
  • cost 函数用于计算两个节点之间的代价,可以根据实际情况自定义实现。
  • heuristic 函数用于估计从当前节点到目标节点的启发式代价,可以根据实际情况自定义实现。
  • 函数使用了 A* 算法来搜索最短路径。
  • 函数内部使用了堆数据结构来管理待处理的节点。
  • 函数返回一个节点序列,表示从起点到终点的最短路径。如果找不到路径,则返回空序列。
Example
package main

import (
	"fmt"
	"github.com/kercylan98/minotaur/toolkit/geometry"
	"github.com/kercylan98/minotaur/toolkit/navigate/astar"
)

type Graph struct {
	geometry.FloorPlan
}

type Entity struct {
	geometry.Vector2
}

func (g *Graph) GetNodeId(node *Entity) int {
	x, y := node.GetXY()
	a, b := int(x), int(y)
	mergedNumber := (a << 16) | (b & 0xFFFFFFFF)
	return mergedNumber
}

func (g *Graph) GetNeighbours(t *Entity) []*Entity {
	var neighbours []*Entity
	for _, direction := range geometry.Direction2D4() {
		next := geometry.CalcOffsetInDirection2D(t.Vector2, direction, 1)
		if g.FloorPlan.IsFree(next) {
			neighbours = append(neighbours, &Entity{
				Vector2: next,
			})
		}
	}
	return neighbours
}

func main() {
	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[int, *Entity](
		&graph,
		&Entity{geometry.NewVector2(1, 1)},
		&Entity{geometry.NewVector2(8, 6)},
		// 曼哈顿距离
		func(a, b *Entity) float64 {
			return a.Sub(b.Vector2).Length()
		},
		func(a, b *Entity) float64 {
			return a.Sub(b.Vector2).Length()
		},
	)

	for _, path := range paths {
		graph.Put(path.Vector2, '.')
	}

	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
===========

Types

type Graph

type Graph[I constraints.Ordered, T any] interface {
	// GetNodeId 返回节点的唯一标识。
	GetNodeId(node T) I
	// GetNeighbours 返回与给定节点相邻的节点列表。
	GetNeighbours(t T) []T
}

Graph 适用于 A* 算法的图数据结构接口定义,表示导航网格,其中包含了节点和连接节点的边。

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL