AABB
AlignmentBehavior
ArriveBehavior
AStar
BFS
BoundingSphere
BVH
BVHNode
Cell
CellSpacePartitioning
CohesionBehavior
CompositeGoal
ConvexHull
Corridor
CostTable
DFS
Dijkstra
Edge
EntityManager
EvadeBehavior
EventDispatcher
Behavior
FollowPathBehavior
FuzzyAND
FuzzyCompositeTerm
FuzzyFAIRLY
FuzzyModule
FuzzyOR
FuzzyRule
FuzzySet
FuzzyTerm
FuzzyVariable
FuzzyVERY
GameEntity
Goal
GoalEvaluator
Graph
GraphUtils
HalfEdge
HeuristicPolicyDijkstra
HeuristicPolicyEuclid
HeuristicPolicyEuclidSquared
HeuristicPolicyManhattan
InterposeBehavior
LeftSCurveFuzzySet
LeftShoulderFuzzySet
LineSegment
Logger
MathUtils
Matrix3
Matrix4
MemoryRecord
MemorySystem
MeshGeometry
MessageDispatcher
MovingEntity
NavEdge
NavMesh
NavMeshLoader
NavNode
Node
NormalDistFuzzySet
OBB
ObstacleAvoidanceBehavior
OffsetPursuitBehavior
OnPathBehavior
Path
Plane
Polygon
Polyhedron
PriorityQueue
PursuitBehavior
Quaternion
Ray
RectangleTriggerRegion
Regular
RightSCurveFuzzySet
RightShoulderFuzzySet
SAT
SeekBehavior
SeparationBehavior
SingletonFuzzySet
Smoother
SphericalTriggerRegion
State
StateMachine
SteeringBehavior
SteeringManager
Task
TaskQueue
Telegram
Think
Time
TriangularFuzzySet
Trigger
TriggerRegion
Vector3
Vehicle
Version
WanderBehavior

Graph

Graph 是 Yuka.js 库的深度优先搜索 (DFS) 算法中用到的图形数据结构。

图形数据结构由一组节点(或顶点)和一组边组成。在 Yuka.js 库中,图形使用邻接列表来表示。

邻接列表

邻接列表是无向图或有向图中,每个节点的相邻节点的数据结构列表。在无向图中,邻接列表包含所有相邻的节点,而在有向图中则包含所有从该节点开始的出边或入边。

在 Yuka.js 库中,邻接列表使用 Map 对象实现,键为节点编号,值为相邻节点列表。例如:

const graph = new Map();

graph.set(0, [1, 2, 3]);
graph.set(1, [0, 2]);
graph.set(2, [0, 1]);
graph.set(3, [0]);

上述代码表示一个无向图,每个节点的编号分别为 0,1,2,3。节点 0 与节点 1,2,3 相邻,节点 1 与节点 0,2 相邻,以此类推。

DFS

深度优先搜索是一种用于遍历或搜索树或图的算法。在遍历节点时,从一个节点出发,不断地向某个相邻节点移动,直到遇到无法满足条件的节点,然后回溯到上一个节点,继续搜索其他相邻节点,如此往复直到遍历完所有可达的节点。

在 Yuka.js 库中,深度优先搜索算法使用的是递归实现。搜索过程中维护了一个 visitedSet 集合,用于存储已访问过的节点编号。搜索过程中,首先将起点节点加入 visitedSet 集合,然后依次访问当前节点的相邻节点。若相邻节点未被访问过,则递归访问该节点。若相邻节点已访问过,则忽略该节点。如下是 Yuka.js 库中深度优先搜索算法的示例代码:

function dfs(graph, startNode, fn) {
  const visitedSet = new Set();

  (function traverse(node) {
    visitedSet.add(node);

    fn(node);

    const adjacentNodes = graph.get(node);

    for (const adjacentNode of adjacentNodes) {
      if (!visitedSet.has(adjacentNode)) {
        traverse(adjacentNode);
      }
    }
  })(startNode);
}

在以上代码中,graph 代表邻接列表,startNode 代表起点节点,fn 代表回调函数。函数 traverse 是一个自调函数,通过递归遍历相邻节点。在遍历过程中,从 visitedSet 集合中检查节点是否已被访问过,在遍历完当前节点后,继续递归遍历相邻节点。最终搜索完所有可达节点。

结语

Graph 是 Yuka.js 库深度优先搜索算法中使用的图形数据结构,使用邻接列表表示。深度优先搜索算法使用递归实现,维护 visitedSet 集合记录已访问过的节点。在访问当前节点的相邻节点时,若相邻节点未被访问过,则递归访问该节点。最终遍历完所有可达节点。