UNPKG

@esengine/pathfinding

Version:

寻路算法库,支持A*、广度优先等算法,适用于Cocos Creator、Laya等游戏引擎

102 lines (91 loc) 2.56 kB
/** * 通用Vector2接口,兼容Cocos Creator和Laya引擎的Vector2类型 * 支持 cc.Vec2, Laya.Vector2 等 */ export interface IVector2 { x: number; y: number; } /** * 可比较的Vector2接口,用于路径查找算法 */ export interface IComparableVector2 extends IVector2 { /** * 判断两个向量是否相等 */ equals?(other: IVector2): boolean; } /** * Vector2工具类,提供通用的向量操作 */ export class Vector2Utils { // 哈希计算相关常量 private static readonly HASH_MULTIPLIER = 73856093; private static readonly MAX_COORD = 32767; /** * 判断两个向量是否相等 */ static equals(a: IVector2, b: IVector2): boolean { if ((a as IComparableVector2).equals) { return (a as IComparableVector2).equals!(b); } return a.x === b.x && a.y === b.y; } /** * 创建一个新的Vector2对象 */ static create(x: number, y: number): IVector2 { return { x, y }; } /** * 复制Vector2 */ static clone(vector: IVector2): IVector2 { return { x: vector.x, y: vector.y }; } /** * 向量加法 */ static add(a: IVector2, b: IVector2): IVector2 { return { x: a.x + b.x, y: a.y + b.y }; } /** * 计算曼哈顿距离 */ static manhattanDistance(a: IVector2, b: IVector2): number { return Math.abs(a.x - b.x) + Math.abs(a.y - b.y); } /** * 计算欧几里得距离 */ static distance(a: IVector2, b: IVector2): number { const dx = a.x - b.x; const dy = a.y - b.y; return Math.sqrt(dx * dx + dy * dy); } /** * 将Vector2转换为数值哈希键 * 使用位运算生成哈希值,支持坐标范围:-32767 到 32767 */ static toHash(vector: IVector2): number { const x = (vector.x + this.MAX_COORD) | 0; const y = (vector.y + this.MAX_COORD) | 0; return (x << 16) | y; } /** * 将Vector2转换为字符串键 * 用于需要字符串键的场景 */ static toKey(vector: IVector2): string { return `${vector.x},${vector.y}`; } /** * 从哈希值还原坐标 * 主要用于调试 */ static fromHash(hash: number): IVector2 { const x = (hash >> 16) - this.MAX_COORD; const y = (hash & 0xFFFF) - this.MAX_COORD; return { x, y }; } }