@esengine/ecs-framework-math 2.10.3 → 2.11.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +1 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +312 -67
- package/dist/index.mjs +1 -1
- package/dist/index.mjs.map +1 -1
- package/dist/index.umd.js +1 -1
- package/dist/index.umd.js.map +1 -1
- package/package.json +1 -1
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","sources":["../bin/Vector2.js","../bin/Vector3.js","../bin/Matrix3.js","../bin/Rectangle.js","../bin/Circle.js","../bin/Fixed32.js","../bin/FixedMath.js","../bin/FixedVector2.js","../bin/MathUtils.js","../bin/Color.js","../bin/Animation/Easing.js","../bin/Animation/Interpolation.js","../bin/nodes/VectorNodes.js","../bin/nodes/FixedNodes.js","../bin/nodes/FixedVectorNodes.js","../bin/nodes/ColorNodes.js","../bin/nodes/index.js","../bin/Collision/CollisionDetector.js"],"sourcesContent":["/**\n * 2D向量类\n *\n * 提供完整的2D向量运算功能,包括:\n * - 基础运算(加减乘除)\n * - 向量运算(点积、叉积、归一化)\n * - 几何运算(距离、角度、投影)\n * - 变换操作(旋转、反射、插值)\n */\nexport class Vector2 {\n /**\n * 创建2D向量\n * @param x X分量,默认为0\n * @param y Y分量,默认为0\n */\n constructor(x = 0, y = 0) {\n this.x = x;\n this.y = y;\n }\n // 基础属性\n /**\n * 获取向量长度(模)\n */\n get length() {\n return Math.sqrt(this.x * this.x + this.y * this.y);\n }\n /**\n * 获取向量长度的平方\n */\n get lengthSquared() {\n return this.x * this.x + this.y * this.y;\n }\n /**\n * 获取向量角度(弧度)\n */\n get angle() {\n return Math.atan2(this.y, this.x);\n }\n /**\n * 检查是否为零向量\n */\n get isZero() {\n return this.x === 0 && this.y === 0;\n }\n /**\n * 检查是否为单位向量\n */\n get isUnit() {\n const lenSq = this.lengthSquared;\n return Math.abs(lenSq - 1) < Number.EPSILON;\n }\n // 基础运算\n /**\n * 设置向量分量\n * @param x X分量\n * @param y Y分量\n * @returns 当前向量实例(链式调用)\n */\n set(x, y) {\n this.x = x;\n this.y = y;\n return this;\n }\n /**\n * 复制另一个向量的值\n * @param other 源向量\n * @returns 当前向量实例(链式调用)\n */\n copy(other) {\n this.x = other.x;\n this.y = other.y;\n return this;\n }\n /**\n * 克隆当前向量\n * @returns 新的向量实例\n */\n clone() {\n return new Vector2(this.x, this.y);\n }\n /**\n * 向量加法\n * @param other 另一个向量\n * @returns 当前向量实例(链式调用)\n */\n add(other) {\n this.x += other.x;\n this.y += other.y;\n return this;\n }\n /**\n * 向量减法\n * @param other 另一个向量\n * @returns 当前向量实例(链式调用)\n */\n subtract(other) {\n this.x -= other.x;\n this.y -= other.y;\n return this;\n }\n /**\n * 向量数乘\n * @param scalar 标量\n * @returns 当前向量实例(链式调用)\n */\n multiply(scalar) {\n this.x *= scalar;\n this.y *= scalar;\n return this;\n }\n /**\n * 向量数除\n * @param scalar 标量\n * @returns 当前向量实例(链式调用)\n */\n divide(scalar) {\n if (scalar === 0) {\n throw new Error('不能除以零');\n }\n this.x /= scalar;\n this.y /= scalar;\n return this;\n }\n /**\n * 向量取反\n * @returns 当前向量实例(链式调用)\n */\n negate() {\n this.x = -this.x;\n this.y = -this.y;\n return this;\n }\n // 向量运算\n /**\n * 计算与另一个向量的点积\n * @param other 另一个向量\n * @returns 点积值\n */\n dot(other) {\n return this.x * other.x + this.y * other.y;\n }\n /**\n * 计算与另一个向量的叉积(2D中返回标量)\n * @param other 另一个向量\n * @returns 叉积值\n */\n cross(other) {\n return this.x * other.y - this.y * other.x;\n }\n /**\n * 向量归一化(转换为单位向量)\n * @returns 当前向量实例(链式调用)\n */\n normalize() {\n const len = this.length;\n if (len === 0) {\n return this;\n }\n return this.divide(len);\n }\n /**\n * 获取归一化后的向量(不修改原向量)\n * @returns 新的单位向量\n */\n normalized() {\n return this.clone().normalize();\n }\n // 几何运算\n /**\n * 计算到另一个向量的距离\n * @param other 另一个向量\n * @returns 距离值\n */\n distanceTo(other) {\n const dx = this.x - other.x;\n const dy = this.y - other.y;\n return Math.sqrt(dx * dx + dy * dy);\n }\n /**\n * 计算到另一个向量的距离平方\n * @param other 另一个向量\n * @returns 距离平方值\n */\n distanceToSquared(other) {\n const dx = this.x - other.x;\n const dy = this.y - other.y;\n return dx * dx + dy * dy;\n }\n /**\n * 计算与另一个向量的夹角(弧度)\n * @param other 另一个向量\n * @returns 夹角(0到π)\n */\n angleTo(other) {\n const dot = this.dot(other);\n const lenProduct = this.length * other.length;\n if (lenProduct === 0)\n return 0;\n return Math.acos(Math.max(-1, Math.min(1, dot / lenProduct)));\n }\n /**\n * 计算向量在另一个向量上的投影\n * @param onto 投影目标向量\n * @returns 新的投影向量\n */\n projectOnto(onto) {\n const dot = this.dot(onto);\n const lenSq = onto.lengthSquared;\n if (lenSq === 0)\n return new Vector2();\n return onto.clone().multiply(dot / lenSq);\n }\n /**\n * 计算向量在另一个向量上的投影长度\n * @param onto 投影目标向量\n * @returns 投影长度(带符号)\n */\n projectOntoLength(onto) {\n const len = onto.length;\n if (len === 0)\n return 0;\n return this.dot(onto) / len;\n }\n /**\n * 获取垂直向量(顺时针旋转90度)\n * Get perpendicular vector (clockwise 90 degrees)\n * @returns 新的垂直向量\n */\n perpendicular() {\n // Clockwise 90° rotation: (x, y) -> (y, -x)\n // 顺时针旋转 90°\n return new Vector2(this.y, -this.x);\n }\n // 变换操作\n /**\n * 向量旋转(顺时针为正)\n * Rotate vector (clockwise positive)\n *\n * 使用左手坐标系约定:正角度 = 顺时针旋转\n * Uses left-hand coordinate system: positive angle = clockwise\n *\n * @param angle 旋转角度(弧度)\n * @returns 当前向量实例(链式调用)\n */\n rotate(angle) {\n const cos = Math.cos(angle);\n const sin = Math.sin(angle);\n // Clockwise rotation: x' = x*cos + y*sin, y' = -x*sin + y*cos\n // 顺时针旋转公式\n const x = this.x * cos + this.y * sin;\n const y = -this.x * sin + this.y * cos;\n this.x = x;\n this.y = y;\n return this;\n }\n /**\n * 获取旋转后的向量(不修改原向量)\n * @param angle 旋转角度(弧度)\n * @returns 新的旋转后向量\n */\n rotated(angle) {\n return this.clone().rotate(angle);\n }\n /**\n * 围绕一个点旋转\n * @param center 旋转中心点\n * @param angle 旋转角度(弧度)\n * @returns 当前向量实例(链式调用)\n */\n rotateAround(center, angle) {\n return this.subtract(center).rotate(angle).add(center);\n }\n /**\n * 反射向量(关于法线)\n * @param normal 法线向量(应为单位向量)\n * @returns 当前向量实例(链式调用)\n */\n reflect(normal) {\n const dot = this.dot(normal);\n this.x -= 2 * dot * normal.x;\n this.y -= 2 * dot * normal.y;\n return this;\n }\n /**\n * 获取反射后的向量(不修改原向量)\n * @param normal 法线向量(应为单位向量)\n * @returns 新的反射向量\n */\n reflected(normal) {\n return this.clone().reflect(normal);\n }\n // 插值和限制\n /**\n * 线性插值\n * @param target 目标向量\n * @param t 插值参数(0到1)\n * @returns 当前向量实例(链式调用)\n */\n lerp(target, t) {\n this.x += (target.x - this.x) * t;\n this.y += (target.y - this.y) * t;\n return this;\n }\n /**\n * 限制向量长度\n * @param maxLength 最大长度\n * @returns 当前向量实例(链式调用)\n */\n clampLength(maxLength) {\n const lenSq = this.lengthSquared;\n if (lenSq > maxLength * maxLength) {\n return this.normalize().multiply(maxLength);\n }\n return this;\n }\n /**\n * 限制向量分量\n * @param min 最小值向量\n * @param max 最大值向量\n * @returns 当前向量实例(链式调用)\n */\n clamp(min, max) {\n this.x = Math.max(min.x, Math.min(max.x, this.x));\n this.y = Math.max(min.y, Math.min(max.y, this.y));\n return this;\n }\n // 比较操作\n /**\n * 检查两个向量是否相等\n * @param other 另一个向量\n * @param epsilon 容差,默认为Number.EPSILON\n * @returns 是否相等\n */\n equals(other, epsilon = Number.EPSILON) {\n return Math.abs(this.x - other.x) < epsilon &&\n Math.abs(this.y - other.y) < epsilon;\n }\n /**\n * 检查两个向量是否完全相等\n * @param other 另一个向量\n * @returns 是否完全相等\n */\n exactEquals(other) {\n return this.x === other.x && this.y === other.y;\n }\n // 静态方法\n /**\n * 向量加法(静态方法)\n * @param a 向量a\n * @param b 向量b\n * @returns 新的结果向量\n */\n static add(a, b) {\n return new Vector2(a.x + b.x, a.y + b.y);\n }\n /**\n * 向量减法(静态方法)\n * @param a 向量a\n * @param b 向量b\n * @returns 新的结果向量\n */\n static subtract(a, b) {\n return new Vector2(a.x - b.x, a.y - b.y);\n }\n /**\n * 向量数乘(静态方法)\n * @param vector 向量\n * @param scalar 标量\n * @returns 新的结果向量\n */\n static multiply(vector, scalar) {\n return new Vector2(vector.x * scalar, vector.y * scalar);\n }\n /**\n * 向量点积(静态方法)\n * @param a 向量a\n * @param b 向量b\n * @returns 点积值\n */\n static dot(a, b) {\n return a.x * b.x + a.y * b.y;\n }\n /**\n * 向量叉积(静态方法)\n * @param a 向量a\n * @param b 向量b\n * @returns 叉积值\n */\n static cross(a, b) {\n return a.x * b.y - a.y * b.x;\n }\n /**\n * 计算两点间距离(静态方法)\n * @param a 点a\n * @param b 点b\n * @returns 距离值\n */\n static distance(a, b) {\n const dx = a.x - b.x;\n const dy = a.y - b.y;\n return Math.sqrt(dx * dx + dy * dy);\n }\n /**\n * 线性插值(静态方法)\n * @param a 起始向量\n * @param b 目标向量\n * @param t 插值参数(0到1)\n * @returns 新的插值结果向量\n */\n static lerp(a, b, t) {\n return new Vector2(a.x + (b.x - a.x) * t, a.y + (b.y - a.y) * t);\n }\n /**\n * 从角度创建单位向量(静态方法)\n * @param angle 角度(弧度)\n * @returns 新的单位向量\n */\n static fromAngle(angle) {\n return new Vector2(Math.cos(angle), Math.sin(angle));\n }\n /**\n * 从极坐标创建向量(静态方法)\n * @param length 长度\n * @param angle 角度(弧度)\n * @returns 新的向量\n */\n static fromPolar(length, angle) {\n return new Vector2(length * Math.cos(angle), length * Math.sin(angle));\n }\n /**\n * 获取两个向量中的最小分量向量(静态方法)\n * @param a 向量a\n * @param b 向量b\n * @returns 新的最小分量向量\n */\n static min(a, b) {\n return new Vector2(Math.min(a.x, b.x), Math.min(a.y, b.y));\n }\n /**\n * 获取两个向量中的最大分量向量(静态方法)\n * @param a 向量a\n * @param b 向量b\n * @returns 新的最大分量向量\n */\n static max(a, b) {\n return new Vector2(Math.max(a.x, b.x), Math.max(a.y, b.y));\n }\n // 字符串转换\n /**\n * 转换为字符串\n * @returns 字符串表示\n */\n toString() {\n return `Vector2(${this.x.toFixed(3)}, ${this.y.toFixed(3)})`;\n }\n /**\n * 转换为数组\n * @returns [x, y] 数组\n */\n toArray() {\n return [this.x, this.y];\n }\n /**\n * 转换为普通对象\n * @returns {x, y} 对象\n */\n toObject() {\n return { x: this.x, y: this.y };\n }\n}\n// 静态常量\n/** 零向量 (0, 0) */\nVector2.ZERO = new Vector2(0, 0);\n/** 单位向量 (1, 1) */\nVector2.ONE = new Vector2(1, 1);\n/** 右方向向量 (1, 0) */\nVector2.RIGHT = new Vector2(1, 0);\n/** 左方向向量 (-1, 0) */\nVector2.LEFT = new Vector2(-1, 0);\n/** 上方向向量 (0, 1) */\nVector2.UP = new Vector2(0, 1);\n/** 下方向向量 (0, -1) */\nVector2.DOWN = new Vector2(0, -1);\n//# sourceMappingURL=Vector2.js.map","/**\n * 3D向量类\n *\n * 提供完整的3D向量运算功能,包括:\n * - 基础运算(加减乘除)\n * - 向量运算(点积、叉积、归一化)\n * - 几何运算(距离、角度、投影)\n * - 变换操作(旋转、反射、插值)\n */\nexport class Vector3 {\n /**\n * 创建3D向量\n * @param x X分量,默认为0\n * @param y Y分量,默认为0\n * @param z Z分量,默认为0\n */\n constructor(x = 0, y = 0, z = 0) {\n this.x = x;\n this.y = y;\n this.z = z;\n }\n // 基础属性\n /**\n * 获取向量长度(模)\n */\n get length() {\n return Math.sqrt(this.x * this.x + this.y * this.y + this.z * this.z);\n }\n /**\n * 获取向量长度的平方\n */\n get lengthSquared() {\n return this.x * this.x + this.y * this.y + this.z * this.z;\n }\n /**\n * 检查是否为零向量\n */\n get isZero() {\n return this.x === 0 && this.y === 0 && this.z === 0;\n }\n /**\n * 检查是否为单位向量\n */\n get isUnit() {\n const lenSq = this.lengthSquared;\n return Math.abs(lenSq - 1) < Number.EPSILON;\n }\n // 基础运算\n /**\n * 设置向量分量\n * @param x X分量\n * @param y Y分量\n * @param z Z分量\n * @returns 当前向量实例(链式调用)\n */\n set(x, y, z) {\n this.x = x;\n this.y = y;\n this.z = z;\n return this;\n }\n /**\n * 复制另一个向量的值\n * @param other 源向量\n * @returns 当前向量实例(链式调用)\n */\n copy(other) {\n this.x = other.x;\n this.y = other.y;\n this.z = other.z;\n return this;\n }\n /**\n * 克隆当前向量\n * @returns 新的向量实例\n */\n clone() {\n return new Vector3(this.x, this.y, this.z);\n }\n /**\n * 向量加法\n * @param other 另一个向量\n * @returns 当前向量实例(链式调用)\n */\n add(other) {\n this.x += other.x;\n this.y += other.y;\n this.z += other.z;\n return this;\n }\n /**\n * 向量减法\n * @param other 另一个向量\n * @returns 当前向量实例(链式调用)\n */\n subtract(other) {\n this.x -= other.x;\n this.y -= other.y;\n this.z -= other.z;\n return this;\n }\n /**\n * 向量数乘\n * @param scalar 标量\n * @returns 当前向量实例(链式调用)\n */\n multiply(scalar) {\n this.x *= scalar;\n this.y *= scalar;\n this.z *= scalar;\n return this;\n }\n /**\n * 向量数除\n * @param scalar 标量\n * @returns 当前向量实例(链式调用)\n */\n divide(scalar) {\n if (scalar === 0) {\n throw new Error('不能除以零');\n }\n this.x /= scalar;\n this.y /= scalar;\n this.z /= scalar;\n return this;\n }\n /**\n * 向量取反\n * @returns 当前向量实例(链式调用)\n */\n negate() {\n this.x = -this.x;\n this.y = -this.y;\n this.z = -this.z;\n return this;\n }\n // 向量运算\n /**\n * 计算与另一个向量的点积\n * @param other 另一个向量\n * @returns 点积值\n */\n dot(other) {\n return this.x * other.x + this.y * other.y + this.z * other.z;\n }\n /**\n * 计算与另一个向量的叉积\n * @param other 另一个向量\n * @returns 新的叉积向量\n */\n cross(other) {\n return new Vector3(this.y * other.z - this.z * other.y, this.z * other.x - this.x * other.z, this.x * other.y - this.y * other.x);\n }\n /**\n * 向量归一化(转换为单位向量)\n * @returns 当前向量实例(链式调用)\n */\n normalize() {\n const len = this.length;\n if (len === 0) {\n return this;\n }\n return this.divide(len);\n }\n /**\n * 获取归一化后的向量(不修改原向量)\n * @returns 新的单位向量\n */\n normalized() {\n return this.clone().normalize();\n }\n // 几何运算\n /**\n * 计算到另一个向量的距离\n * @param other 另一个向量\n * @returns 距离值\n */\n distanceTo(other) {\n const dx = this.x - other.x;\n const dy = this.y - other.y;\n const dz = this.z - other.z;\n return Math.sqrt(dx * dx + dy * dy + dz * dz);\n }\n /**\n * 计算到另一个向量的距离平方\n * @param other 另一个向量\n * @returns 距离平方值\n */\n distanceToSquared(other) {\n const dx = this.x - other.x;\n const dy = this.y - other.y;\n const dz = this.z - other.z;\n return dx * dx + dy * dy + dz * dz;\n }\n /**\n * 计算与另一个向量的夹角(弧度)\n * @param other 另一个向量\n * @returns 夹角(0到π)\n */\n angleTo(other) {\n const dot = this.dot(other);\n const lenProduct = this.length * other.length;\n if (lenProduct === 0)\n return 0;\n return Math.acos(Math.max(-1, Math.min(1, dot / lenProduct)));\n }\n /**\n * 计算向量在另一个向量上的投影\n * @param onto 投影目标向量\n * @returns 新的投影向量\n */\n projectOnto(onto) {\n const dot = this.dot(onto);\n const lenSq = onto.lengthSquared;\n if (lenSq === 0)\n return new Vector3();\n return onto.clone().multiply(dot / lenSq);\n }\n // 插值和限制\n /**\n * 线性插值\n * @param target 目标向量\n * @param t 插值参数(0到1)\n * @returns 当前向量实例(链式调用)\n */\n lerp(target, t) {\n this.x += (target.x - this.x) * t;\n this.y += (target.y - this.y) * t;\n this.z += (target.z - this.z) * t;\n return this;\n }\n /**\n * 限制向量长度\n * @param maxLength 最大长度\n * @returns 当前向量实例(链式调用)\n */\n clampLength(maxLength) {\n const lenSq = this.lengthSquared;\n if (lenSq > maxLength * maxLength) {\n return this.normalize().multiply(maxLength);\n }\n return this;\n }\n // 比较操作\n /**\n * 检查两个向量是否相等\n * @param other 另一个向量\n * @param epsilon 容差,默认为Number.EPSILON\n * @returns 是否相等\n */\n equals(other, epsilon = Number.EPSILON) {\n return Math.abs(this.x - other.x) < epsilon &&\n Math.abs(this.y - other.y) < epsilon &&\n Math.abs(this.z - other.z) < epsilon;\n }\n /**\n * 检查两个向量是否完全相等\n * @param other 另一个向量\n * @returns 是否完全相等\n */\n exactEquals(other) {\n return this.x === other.x && this.y === other.y && this.z === other.z;\n }\n // 静态方法\n /**\n * 向量加法(静态方法)\n * @param a 向量a\n * @param b 向量b\n * @returns 新的结果向量\n */\n static add(a, b) {\n return new Vector3(a.x + b.x, a.y + b.y, a.z + b.z);\n }\n /**\n * 向量减法(静态方法)\n * @param a 向量a\n * @param b 向量b\n * @returns 新的结果向量\n */\n static subtract(a, b) {\n return new Vector3(a.x - b.x, a.y - b.y, a.z - b.z);\n }\n /**\n * 向量数乘(静态方法)\n * @param vector 向量\n * @param scalar 标量\n * @returns 新的结果向量\n */\n static multiply(vector, scalar) {\n return new Vector3(vector.x * scalar, vector.y * scalar, vector.z * scalar);\n }\n /**\n * 向量点积(静态方法)\n * @param a 向量a\n * @param b 向量b\n * @returns 点积值\n */\n static dot(a, b) {\n return a.x * b.x + a.y * b.y + a.z * b.z;\n }\n /**\n * 向量叉积(静态方法)\n * @param a 向量a\n * @param b 向量b\n * @returns 新的叉积向量\n */\n static cross(a, b) {\n return new Vector3(a.y * b.z - a.z * b.y, a.z * b.x - a.x * b.z, a.x * b.y - a.y * b.x);\n }\n /**\n * 计算两点间距离(静态方法)\n * @param a 点a\n * @param b 点b\n * @returns 距离值\n */\n static distance(a, b) {\n const dx = a.x - b.x;\n const dy = a.y - b.y;\n const dz = a.z - b.z;\n return Math.sqrt(dx * dx + dy * dy + dz * dz);\n }\n /**\n * 线性插值(静态方法)\n * @param a 起始向量\n * @param b 目标向量\n * @param t 插值参数(0到1)\n * @returns 新的插值结果向量\n */\n static lerp(a, b, t) {\n return new Vector3(a.x + (b.x - a.x) * t, a.y + (b.y - a.y) * t, a.z + (b.z - a.z) * t);\n }\n // 字符串转换\n /**\n * 转换为字符串\n * @returns 字符串表示\n */\n toString() {\n return `Vector3(${this.x.toFixed(3)}, ${this.y.toFixed(3)}, ${this.z.toFixed(3)})`;\n }\n /**\n * 转换为数组\n * @returns [x, y, z] 数组\n */\n toArray() {\n return [this.x, this.y, this.z];\n }\n /**\n * 转换为普通对象\n * @returns {x, y, z} 对象\n */\n toObject() {\n return { x: this.x, y: this.y, z: this.z };\n }\n}\n// 静态常量\n/** 零向量 (0, 0, 0) */\nVector3.ZERO = new Vector3(0, 0, 0);\n/** 单位向量 (1, 1, 1) */\nVector3.ONE = new Vector3(1, 1, 1);\n/** 右方向向量 (1, 0, 0) */\nVector3.RIGHT = new Vector3(1, 0, 0);\n/** 左方向向量 (-1, 0, 0) */\nVector3.LEFT = new Vector3(-1, 0, 0);\n/** 上方向向量 (0, 1, 0) */\nVector3.UP = new Vector3(0, 1, 0);\n/** 下方向向量 (0, -1, 0) */\nVector3.DOWN = new Vector3(0, -1, 0);\n/** 前方向向量 (0, 0, 1) */\nVector3.FORWARD = new Vector3(0, 0, 1);\n/** 后方向向量 (0, 0, -1) */\nVector3.BACK = new Vector3(0, 0, -1);\n//# sourceMappingURL=Vector3.js.map","import { Vector2 } from './Vector2';\n/**\n * 3x3变换矩阵类\n * 3x3 Transform Matrix Class\n *\n * 用于2D变换(平移、旋转、缩放)的3x3矩阵\n * 使用左手坐标系(顺时针正旋转)\n *\n * 矩阵布局(顺时针旋转):\n * [m00, m01, m02] [scaleX * cos, scaleY * sin, translateX]\n * [m10, m11, m12] = [-scaleX * sin, scaleY * cos, translateY]\n * [m20, m21, m22] [0, 0, 1]\n */\nexport class Matrix3 {\n /**\n * 创建3x3矩阵\n * @param elements 矩阵元素数组(可选),默认为单位矩阵\n */\n constructor(elements) {\n this.elements = new Float32Array(9);\n if (elements) {\n this.elements.set(elements);\n }\n else {\n this.identity();\n }\n }\n // 元素访问器\n /** 获取矩阵元素 */\n get(row, col) {\n return this.elements[row * 3 + col];\n }\n /** 设置矩阵元素 */\n set(row, col, value) {\n this.elements[row * 3 + col] = value;\n return this;\n }\n // 快速访问器\n get m00() { return this.elements[0]; }\n set m00(value) { this.elements[0] = value; }\n get m01() { return this.elements[1]; }\n set m01(value) { this.elements[1] = value; }\n get m02() { return this.elements[2]; }\n set m02(value) { this.elements[2] = value; }\n get m10() { return this.elements[3]; }\n set m10(value) { this.elements[3] = value; }\n get m11() { return this.elements[4]; }\n set m11(value) { this.elements[4] = value; }\n get m12() { return this.elements[5]; }\n set m12(value) { this.elements[5] = value; }\n get m20() { return this.elements[6]; }\n set m20(value) { this.elements[6] = value; }\n get m21() { return this.elements[7]; }\n set m21(value) { this.elements[7] = value; }\n get m22() { return this.elements[8]; }\n set m22(value) { this.elements[8] = value; }\n // 基础操作\n /**\n * 设置矩阵为单位矩阵\n * @returns 当前矩阵实例(链式调用)\n */\n identity() {\n this.elements.set([\n 1, 0, 0,\n 0, 1, 0,\n 0, 0, 1\n ]);\n return this;\n }\n /**\n * 设置矩阵为零矩阵\n * @returns 当前矩阵实例(链式调用)\n */\n zero() {\n this.elements.fill(0);\n return this;\n }\n /**\n * 复制另一个矩阵的值\n * @param other 源矩阵\n * @returns 当前矩阵实例(链式调用)\n */\n copy(other) {\n this.elements.set(other.elements);\n return this;\n }\n /**\n * 克隆当前矩阵\n * @returns 新的矩阵实例\n */\n clone() {\n return new Matrix3(this.elements);\n }\n /**\n * 从数组设置矩阵元素\n * @param elements 矩阵元素数组\n * @returns 当前矩阵实例(链式调用)\n */\n fromArray(elements) {\n this.elements.set(elements);\n return this;\n }\n // 矩阵运算\n /**\n * 矩阵加法\n * @param other 另一个矩阵\n * @returns 当前矩阵实例(链式调用)\n */\n add(other) {\n for (let i = 0; i < 9; i++) {\n this.elements[i] += other.elements[i];\n }\n return this;\n }\n /**\n * 矩阵减法\n * @param other 另一个矩阵\n * @returns 当前矩阵实例(链式调用)\n */\n subtract(other) {\n for (let i = 0; i < 9; i++) {\n this.elements[i] -= other.elements[i];\n }\n return this;\n }\n /**\n * 矩阵标量乘法\n * @param scalar 标量\n * @returns 当前矩阵实例(链式调用)\n */\n multiplyScalar(scalar) {\n for (let i = 0; i < 9; i++) {\n this.elements[i] *= scalar;\n }\n return this;\n }\n /**\n * 矩阵乘法\n * @param other 另一个矩阵\n * @returns 当前矩阵实例(链式调用)\n */\n multiply(other) {\n const a = this.elements;\n const b = other.elements;\n const result = new Float32Array(9);\n result[0] = a[0] * b[0] + a[1] * b[3] + a[2] * b[6];\n result[1] = a[0] * b[1] + a[1] * b[4] + a[2] * b[7];\n result[2] = a[0] * b[2] + a[1] * b[5] + a[2] * b[8];\n result[3] = a[3] * b[0] + a[4] * b[3] + a[5] * b[6];\n result[4] = a[3] * b[1] + a[4] * b[4] + a[5] * b[7];\n result[5] = a[3] * b[2] + a[4] * b[5] + a[5] * b[8];\n result[6] = a[6] * b[0] + a[7] * b[3] + a[8] * b[6];\n result[7] = a[6] * b[1] + a[7] * b[4] + a[8] * b[7];\n result[8] = a[6] * b[2] + a[7] * b[5] + a[8] * b[8];\n this.elements.set(result);\n return this;\n }\n /**\n * 左乘另一个矩阵(other * this)\n * @param other 左乘矩阵\n * @returns 当前矩阵实例(链式调用)\n */\n premultiply(other) {\n const a = other.elements;\n const b = this.elements;\n const result = new Float32Array(9);\n result[0] = a[0] * b[0] + a[1] * b[3] + a[2] * b[6];\n result[1] = a[0] * b[1] + a[1] * b[4] + a[2] * b[7];\n result[2] = a[0] * b[2] + a[1] * b[5] + a[2] * b[8];\n result[3] = a[3] * b[0] + a[4] * b[3] + a[5] * b[6];\n result[4] = a[3] * b[1] + a[4] * b[4] + a[5] * b[7];\n result[5] = a[3] * b[2] + a[4] * b[5] + a[5] * b[8];\n result[6] = a[6] * b[0] + a[7] * b[3] + a[8] * b[6];\n result[7] = a[6] * b[1] + a[7] * b[4] + a[8] * b[7];\n result[8] = a[6] * b[2] + a[7] * b[5] + a[8] * b[8];\n this.elements.set(result);\n return this;\n }\n // 变换操作\n /**\n * 设置为平移矩阵\n * @param x X方向平移\n * @param y Y方向平移\n * @returns 当前矩阵实例(链式调用)\n */\n makeTranslation(x, y) {\n this.elements.set([\n 1, 0, x,\n 0, 1, y,\n 0, 0, 1\n ]);\n return this;\n }\n /**\n * 设置为旋转矩阵(顺时针为正)\n * Set as rotation matrix (clockwise positive)\n *\n * 使用左手坐标系约定:正角度 = 顺时针旋转\n * Uses left-hand coordinate system: positive angle = clockwise\n *\n * @param angle 旋转角度(弧度)\n * @returns 当前矩阵实例(链式调用)\n */\n makeRotation(angle) {\n const cos = Math.cos(angle);\n const sin = Math.sin(angle);\n // Clockwise rotation matrix\n // 顺时针旋转矩阵\n this.elements.set([\n cos, sin, 0,\n -sin, cos, 0,\n 0, 0, 1\n ]);\n return this;\n }\n /**\n * 设置为缩放矩阵\n * @param scaleX X方向缩放\n * @param scaleY Y方向缩放\n * @returns 当前矩阵实例(链式调用)\n */\n makeScale(scaleX, scaleY) {\n this.elements.set([\n scaleX, 0, 0,\n 0, scaleY, 0,\n 0, 0, 1\n ]);\n return this;\n }\n /**\n * 复合平移\n * @param x X方向平移\n * @param y Y方向平移\n * @returns 当前矩阵实例(链式调用)\n */\n translate(x, y) {\n this.m02 += this.m00 * x + this.m01 * y;\n this.m12 += this.m10 * x + this.m11 * y;\n return this;\n }\n /**\n * 复合旋转(顺时针为正)\n * Composite rotation (clockwise positive)\n *\n * 使用左手坐标系约定:正角度 = 顺时针旋转\n * Uses left-hand coordinate system: positive angle = clockwise\n *\n * @param angle 旋转角度(弧度)\n * @returns 当前矩阵实例(链式调用)\n */\n rotate(angle) {\n const cos = Math.cos(angle);\n const sin = Math.sin(angle);\n // Clockwise rotation: multiply by [cos, sin; -sin, cos]\n // 顺时针旋转\n const m00 = this.m00 * cos - this.m01 * sin;\n const m01 = this.m00 * sin + this.m01 * cos;\n const m10 = this.m10 * cos - this.m11 * sin;\n const m11 = this.m10 * sin + this.m11 * cos;\n this.m00 = m00;\n this.m01 = m01;\n this.m10 = m10;\n this.m11 = m11;\n return this;\n }\n /**\n * 复合缩放\n * @param scaleX X方向缩放\n * @param scaleY Y方向缩放\n * @returns 当前矩阵实例(链式调用)\n */\n scale(scaleX, scaleY) {\n this.m00 *= scaleX;\n this.m01 *= scaleY;\n this.m10 *= scaleX;\n this.m11 *= scaleY;\n return this;\n }\n // 矩阵变换\n /**\n * 矩阵转置\n * @returns 当前矩阵实例(链式调用)\n */\n transpose() {\n const elements = this.elements;\n let tmp;\n tmp = elements[1];\n elements[1] = elements[3];\n elements[3] = tmp;\n tmp = elements[2];\n elements[2] = elements[6];\n elements[6] = tmp;\n tmp = elements[5];\n elements[5] = elements[7];\n elements[7] = tmp;\n return this;\n }\n /**\n * 计算矩阵行列式\n * @returns 行列式值\n */\n determinant() {\n const e = this.elements;\n return e[0] * (e[4] * e[8] - e[5] * e[7]) -\n e[1] * (e[3] * e[8] - e[5] * e[6]) +\n e[2] * (e[3] * e[7] - e[4] * e[6]);\n }\n /**\n * 矩阵求逆\n * @returns 当前矩阵实例(链式调用),如果矩阵不可逆则保持不变\n */\n invert() {\n const e = this.elements;\n const det = this.determinant();\n if (Math.abs(det) < Number.EPSILON) {\n console.warn('Matrix3: 矩阵不可逆');\n return this;\n }\n const invDet = 1 / det;\n const result = new Float32Array(9);\n result[0] = (e[4] * e[8] - e[5] * e[7]) * invDet;\n result[1] = (e[2] * e[7] - e[1] * e[8]) * invDet;\n result[2] = (e[1] * e[5] - e[2] * e[4]) * invDet;\n result[3] = (e[5] * e[6] - e[3] * e[8]) * invDet;\n result[4] = (e[0] * e[8] - e[2] * e[6]) * invDet;\n result[5] = (e[2] * e[3] - e[0] * e[5]) * invDet;\n result[6] = (e[3] * e[7] - e[4] * e[6]) * invDet;\n result[7] = (e[1] * e[6] - e[0] * e[7]) * invDet;\n result[8] = (e[0] * e[4] - e[1] * e[3]) * invDet;\n this.elements.set(result);\n return this;\n }\n // 向量变换\n /**\n * 变换向量(应用完整的3x3变换)\n * @param vector 向量\n * @returns 新的变换后的向量\n */\n transformVector(vector) {\n const x = vector.x;\n const y = vector.y;\n const w = this.m20 * x + this.m21 * y + this.m22;\n return new Vector2((this.m00 * x + this.m01 * y + this.m02) / w, (this.m10 * x + this.m11 * y + this.m12) / w);\n }\n /**\n * 变换向量(仅应用旋转和缩放,忽略平移)\n * @param vector 向量\n * @returns 新的变换后的向量\n */\n transformDirection(vector) {\n return new Vector2(this.m00 * vector.x + this.m01 * vector.y, this.m10 * vector.x + this.m11 * vector.y);\n }\n /**\n * 批量变换向量数组\n * @param vectors 向量数组\n * @returns 变换后的向量数组\n */\n transformVectors(vectors) {\n return vectors.map((v) => this.transformVector(v));\n }\n // 属性提取\n /**\n * 获取平移分量\n * @returns 平移向量\n */\n getTranslation() {\n return new Vector2(this.m02, this.m12);\n }\n /**\n * 获取旋转角度(顺时针为正)\n * Get rotation angle (clockwise positive)\n * @returns 旋转角度(弧度)\n */\n getRotation() {\n // For clockwise rotation matrix [cos, sin; -sin, cos]\n // m00 = cos, m01 = sin, so atan2(m01, m00) = θ\n // 顺时针旋转矩阵:从 m01 和 m00 提取角度\n return Math.atan2(this.m01, this.m00);\n }\n /**\n * 获取缩放分量\n * @returns 缩放向量\n */\n getScale() {\n const scaleX = Math.sqrt(this.m00 * this.m00 + this.m10 * this.m10);\n const scaleY = Math.sqrt(this.m01 * this.m01 + this.m11 * this.m11);\n // 检查是否有反转\n const det = this.determinant();\n if (det < 0) {\n return new Vector2(-scaleX, scaleY);\n }\n return new Vector2(scaleX, scaleY);\n }\n /**\n * 分解变换矩阵为平移、旋转、缩放分量\n * @returns {translation, rotation, scale}\n */\n decompose() {\n return {\n translation: this.getTranslation(),\n rotation: this.getRotation(),\n scale: this.getScale()\n };\n }\n // 比较操作\n /**\n * 检查两个矩阵是否相等\n * @param other 另一个矩阵\n * @param epsilon 容差,默认为Number.EPSILON\n * @returns 是否相等\n */\n equals(other, epsilon = Number.EPSILON) {\n for (let i = 0; i < 9; i++) {\n if (Math.abs(this.elements[i] - other.elements[i]) >= epsilon) {\n return false;\n }\n }\n return true;\n }\n /**\n * 检查两个矩阵是否完全相等\n * @param other 另一个矩阵\n * @returns 是否完全相等\n */\n exactEquals(other) {\n for (let i = 0; i < 9; i++) {\n if (this.elements[i] !== other.elements[i]) {\n return false;\n }\n }\n return true;\n }\n /**\n * 检查是否为单位矩阵\n * @param epsilon 容差,默认为Number.EPSILON\n * @returns 是否为单位矩阵\n */\n isIdentity(epsilon = Number.EPSILON) {\n return this.equals(Matrix3.IDENTITY, epsilon);\n }\n // 静态方法\n /**\n * 矩阵乘法(静态方法)\n * @param a 矩阵a\n * @param b 矩阵b\n * @returns 新的结果矩阵\n */\n static multiply(a, b) {\n return a.clone().multiply(b);\n }\n /**\n * 创建平移矩阵(静态方法)\n * @param x X方向平移\n * @param y Y方向平移\n * @returns 新的平移矩阵\n */\n static translation(x, y) {\n return new Matrix3().makeTranslation(x, y);\n }\n /**\n * 创建旋转矩阵(静态方法)\n * @param angle 旋转角度(弧度)\n * @returns 新的旋转矩阵\n */\n static rotation(angle) {\n return new Matrix3().makeRotation(angle);\n }\n /**\n * 创建缩放矩阵(静态方法)\n * @param scaleX X方向缩放\n * @param scaleY Y方向缩放\n * @returns 新的缩放矩阵\n */\n static scale(scaleX, scaleY) {\n return new Matrix3().makeScale(scaleX, scaleY);\n }\n /**\n * 创建TRS(平移-旋转-缩放)变换矩阵(顺时针为正)\n * Create TRS (Translate-Rotate-Scale) matrix (clockwise positive)\n *\n * 使用左手坐标系约定:正角度 = 顺时针旋转\n * Uses left-hand coordinate system: positive angle = clockwise\n *\n * @param translation 平移向量\n * @param rotation 旋转角度(弧度)\n * @param scale 缩放向量\n * @returns 新的TRS矩阵\n */\n static TRS(translation, rotation, scale) {\n const cos = Math.cos(rotation);\n const sin = Math.sin(rotation);\n // Clockwise rotation matrix with scale\n // 带缩放的顺时针旋转矩阵\n return new Matrix3([\n scale.x * cos, scale.y * sin, translation.x,\n -scale.x * sin, scale.y * cos, translation.y,\n 0, 0, 1\n ]);\n }\n // 字符串转换\n /**\n * 转换为字符串\n * @returns 字符串表示\n */\n toString() {\n const e = this.elements;\n return 'Matrix3(\\n' +\n ` ${e[0].toFixed(3)}, ${e[1].toFixed(3)}, ${e[2].toFixed(3)}\\n` +\n ` ${e[3].toFixed(3)}, ${e[4].toFixed(3)}, ${e[5].toFixed(3)}\\n` +\n ` ${e[6].toFixed(3)}, ${e[7].toFixed(3)}, ${e[8].toFixed(3)}\\n` +\n ')';\n }\n /**\n * 转换为数组\n * @returns 矩阵元素数组\n */\n toArray() {\n return Array.from(this.elements);\n }\n /**\n * 转换为CSS transform字符串\n * @returns CSS transform字符串\n */\n toCSSTransform() {\n const e = this.elements;\n return `matrix(${e[0]}, ${e[3]}, ${e[1]}, ${e[4]}, ${e[2]}, ${e[5]})`;\n }\n}\n// 静态常量\n/** 单位矩阵 */\nMatrix3.IDENTITY = new Matrix3([\n 1, 0, 0,\n 0, 1, 0,\n 0, 0, 1\n]);\n/** 零矩阵 */\nMatrix3.ZERO = new Matrix3([\n 0, 0, 0,\n 0, 0, 0,\n 0, 0, 0\n]);\n//# sourceMappingURL=Matrix3.js.map","import { Vector2 } from './Vector2';\n/**\n * 2D矩形类\n *\n * 表示一个轴对齐的矩形,提供矩形相关的几何运算功能:\n * - 矩形创建和属性获取\n * - 包含检测(点、矩形)\n * - 相交检测和计算\n * - 变换和操作\n */\nexport class Rectangle {\n /**\n * 创建矩形\n * @param x 左上角X坐标,默认为0\n * @param y 左上角Y坐标,默认为0\n * @param width 宽度,默认为0\n * @param height 高度,默认为0\n */\n constructor(x = 0, y = 0, width = 0, height = 0) {\n this.x = x;\n this.y = y;\n this.width = width;\n this.height = height;\n }\n // 属性获取\n /** 获取左边界 */\n get left() {\n return this.x;\n }\n /** 获取右边界 */\n get right() {\n return this.x + this.width;\n }\n /** 获取上边界 */\n get top() {\n return this.y;\n }\n /** 获取下边界 */\n get bottom() {\n return this.y + this.height;\n }\n /** 获取中心X坐标 */\n get centerX() {\n return this.x + this.width * 0.5;\n }\n /** 获取中心Y坐标 */\n get centerY() {\n return this.y + this.height * 0.5;\n }\n /** 获取中心点 */\n get center() {\n return new Vector2(this.centerX, this.centerY);\n }\n /** 获取左上角点 */\n get topLeft() {\n return new Vector2(this.x, this.y);\n }\n /** 获取右上角点 */\n get topRight() {\n return new Vector2(this.right, this.y);\n }\n /** 获取左下角点 */\n get bottomLeft() {\n return new Vector2(this.x, this.bottom);\n }\n /** 获取右下角点 */\n get bottomRight() {\n return new Vector2(this.right, this.bottom);\n }\n /** 获取面积 */\n get area() {\n return this.width * this.height;\n }\n /** 获取周长 */\n get perimeter() {\n return 2 * (this.width + this.height);\n }\n /** 检查是否为空矩形 */\n get isEmpty() {\n return this.width <= 0 || this.height <= 0;\n }\n /** 检查是否为正方形 */\n get isSquare() {\n return this.width === this.height && this.width > 0;\n }\n // 基础操作\n /**\n * 设置矩形属性\n * @param x 左上角X坐标\n * @param y 左上角Y坐标\n * @param width 宽度\n * @param height 高度\n * @returns 当前矩形实例(链式调用)\n */\n set(x, y, width, height) {\n this.x = x;\n this.y = y;\n this.width = width;\n this.height = height;\n return this;\n }\n /**\n * 复制另一个矩形的值\n * @param other 源矩形\n * @returns 当前矩形实例(链式调用)\n */\n copy(other) {\n this.x = other.x;\n this.y = other.y;\n this.width = other.width;\n this.height = other.height;\n return this;\n }\n /**\n * 克隆当前矩形\n * @returns 新的矩形实例\n */\n clone() {\n return new Rectangle(this.x, this.y, this.width, this.height);\n }\n /**\n * 设置矩形位置\n * @param x 新的X坐标\n * @param y 新的Y坐标\n * @returns 当前矩形实例(链式调用)\n */\n setPosition(x, y) {\n this.x = x;\n this.y = y;\n return this;\n }\n /**\n * 设置矩形大小\n * @param width 新的宽度\n * @param height 新的高度\n * @returns 当前矩形实例(链式调用)\n */\n setSize(width, height) {\n this.width = width;\n this.height = height;\n return this;\n }\n /**\n * 设置矩形中心点\n * @param centerX 中心X坐标\n * @param centerY 中心Y坐标\n * @returns 当前矩形实例(链式调用)\n */\n setCenter(centerX, centerY) {\n this.x = centerX - this.width * 0.5;\n this.y = centerY - this.height * 0.5;\n return this;\n }\n // 变换操作\n /**\n * 平移矩形\n * @param dx X方向偏移\n * @param dy Y方向偏移\n * @returns 当前矩形实例(链式调用)\n */\n translate(dx, dy) {\n this.x += dx;\n this.y += dy;\n return this;\n }\n /**\n * 缩放矩形(从中心缩放)\n * @param scaleX X方向缩放因子\n * @param scaleY Y方向缩放因子,默认等于scaleX\n * @returns 当前矩形实例(链式调用)\n */\n scale(scaleX, scaleY = scaleX) {\n const centerX = this.centerX;\n const centerY = this.centerY;\n this.width *= scaleX;\n this.height *= scaleY;\n return this.setCenter(centerX, centerY);\n }\n /**\n * 扩展矩形\n * @param amount 扩展量(正值扩大,负值缩小)\n * @returns 当前矩形实例(链式调用)\n */\n inflate(amount) {\n this.x -= amount;\n this.y -= amount;\n this.width += amount * 2;\n this.height += amount * 2;\n return this;\n }\n /**\n * 扩展矩形(分别指定水平和垂直方向)\n * @param horizontal 水平方向扩展量\n * @param vertical 垂直方向扩展量\n * @returns 当前矩形实例(链式调用)\n */\n inflateXY(horizontal, vertical) {\n this.x -= horizontal;\n this.y -= vertical;\n this.width += horizontal * 2;\n this.height += vertical * 2;\n return this;\n }\n // 包含检测\n /**\n * 检查是否包含指定点\n * @param point 点\n * @returns 是否包含\n */\n containsPoint(point) {\n return point.x >= this.x && point.x <= this.right &&\n point.y >= this.y && point.y <= this.bottom;\n }\n /**\n * 检查是否包含指定坐标\n * @param x X坐标\n * @param y Y坐标\n * @returns 是否包含\n */\n contains(x, y) {\n return x >= this.x && x <= this.right &&\n y >= this.y && y <= this.bottom;\n }\n /**\n * 检查是否完全包含另一个矩形\n * @param other 另一个矩形\n * @returns 是否完全包含\n */\n containsRect(other) {\n return this.x <= other.x && this.y <= other.y &&\n this.right >= other.right && this.bottom >= other.bottom;\n }\n // 相交检测\n /**\n * 检查是否与另一个矩形相交\n * @param other 另一个矩形\n * @returns 是否相交\n */\n intersects(other) {\n return this.x < other.right && this.right > other.x &&\n this.y < other.bottom && this.bottom > other.y;\n }\n /**\n * 计算与另一个矩形的相交矩形\n * @param other 另一个矩形\n * @returns 相交矩形,如果不相交返回空矩形\n */\n intersection(other) {\n if (!this.intersects(other)) {\n return Rectangle.EMPTY.clone();\n }\n const x = Math.max(this.x, other.x);\n const y = Math.max(this.y, other.y);\n const right = Math.min(this.right, other.right);\n const bottom = Math.min(this.bottom, other.bottom);\n return new Rectangle(x, y, right - x, bottom - y);\n }\n /**\n * 计算与另一个矩形的并集矩形\n * @param other 另一个矩形\n * @returns 并集矩形\n */\n union(other) {\n const x = Math.min(this.x, other.x);\n const y = Math.min(this.y, other.y);\n const right = Math.max(this.right, other.right);\n const bottom = Math.max(this.bottom, other.bottom);\n return new Rectangle(x, y, right - x, bottom - y);\n }\n /**\n * 计算相交面积\n * @param other 另一个矩形\n * @returns 相交面积\n */\n intersectionArea(other) {\n const intersection = this.intersection(other);\n return intersection.isEmpty ? 0 : intersection.area;\n }\n // 距离计算\n /**\n * 计算点到矩形的最短距离\n * @param point 点\n * @returns 最短距离\n */\n distanceToPoint(point) {\n const dx = Math.max(0, Math.max(this.x - point.x, point.x - this.right));\n const dy = Math.max(0, Math.max(this.y - point.y, point.y - this.bottom));\n return Math.sqrt(dx * dx + dy * dy);\n }\n /**\n * 计算两个矩形间的最短距离\n * @param other 另一个矩形\n * @returns 最短距离(相交时为0)\n */\n distanceToRect(other) {\n if (this.intersects(other)) {\n return 0;\n }\n const dx = Math.max(0, Math.max(this.x - other.right, other.x - this.right));\n const dy = Math.max(0, Math.max(this.y - other.bottom, other.y - this.bottom));\n return Math.sqrt(dx * dx + dy * dy);\n }\n /**\n * 获取矩形上距离指定点最近的点\n * @param point 指定点\n * @returns 最近点\n */\n closestPointTo(point) {\n return new Vector2(Math.max(this.x, Math.min(this.right, point.x)), Math.max(this.y, Math.min(this.bottom, point.y)));\n }\n // 比较操作\n /**\n * 检查两个矩形是否相等\n * @param other 另一个矩形\n * @param epsilon 容差,默认为Number.EPSILON\n * @returns 是否相等\n */\n equals(other, epsilon = Number.EPSILON) {\n return Math.abs(this.x - other.x) < epsilon &&\n Math.abs(this.y - other.y) < epsilon &&\n Math.abs(this.width - other.width) < epsilon &&\n Math.abs(this.height - other.height) < epsilon;\n }\n /**\n * 检查两个矩形是否完全相等\n * @param other 另一个矩形\n * @returns 是否完全相等\n */\n exactEquals(other) {\n return this.x === other.x && this.y === other.y &&\n this.width === other.width && this.height === other.height;\n }\n // 静态方法\n /**\n * 从中心点和大小创建矩形\n * @param centerX 中心X坐标\n * @param centerY 中心Y坐标\n * @param width 宽度\n * @param height 高度\n * @returns 新的矩形实例\n */\n static fromCenter(centerX, centerY, width, height) {\n return new Rectangle(centerX - width * 0.5, centerY - height * 0.5, width, height);\n }\n /**\n * 从两个点创建矩形\n * @param point1 第一个点\n * @param point2 第二个点\n * @returns 新的矩形实例\n */\n static fromPoints(point1, point2) {\n const x = Math.min(point1.x, point2.x);\n const y = Math.min(point1.y, point2.y);\n const width = Math.abs(point2.x - point1.x);\n const height = Math.abs(point2.y - point1.y);\n return new Rectangle(x, y, width, height);\n }\n /**\n * 从点数组创建包围矩形\n * @param points 点数组\n * @returns 包围矩形\n */\n static fromPointArray(points) {\n if (points.length === 0) {\n return Rectangle.EMPTY.clone();\n }\n let minX = points[0].x;\n let minY = points[0].y;\n let maxX = points[0].x;\n let maxY = points[0].y;\n for (let i = 1; i < points.length; i++) {\n minX = Math.min(minX, points[i].x);\n minY = Math.min(minY, points[i].y);\n maxX = Math.max(maxX, points[i].x);\n maxY = Math.max(maxY, points[i].y);\n }\n return new Rectangle(minX, minY, maxX - minX, maxY - minY);\n }\n /**\n * 创建正方形\n * @param x 左上角X坐标\n * @param y 左上角Y坐标\n * @param size 边长\n * @returns 新的正方形矩形\n */\n static square(x, y, size) {\n return new Rectangle(x, y, size, size);\n }\n /**\n * 线性插值两个矩形\n * @param a 起始矩形\n * @param b 目标矩形\n * @param t 插值参数(0到1)\n * @returns 新的插值结果矩形\n */\n static lerp(a, b, t) {\n return new Rectangle(a.x + (b.x - a.x) * t, a.y + (b.y - a.y) * t, a.width + (b.width - a.width) * t, a.height + (b.height - a.height) * t);\n }\n // 字符串转换\n /**\n * 转换为字符串\n * @returns 字符串表示\n */\n toString() {\n return `Rectangle(${this.x.toFixed(2)}, ${this.y.toFixed(2)}, ${this.width.toFixed(2)}, ${this.height.toFixed(2)})`;\n }\n /**\n * 转换为数组\n * @returns [x, y, width, height] 数组\n */\n toArray() {\n return [this.x, this.y, this.width, this.height];\n }\n /**\n * 转换为普通对象\n * @returns {x, y, width, height} 对象\n */\n toObject() {\n return { x: this.x, y: this.y, width: this.width, height: this.height };\n }\n /**\n * 获取四个顶点\n * @returns 顶点数组 [topLeft, topRight, bottomRight, bottomLeft]\n */\n getVertices() {\n return [\n this.topLeft,\n this.topRight,\n this.bottomRight,\n this.bottomLeft\n ];\n }\n}\n// 静态常量\n/** 空矩形 */\nRectangle.EMPTY = new Rectangle(0, 0, 0, 0);\n//# sourceMappingURL=Rectangle.js.map","import { Vector2 } from './Vector2';\nimport { Rectangle } from './Rectangle';\n/**\n * 2D圆形类\n *\n * 表示一个圆形,提供圆形相关的几何运算功能:\n * - 圆形创建和属性获取\n * - 包含检测(点、圆形)\n * - 相交检测和计算\n * - 变换和操作\n */\nexport class Circle {\n /**\n * 创建圆形\n * @param x 圆心X坐标,默认为0\n * @param y 圆心Y坐标,默认为0\n * @param radius 半径,默认为0\n */\n constructor(x = 0, y = 0, radius = 0) {\n this.x = x;\n this.y = y;\n this.radius = radius;\n }\n // 属性获取\n /** 获取圆心坐标 */\n get center() {\n return new Vector2(this.x, this.y);\n }\n /** 设置圆心坐标 */\n set center(value) {\n this.x = value.x;\n this.y = value.y;\n }\n /** 获取直径 */\n get diameter() {\n return this.radius * 2;\n }\n /** 设置直径 */\n set diameter(value) {\n this.radius = value * 0.5;\n }\n /** 获取面积 */\n get area() {\n return Math.PI * this.radius * this.radius;\n }\n /** 获取周长 */\n get circumference() {\n return 2 * Math.PI * this.radius;\n }\n /** 获取包围矩形 */\n get bounds() {\n return new Rectangle(this.x - this.radius, this.y - this.radius, this.diameter, this.diameter);\n }\n /** 检查是否为空圆形 */\n get isEmpty() {\n return this.radius <= 0;\n }\n // 基础操作\n /**\n * 设置圆形属性\n * @param x 圆心X坐标\n * @param y 圆心Y坐标\n * @param radius 半径\n * @returns 当前圆形实例(链式调用)\n */\n set(x, y, radius) {\n this.x = x;\n this.y = y;\n this.radius = radius;\n return this;\n }\n /**\n * 复制另一个圆形的值\n * @param other 源圆形\n * @returns 当前圆形实例(链式调用)\n */\n copy(other) {\n this.x = other.x;\n this.y = other.y;\n this.radius = other.radius;\n return this;\n }\n /**\n * 克隆当前圆形\n * @returns 新的圆形实例\n */\n clone() {\n return new Circle(this.x, this.y, this.radius);\n }\n /**\n * 设置圆心位置\n * @param x 新的X坐标\n * @param y 新的Y坐标\n * @returns 当前圆形实例(链式调用)\n */\n setPosition(x, y) {\n this.x = x;\n this.y = y;\n return this;\n }\n /**\n * 设置圆心位置(使用向量)\n * @param center 新的圆心位置\n * @returns 当前圆形实例(链式调用)\n */\n setCenter(center) {\n this.x = center.x;\n this.y = center.y;\n return this;\n }\n /**\n * 设置半径\n * @param radius 新的半径\n * @returns 当前圆形实例(链式调用)\n */\n setRadius(radius) {\n this.radius = radius;\n return this;\n }\n // 变换操作\n /**\n * 平移圆形\n * @param dx X方向偏移\n * @param dy Y方向偏移\n * @returns 当前圆形实例(链式调用)\n */\n translate(dx, dy) {\n this.x += dx;\n this.y += dy;\n return this;\n }\n /**\n * 平移圆形(使用向量)\n * @param offset 偏移向量\n * @returns 当前圆形实例(链式调用)\n */\n translateBy(offset) {\n this.x += offset.x;\n this.y += offset.y;\n return this;\n }\n /**\n * 缩放圆形\n * @param scale 缩放因子\n * @returns 当前圆形实例(链式调用)\n */\n scale(scale) {\n this.radius *= scale;\n return this;\n }\n /**\n * 扩展圆形\n * @param amount 扩展量(正值扩大半径,负值缩小半径)\n * @returns 当前圆形实例(链式调用)\n */\n inflate(amount) {\n this.radius += amount;\n return this;\n }\n // 包含检测\n /**\n * 检查是否包含指定点\n * @param point 点\n * @returns 是否包含\n */\n containsPoint(point) {\n const dx = point.x - this.x;\n const dy = point.y - this.y;\n return dx * dx + dy * dy <= this.radius * this.radius;\n }\n /**\n * 检查是否包含指定坐标\n * @param x X坐标\n * @param y Y坐标\n * @returns 是否包含\n */\n contains(x, y) {\n const dx = x - this.x;\n const dy = y - this.y;\n return dx * dx + dy * dy <= this.radius * this.radius;\n }\n /**\n * 检查是否完全包含另一个圆形\n * @param other 另一个圆形\n * @returns 是否完全包含\n */\n containsCircle(other) {\n const distance = this.distanceToCircle(other);\n return distance + other.radius <= this.radius;\n }\n /**\n * 检查点是否在圆的边界上\n * @param point 点\n * @param epsilon 容差,默认为Number.EPSILON\n * @returns 是否在边界上\n */\n pointOnBoundary(point, epsilon = Number.EPSILON) {\n const distance = this.distanceToPoint(point);\n return Math.abs(distance - this.radius) < epsilon;\n }\n // 相交检测\n /**\n * 检查是否与另一个圆形相交\n * @param other 另一个圆形\n * @returns 是否相交\n */\n intersects(other) {\n const dx = this.x - other.x;\n const dy = this.y - other.y;\n const distanceSquared = dx * dx + dy * dy;\n const radiusSum = this.radius + other.radius;\n return distanceSquared <= radiusSum * radiusSum;\n }\n /**\n * 检查是否与矩形相交\n * @param rect 矩形\n * @returns 是否相交\n */\n intersectsRect(rect) {\n // 找到矩形上离圆心最近的点\n const closestX = Math.max(rect.x, Math.min(this.x, rect.right));\n const closestY = Math.max(rect.y, Math.min(this.y, rect.bottom));\n // 计算圆心到最近点的距离\n const dx = this.x - closestX;\n const dy = this.y - closestY;\n return dx * dx + dy * dy <= this.radius * this.radius;\n }\n /**\n * 计算与另一个圆形的相交面积\n * @param other 另一个圆形\n * @returns 相交面积\n */\n intersectionArea(other) {\n const d = this.distanceToCircle(other);\n // 不相交\n if (d >= this.radius + other.radius) {\n return 0;\n }\n // 一个圆完全包含另一个圆\n if (d <= Math.abs(this.radius - other.radius)) {\n const smallerRadius = Math.min(this.radius, other.radius);\n return Math.PI * smallerRadius * smallerRadius;\n }\n // 部分相交\n const r1 = this.radius;\n const r2 = other.radius;\n const part1 = r1 * r1 * Math.acos((d * d + r1 * r1 - r2 * r2) / (2 * d * r1));\n const part2 = r2 * r2 * Math.acos((d * d + r2 * r2 - r1 * r1) / (2 * d * r2));\n const part3 = 0.5 * Math.sqrt((-d + r1 + r2) * (d + r1 - r2) * (d - r1 + r2) * (d + r1 + r2));\n return part1 + part2 - part3;\n }\n // 距离计算\n /**\n * 计算圆心到点的距离\n * @param point 点\n * @returns 距离\n */\n distanceToPoint(point) {\n const dx = point.x - this.x;\n const dy = point.y - this.y;\n return Math.sqrt(dx * dx + dy * dy);\n }\n /**\n * 计算圆形边界到点的最短距离\n * @param point 点\n * @returns 最短距离(点在圆内时为负值)\n */\n distanceToPointFromBoundary(point) {\n return this.distanceToPoint(point) - this.radius;\n }\n /**\n * 计算两个圆心之间的距离\n * @param other 另一个圆形\n * @returns 圆心距离\n */\n distanceToCircle(other) {\n const dx = this.x - other.x;\n const dy = this.y - other.y;\n return Math.sqrt(dx * dx + dy * dy);\n }\n /**\n * 计算两个圆形边界之间的最短距离\n * @param other 另一个圆形\n * @returns 最短距离(相交时为负值)\n */\n distanceToCircleFromBoundary(other) {\n return this.distanceToCircle(other) - this.radius - other.radius;\n }\n /**\n * 计算圆形到矩形的最短距离\n * @param rect 矩形\n * @returns 最短距离\n */\n distanceToRect(rect) {\n return Math.max(0, rect.distanceToPoint(this.center) - this.radius);\n }\n /**\n * 获取圆形上距离指定点最近的点\n * @param point 指定点\n * @returns 最近点\n */\n closestPointTo(point) {\n const direction = Vector2.subtract(point, this.center);\n if (direction.isZero) {\n // 点在圆心,返回圆上任意点\n return new Vector2(this.x + this.radius, this.y);\n }\n return this.center.clone().add(direction.normalized().multiply(this.radius));\n }\n /**\n * 获取圆形上距离指定点最远的点\n * @param point 指定点\n * @returns 最远点\n */\n farthestPointFrom(point) {\n const direction = Vector2.subtract(point, this.center);\n if (direction.isZero) {\n // 点在圆心,返回圆上任意点\n return new Vector2(this.x - this.radius, this.y);\n }\n return this.center.clone().subtract(direction.normalized().multiply(this.radius));\n }\n // 几何运算\n /**\n * 获取指定角度上的圆周点\n * @param angle 角度(弧度)\n * @returns 圆周点\n */\n getPointAtAngle(angle) {\n return new Vector2(this.x + this.radius * Math.cos(angle), this.y + this.radius * Math.sin(angle));\n }\n /**\n * 获取点相对于圆心的角度\n * @param point 点\n * @returns 角度(弧度)\n */\n getAngleToPoint(point) {\n return Math.atan2(point.y - this.y, point.x - this.x);\n }\n /**\n * 获取圆形与直线的交点\n * @param lineStart 直线起点\n * @param lineEnd 直线终点\n * @returns 交点数组(0-2个点)\n */\n getLineIntersections(lineStart, lineEnd) {\n const dx = lineEnd.x - lineStart.x;\n const dy = lineEnd.y - lineStart.y;\n const fx = lineStart.x - this.x;\n const fy = lineStart.y - this.y;\n const a = dx * dx + dy * dy;\n const b = 2 * (fx * dx + fy * dy);\n const c = fx * fx + fy * fy - this.radius * this.radius;\n const discriminant = b * b - 4 * a * c;\n if (discriminant < 0) {\n return []; // 无交点\n }\n if (discriminant === 0) {\n // 一个交点(切线)\n const t = -b / (2 * a);\n return [new Vector2(lineStart.x + t * dx, lineStart.y + t * dy)];\n }\n // 两个交点\n const sqrt = Math.sqrt(discriminant);\n const t1 = (-b - sqrt) / (2 * a);\n const t2 = (-b + sqrt) / (2 * a);\n return [\n new Vector2(lineStart.x + t1 * dx, lineStart.y + t1 * dy),\n new Vector2(lineStart.x + t2 * dx, lineStart.y + t2 * dy)\n ];\n }\n // 比较操作\n /**\n * 检查两个圆形是否相等\n * @param other 另一个圆形\n * @param epsilon 容差,默认为Number.EPSILON\n * @returns 是否相等\n */\n equals(other, epsilon = Number.EPSILON) {\n return Math.abs(this.x - other.x) < epsilon &&\n Math.abs(this.y - other.y) < epsilon &&\n Math.abs(this.radius - other.radius) < epsilon;\n }\n /**\n * 检查两个圆形是否完全相等\n * @param other 另一个圆形\n * @returns 是否完全相等\n */\n exactEquals(other) {\n return this.x === other.x && this.y === other.y && this.radius === other.radius;\n }\n // 静态方法\n /**\n * 从直径创建圆形\n * @param x 圆心X坐标\n * @param y 圆心Y坐标\n * @param diameter 直径\n * @returns 新的圆形实例\n */\n static fromDiameter(x, y, diameter) {\n return new Circle(x, y, diameter * 0.5);\n }\n /**\n * 从三个点创建外接圆\n * @param p1 第一个点\n * @param p2 第二个点\n * @param p3 第三个点\n * @returns 外接圆,如果三点共线返回null\n */\n static fromThreePoints(p1, p2, p3) {\n const ax = p1.x;\n const ay = p1.y;\n const bx = p2.x;\n const by = p2.y;\n const cx = p3.x;\n const cy = p3.y;\n const d = 2 * (ax * (by - cy) + bx * (cy - ay) + cx * (ay - by));\n if (Math.abs(d) < Number.EPSILON) {\n return null; // 三点共线\n }\n const ux = ((ax * ax + ay * ay) * (by - cy) + (bx * bx + by * by) * (cy - ay) + (cx * cx + cy * cy) * (ay - by)) / d;\n const uy = ((ax * ax + ay * ay) * (cx - bx) + (bx * bx + by * by) * (ax - cx) + (cx * cx + cy * cy) * (bx - ax)) / d;\n const radius = Math.sqrt((ax - ux) * (ax - ux) + (ay - uy) * (ay - uy));\n return new Circle(ux, uy, radius);\n }\n /**\n * 从点数组创建最小包围圆\n * @param points 点数组\n * @returns 最小包围圆\n */\n static fromPointArray(points) {\n if (points.length === 0) {\n return Circle.EMPTY.clone();\n }\n if (points.length === 1) {\n return new Circle(points[0].x, points[0].y, 0);\n }\n // 使用Welzl算法的简化版本\n // 这里使用更简单的方法:找到包围所有点的圆\n let minX = points[0].x, minY = points[0].y;\n let maxX = points[0].x, maxY = points[0].y;\n for (const point of points) {\n minX = Math.min(minX, point.x);\n minY = Math.min(minY, point.y);\n maxX = Math.max(maxX, point.x);\n maxY = Math.max(maxY, point.y);\n }\n const centerX = (minX + maxX) * 0.5;\n const centerY = (minY + maxY) * 0.5;\n const center = new Vector2(centerX, centerY);\n let maxDistance = 0;\n for (const point of points) {\n const distance = Vector2.distance(center, point);\n maxDistance = Math.max(maxDistance, distance);\n }\n return new Circle(centerX, centerY, maxDistance);\n }\n /**\n * 线性插值两个圆形\n * @param a 起始圆形\n * @param b 目标圆形\n * @param t 插值参数(0到1)\n * @returns 新的插值结果圆形\n */\n static lerp(a, b, t) {\n return new Circle(a.x + (b.x - a.x) * t, a.y + (b.y - a.y) * t, a.radius + (b.radius - a.radius) * t);\n }\n // 字符串转换\n /**\n * 转换为字符串\n * @returns 字符串表示\n */\n toString() {\n return `Circle(${this.x.toFixed(2)}, ${this.y.toFixed(2)}, r=${this.radius.toFixed(2)})`;\n }\n /**\n * 转换为数组\n * @returns [x, y, radius] 数组\n */\n toArray() {\n return [this.x, this.y, this.radius];\n }\n /**\n * 转换为普通对象\n * @returns {x, y, radius} 对象\n */\n toObject() {\n return { x: this.x, y: this.y, radius: this.radius };\n }\n}\n// 静态常量\n/** 空圆形 */\nCircle.EMPTY = new Circle(0, 0, 0);\n/** 单位圆 */\nCircle.UNIT = new Circle(0, 0, 1);\n//# sourceMappingURL=Circle.js.map","/**\n * @zh Q16.16 定点数,用于确定性计算(帧同步)\n * @en Q16.16 fixed-point number for deterministic calculations (lockstep)\n *\n * @zh 使用 16 位整数部分 + 16 位小数部分,范围 ±32767.99998\n * @en Uses 16-bit integer + 16-bit fraction, range ±32767.99998\n *\n * @example\n * ```typescript\n * const a = Fixed32.from(3.14);\n * const b = Fixed32.from(2);\n * const c = a.mul(b); // 6.28\n * console.log(c.toNumber());\n * ```\n */\nexport class Fixed32 {\n // ==================== 构造 ====================\n /**\n * @zh 私有构造函数,使用静态方法创建实例\n * @en Private constructor, use static methods to create instances\n */\n constructor(raw) {\n // 确保是 32 位有符号整数\n this.raw = raw | 0;\n }\n /**\n * @zh 从浮点数创建定点数\n * @en Create fixed-point from floating-point number\n * @param n - @zh 浮点数值 @en Floating-point value\n */\n static from(n) {\n return new Fixed32(Math.round(n * Fixed32.SCALE));\n }\n /**\n * @zh 从原始整数值创建定点数\n * @en Create fixed-point from raw integer value\n * @param raw - @zh 原始值 @en Raw value\n */\n static fromRaw(raw) {\n return new Fixed32(raw);\n }\n /**\n * @zh 从整数创建定点数(无精度损失)\n * @en Create fixed-point from integer (no precision loss)\n * @param n - @zh 整数值 @en Integer value\n */\n static fromInt(n) {\n return new Fixed32((n | 0) << Fixed32.FRACTION_BITS);\n }\n // ==================== 转换 ====================\n /**\n * @zh 转换为浮点数\n * @en Convert to floating-point number\n */\n toNumber() {\n return this.raw / Fixed32.SCALE;\n }\n /**\n * @zh 获取原始整数值\n * @en Get raw integer value\n */\n toRaw() {\n return this.raw;\n }\n /**\n * @zh 转换为整数(向下取整)\n * @en Convert to integer (floor)\n */\n toInt() {\n return this.raw >> Fixed32.FRACTION_BITS;\n }\n /**\n * @zh 转换为字符串\n * @en Convert to string\n */\n toString() {\n return `Fixed32(${this.toNumber().toFixed(5)})`;\n }\n // ==================== 基础运算 ====================\n /**\n * @zh 加法\n * @en Addition\n */\n add(other) {\n return new Fixed32(this.raw + other.raw);\n }\n /**\n * @zh 减法\n * @en Subtraction\n */\n sub(other) {\n return new Fixed32(this.raw - other.raw);\n }\n /**\n * @zh 乘法(使用 64 位中间结果防止溢出)\n * @en Multiplication (uses 64-bit intermediate to prevent overflow)\n */\n mul(other) {\n // 拆分为高低 16 位进行乘法,避免溢出\n const a = this.raw;\n const b = other.raw;\n // 使用 BigInt 确保精度(JS 数字在大数时会丢失精度)\n // 或者使用拆分法\n const aLow = a & 0xFFFF;\n const aHigh = a >> 16;\n const bLow = b & 0xFFFF;\n const bHigh = b >> 16;\n // (aHigh * 2^16 + aLow) * (bHigh * 2^16 + bLow) / 2^16\n // = aHigh * bHigh * 2^16 + aHigh * bLow + aLow * bHigh + aLow * bLow / 2^16\n const lowLow = (aLow * bLow) >>> 16;\n const lowHigh = aLow * bHigh;\n const highLow = aHigh * bLow;\n const highHigh = aHigh * bHigh;\n const result = highHigh * Fixed32.SCALE + lowHigh + highLow + lowLow;\n return new Fixed32(result | 0);\n }\n /**\n * @zh 除法\n * @en Division\n * @throws @zh 除数为零时抛出错误 @en Throws when dividing by zero\n */\n div(other) {\n if (other.raw === 0) {\n throw new Error('Fixed32: Division by zero');\n }\n // 先左移再除,保持精度\n const result = ((this.raw * Fixed32.SCALE) / other.raw) | 0;\n return new Fixed32(result);\n }\n /**\n * @zh 取模运算\n * @en Modulo operation\n */\n mod(other) {\n return new Fixed32(this.raw % other.raw);\n }\n /**\n * @zh 取反\n * @en Negation\n */\n neg() {\n return new Fixed32(-this.raw);\n }\n /**\n * @zh 绝对值\n * @en Absolute value\n */\n abs() {\n return this.raw >= 0 ? this : new Fixed32(-this.raw);\n }\n // ==================== 比较运算 ====================\n /**\n * @zh 等于\n * @en Equal to\n */\n eq(other) {\n return this.raw === other.raw;\n }\n /**\n * @zh 不等于\n * @en Not equal to\n */\n ne(other) {\n return this.raw !== other.raw;\n }\n /**\n * @zh 小于\n * @en Less than\n */\n lt(other) {\n return this.raw < other.raw;\n }\n /**\n * @zh 小于等于\n * @en Less than or equal to\n */\n le(other) {\n return this.raw <= other.raw;\n }\n /**\n * @zh 大于\n * @en Greater than\n */\n gt(other) {\n return this.raw > other.raw;\n }\n /**\n * @zh 大于等于\n * @en Greater than or equal to\n */\n ge(other) {\n return this.raw >= other.raw;\n }\n /**\n * @zh 检查是否为零\n * @en Check if zero\n */\n isZero() {\n return this.raw === 0;\n }\n /**\n * @zh 检查是否为正数\n * @en Check if positive\n */\n isPositive() {\n return this.raw > 0;\n }\n /**\n * @zh 检查是否为负数\n * @en Check if negative\n */\n isNegative() {\n return this.raw < 0;\n }\n // ==================== 数学函数 ====================\n /**\n * @zh 平方根(牛顿迭代法,确定性)\n * @en Square root (Newton's method, deterministic)\n */\n static sqrt(x) {\n if (x.raw <= 0)\n return Fixed32.ZERO;\n // 牛顿迭代法\n let guess = x.raw;\n let prev = 0;\n // 固定迭代次数确保确定性\n for (let i = 0; i < 16; i++) {\n prev = guess;\n guess = ((guess + ((x.raw * Fixed32.SCALE) / guess) | 0) >> 1) | 0;\n if (guess === prev)\n break;\n }\n return new Fixed32(guess);\n }\n /**\n * @zh 向下取整\n * @en Floor\n */\n static floor(x) {\n return new Fixed32(x.raw & ~(Fixed32.SCALE - 1));\n }\n /**\n * @zh 向上取整\n * @en Ceiling\n */\n static ceil(x) {\n const frac = x.raw & (Fixed32.SCALE - 1);\n if (frac === 0)\n return x;\n return new Fixed32((x.raw & ~(Fixed32.SCALE - 1)) + Fixed32.SCALE);\n }\n /**\n * @zh 四舍五入\n * @en Round\n */\n static round(x) {\n return new Fixed32((x.raw + (Fixed32.SCALE >> 1)) & ~(Fixed32.SCALE - 1));\n }\n /**\n * @zh 最小值\n * @en Minimum\n */\n static min(a, b) {\n return a.raw < b.raw ? a : b;\n }\n /**\n * @zh 最大值\n * @en Maximum\n */\n static max(a, b) {\n return a.raw > b.raw ? a : b;\n }\n /**\n * @zh 限制范围\n * @en Clamp to range\n */\n static clamp(x, min, max) {\n if (x.raw < min.raw)\n return min;\n if (x.raw > max.raw)\n return max;\n return x;\n }\n /**\n * @zh 线性插值\n * @en Linear interpolation\n * @param a - @zh 起始值 @en Start value\n * @param b - @zh 结束值 @en End value\n * @param t - @zh 插值参数 (0-1) @en Interpolation parameter (0-1)\n */\n static lerp(a, b, t) {\n // a + (b - a) * t\n return a.add(b.sub(a).mul(t));\n }\n /**\n * @zh 符号函数\n * @en Sign function\n * @returns @zh -1, 0, 或 1 @en -1, 0, or 1\n */\n static sign(x) {\n if (x.raw > 0)\n return Fixed32.ONE;\n if (x.raw < 0)\n return Fixed32.NEG_ONE;\n return Fixed32.ZERO;\n }\n // ==================== 静态运算(便捷方法) ====================\n /**\n * @zh 加法(静态)\n * @en Addition (static)\n */\n static add(a, b) {\n return a.add(b);\n }\n /**\n * @zh 减法(静态)\n * @en Subtraction (static)\n */\n static sub(a, b) {\n return a.sub(b);\n }\n /**\n * @zh 乘法(静态)\n * @en Multiplication (static)\n */\n static mul(a, b) {\n return a.mul(b);\n }\n /**\n * @zh 除法(静态)\n * @en Division (static)\n */\n static div(a, b) {\n return a.div(b);\n }\n}\n/**\n * @zh 小数位数\n * @en Fraction bits\n */\nFixed32.FRACTION_BITS = 16;\n/**\n * @zh 缩放因子 (2^16 = 65536)\n * @en Scale factor (2^16 = 65536)\n */\nFixed32.SCALE = 65536;\n/**\n * @zh 最大值 (约 32767.99998)\n * @en Maximum value (approximately 32767.99998)\n */\nFixed32.MAX_VALUE = 0x7FFFFFFF;\n/**\n * @zh 最小值 (约 -32768)\n * @en Minimum value (approximately -32768)\n */\nFixed32.MIN_VALUE = -0x80000000;\n/**\n * @zh 精度 (1/65536 ≈ 0.0000153)\n * @en Precision (1/65536 ≈ 0.0000153)\n */\nFixed32.EPSILON = 1;\n// ==================== 常量 ====================\n/** @zh 零 @en Zero */\nFixed32.ZERO = new Fixed32(0);\n/** @zh 一 @en One */\nFixed32.ONE = new Fixed32(Fixed32.SCALE);\n/** @zh 负一 @en Negative one */\nFixed32.NEG_ONE = new Fixed32(-Fixed32.SCALE);\n/** @zh 二分之一 @en One half */\nFixed32.HALF = new Fixed32(Fixed32.SCALE >> 1);\n/** @zh 圆周率 π @en Pi */\nFixed32.PI = new Fixed32(205887); // π * 65536\n/** @zh 2π @en Two Pi */\nFixed32.TWO_PI = new Fixed32(411775); // 2π * 65536\n/** @zh π/2 @en Pi divided by 2 */\nFixed32.HALF_PI = new Fixed32(102944); // π/2 * 65536\n/** @zh 弧度转角度系数 (180/π) @en Radians to degrees factor */\nFixed32.RAD_TO_DEG = new Fixed32(3754936); // (180/π) * 65536\n/** @zh 角度转弧度系数 (π/180) @en Degrees to radians factor */\nFixed32.DEG_TO_RAD = new Fixed32(1144); // (π/180) * 65536\n//# sourceMappingURL=Fixed32.js.map","import { Fixed32 } from './Fixed32';\n/**\n * @zh 定点数数学函数库,使用查表法确保确定性\n * @en Fixed-point math functions using lookup tables for determinism\n *\n * @zh 所有三角函数使用预计算的查找表,确保在所有平台上结果一致\n * @en All trigonometric functions use precomputed lookup tables to ensure consistent results across all platforms\n */\nexport class FixedMath {\n /**\n * @zh 生成正弦查找表\n * @en Generate sine lookup table\n */\n static generateSinTable() {\n const table = new Int32Array(FixedMath.SIN_TABLE_SIZE + 1);\n for (let i = 0; i <= FixedMath.SIN_TABLE_SIZE; i++) {\n const angle = (i * Math.PI) / (2 * FixedMath.SIN_TABLE_SIZE);\n table[i] = Math.round(Math.sin(angle) * Fixed32.SCALE);\n }\n return table;\n }\n /**\n * @zh 正弦函数(确定性)\n * @en Sine function (deterministic)\n * @param angle - @zh 角度(弧度,定点数) @en Angle in radians (fixed-point)\n */\n static sin(angle) {\n // 将角度规范化到 [0, 2π)\n let raw = angle.raw % Fixed32.TWO_PI.raw;\n if (raw < 0)\n raw += Fixed32.TWO_PI.raw;\n const halfPi = Fixed32.HALF_PI.raw;\n const pi = Fixed32.PI.raw;\n const threeHalfPi = halfPi * 3;\n let tableAngle;\n let negative = false;\n if (raw <= halfPi) {\n // 第一象限: [0, π/2]\n tableAngle = raw;\n }\n else if (raw <= pi) {\n // 第二象限: (π/2, π]\n tableAngle = pi - raw;\n }\n else if (raw <= threeHalfPi) {\n // 第三象限: (π, 3π/2]\n tableAngle = raw - pi;\n negative = true;\n }\n else {\n // 第四象限: (3π/2, 2π)\n tableAngle = Fixed32.TWO_PI.raw - raw;\n negative = true;\n }\n // 计算表索引 (tableAngle 范围是 [0, π/2])\n const tableIndex = Math.min(((tableAngle * FixedMath.SIN_TABLE_SIZE) / halfPi) | 0, FixedMath.SIN_TABLE_SIZE);\n const result = FixedMath.SIN_TABLE[tableIndex];\n return Fixed32.fromRaw(negative ? -result : result);\n }\n /**\n * @zh 余弦函数(确定性)\n * @en Cosine function (deterministic)\n * @param angle - @zh 角度(弧度,定点数) @en Angle in radians (fixed-point)\n */\n static cos(angle) {\n // cos(x) = sin(x + π/2)\n return FixedMath.sin(angle.add(Fixed32.HALF_PI));\n }\n /**\n * @zh 正切函数(确定性)\n * @en Tangent function (deterministic)\n * @param angle - @zh 角度(弧度,定点数) @en Angle in radians (fixed-point)\n */\n static tan(angle) {\n const cosVal = FixedMath.cos(angle);\n if (cosVal.isZero()) {\n // 返回最大值表示无穷大\n return Fixed32.fromRaw(Fixed32.MAX_VALUE);\n }\n return FixedMath.sin(angle).div(cosVal);\n }\n /**\n * @zh 反正切函数 atan2(确定性)\n * @en Arc tangent of y/x (deterministic)\n * @param y - @zh Y 坐标 @en Y coordinate\n * @param x - @zh X 坐标 @en X coordinate\n * @returns @zh 角度(弧度,范围 -π 到 π)@en Angle in radians (range -π to π)\n */\n static atan2(y, x) {\n const yRaw = y.raw;\n const xRaw = x.raw;\n if (xRaw === 0 && yRaw === 0) {\n return Fixed32.ZERO;\n }\n // 使用 CORDIC 算法的简化版本\n const absY = Math.abs(yRaw);\n const absX = Math.abs(xRaw);\n let angle;\n if (absX >= absY) {\n // |y/x| <= 1,使用泰勒展开近似\n angle = FixedMath.atanApprox(absY, absX);\n }\n else {\n // |y/x| > 1,使用恒等式 atan(y/x) = π/2 - atan(x/y)\n angle = Fixed32.HALF_PI.raw - FixedMath.atanApprox(absX, absY);\n }\n // 根据象限调整\n if (xRaw < 0) {\n angle = Fixed32.PI.raw - angle;\n }\n if (yRaw < 0) {\n angle = -angle;\n }\n return Fixed32.fromRaw(angle);\n }\n /**\n * @zh atan 近似计算(内部使用)\n * @en Approximate atan calculation (internal use)\n */\n static atanApprox(num, den) {\n if (den === 0)\n return Fixed32.HALF_PI.raw;\n // 使用多项式近似: atan(x) ≈ x - x³/3 + x⁵/5\n // 对于 |x| <= 1 精度足够\n const ratio = ((num * Fixed32.SCALE) / den) | 0;\n // 简化的多项式: atan(x) ≈ x * (1 - x²/3)\n // 更精确的版本: atan(x) ≈ x / (1 + 0.28125 * x²)\n const x2 = ((ratio * ratio) / Fixed32.SCALE) | 0;\n const factor = Fixed32.SCALE + ((x2 * 18432) / Fixed32.SCALE | 0); // 0.28125 * 65536 ≈ 18432\n const result = ((ratio * Fixed32.SCALE) / factor) | 0;\n return result;\n }\n /**\n * @zh 反正弦函数(确定性)\n * @en Arc sine function (deterministic)\n * @param x - @zh 值(范围 -1 到 1)@en Value (range -1 to 1)\n */\n static asin(x) {\n // asin(x) = atan2(x, sqrt(1 - x²))\n const one = Fixed32.ONE;\n const x2 = x.mul(x);\n const sqrt = Fixed32.sqrt(one.sub(x2));\n return FixedMath.atan2(x, sqrt);\n }\n /**\n * @zh 反余弦函数(确定性)\n * @en Arc cosine function (deterministic)\n * @param x - @zh 值(范围 -1 到 1)@en Value (range -1 to 1)\n */\n static acos(x) {\n // acos(x) = π/2 - asin(x)\n return Fixed32.HALF_PI.sub(FixedMath.asin(x));\n }\n /**\n * @zh 角度规范化到 [-π, π]\n * @en Normalize angle to [-π, π]\n */\n static normalizeAngle(angle) {\n let raw = angle.raw % Fixed32.TWO_PI.raw;\n if (raw > Fixed32.PI.raw) {\n raw -= Fixed32.TWO_PI.raw;\n }\n else if (raw < -Fixed32.PI.raw) {\n raw += Fixed32.TWO_PI.raw;\n }\n return Fixed32.fromRaw(raw);\n }\n /**\n * @zh 角度差值(最短路径)\n * @en Angle difference (shortest path)\n */\n static angleDelta(from, to) {\n return FixedMath.normalizeAngle(to.sub(from));\n }\n /**\n * @zh 角度线性插值(最短路径)\n * @en Angle linear interpolation (shortest path)\n */\n static lerpAngle(from, to, t) {\n const delta = FixedMath.angleDelta(from, to);\n return from.add(delta.mul(t));\n }\n /**\n * @zh 弧度转角度\n * @en Radians to degrees\n */\n static radToDeg(rad) {\n return rad.mul(Fixed32.RAD_TO_DEG);\n }\n /**\n * @zh 角度转弧度\n * @en Degrees to radians\n */\n static degToRad(deg) {\n return deg.mul(Fixed32.DEG_TO_RAD);\n }\n /**\n * @zh 幂函数(整数次幂)\n * @en Power function (integer exponent)\n */\n static pow(base, exp) {\n if (exp === 0)\n return Fixed32.ONE;\n if (exp < 0) {\n base = Fixed32.ONE.div(base);\n exp = -exp;\n }\n let result = Fixed32.ONE;\n while (exp > 0) {\n if (exp & 1) {\n result = result.mul(base);\n }\n base = base.mul(base);\n exp >>= 1;\n }\n return result;\n }\n /**\n * @zh 指数函数近似(e^x)\n * @en Exponential function approximation (e^x)\n */\n static exp(x) {\n // 使用泰勒展开: e^x ≈ 1 + x + x²/2 + x³/6 + x⁴/24\n const one = Fixed32.ONE;\n const x2 = x.mul(x);\n const x3 = x2.mul(x);\n const x4 = x3.mul(x);\n return one\n .add(x)\n .add(x2.div(Fixed32.from(2)))\n .add(x3.div(Fixed32.from(6)))\n .add(x4.div(Fixed32.from(24)));\n }\n /**\n * @zh 自然对数近似\n * @en Natural logarithm approximation\n */\n static ln(x) {\n if (x.raw <= 0) {\n throw new Error('FixedMath.ln: argument must be positive');\n }\n // 使用牛顿迭代法: y_{n+1} = y_n + 2 * (x - exp(y_n)) / (x + exp(y_n))\n let y = Fixed32.ZERO;\n const two = Fixed32.from(2);\n for (let i = 0; i < 10; i++) {\n const expY = FixedMath.exp(y);\n const diff = x.sub(expY);\n const sum = x.add(expY);\n y = y.add(two.mul(diff).div(sum));\n }\n return y;\n }\n}\n/**\n * @zh 正弦表大小(每 90 度的采样点数)\n * @en Sine table size (samples per 90 degrees)\n */\nFixedMath.SIN_TABLE_SIZE = 1024;\n/**\n * @zh 正弦查找表(0 到 90 度)\n * @en Sine lookup table (0 to 90 degrees)\n */\nFixedMath.SIN_TABLE = FixedMath.generateSinTable();\n//# sourceMappingURL=FixedMath.js.map","import { Fixed32 } from './Fixed32';\nimport { FixedMath } from './FixedMath';\n/**\n * @zh 定点数 2D 向量类,用于确定性计算(帧同步)\n * @en Fixed-point 2D vector class for deterministic calculations (lockstep)\n *\n * @zh 所有运算返回新实例,保证不可变性\n * @en All operations return new instances, ensuring immutability\n *\n * @example\n * ```typescript\n * const a = FixedVector2.from(3, 4);\n * const b = FixedVector2.from(1, 2);\n * const c = a.add(b); // (4, 6)\n * const len = a.length(); // 5\n * ```\n */\nexport class FixedVector2 {\n // ==================== 构造 ====================\n /**\n * @zh 创建定点数向量\n * @en Create fixed-point vector\n */\n constructor(x, y) {\n this.x = x;\n this.y = y;\n }\n /**\n * @zh 从浮点数创建向量\n * @en Create vector from floating-point numbers\n */\n static from(x, y) {\n return new FixedVector2(Fixed32.from(x), Fixed32.from(y));\n }\n /**\n * @zh 从原始整数值创建向量\n * @en Create vector from raw integer values\n */\n static fromRaw(rawX, rawY) {\n return new FixedVector2(Fixed32.fromRaw(rawX), Fixed32.fromRaw(rawY));\n }\n /**\n * @zh 从整数创建向量\n * @en Create vector from integers\n */\n static fromInt(x, y) {\n return new FixedVector2(Fixed32.fromInt(x), Fixed32.fromInt(y));\n }\n /**\n * @zh 从普通向量接口创建\n * @en Create from plain vector interface\n */\n static fromObject(obj) {\n return FixedVector2.from(obj.x, obj.y);\n }\n // ==================== 转换 ====================\n /**\n * @zh 转换为浮点数对象(用于渲染)\n * @en Convert to floating-point object (for rendering)\n */\n toObject() {\n return {\n x: this.x.toNumber(),\n y: this.y.toNumber()\n };\n }\n /**\n * @zh 转换为数组\n * @en Convert to array\n */\n toArray() {\n return [this.x.toNumber(), this.y.toNumber()];\n }\n /**\n * @zh 获取原始值对象(用于网络传输)\n * @en Get raw values object (for network transmission)\n */\n toRawObject() {\n return {\n x: this.x.toRaw(),\n y: this.y.toRaw()\n };\n }\n /**\n * @zh 转换为字符串\n * @en Convert to string\n */\n toString() {\n return `FixedVector2(${this.x.toNumber().toFixed(3)}, ${this.y.toNumber().toFixed(3)})`;\n }\n /**\n * @zh 克隆向量\n * @en Clone vector\n */\n clone() {\n return new FixedVector2(this.x, this.y);\n }\n // ==================== 基础运算 ====================\n /**\n * @zh 向量加法\n * @en Vector addition\n */\n add(other) {\n return new FixedVector2(this.x.add(other.x), this.y.add(other.y));\n }\n /**\n * @zh 向量减法\n * @en Vector subtraction\n */\n sub(other) {\n return new FixedVector2(this.x.sub(other.x), this.y.sub(other.y));\n }\n /**\n * @zh 标量乘法\n * @en Scalar multiplication\n */\n mul(scalar) {\n return new FixedVector2(this.x.mul(scalar), this.y.mul(scalar));\n }\n /**\n * @zh 标量除法\n * @en Scalar division\n */\n div(scalar) {\n return new FixedVector2(this.x.div(scalar), this.y.div(scalar));\n }\n /**\n * @zh 分量乘法\n * @en Component-wise multiplication\n */\n mulComponents(other) {\n return new FixedVector2(this.x.mul(other.x), this.y.mul(other.y));\n }\n /**\n * @zh 分量除法\n * @en Component-wise division\n */\n divComponents(other) {\n return new FixedVector2(this.x.div(other.x), this.y.div(other.y));\n }\n /**\n * @zh 取反\n * @en Negate\n */\n neg() {\n return new FixedVector2(this.x.neg(), this.y.neg());\n }\n // ==================== 向量运算 ====================\n /**\n * @zh 点积\n * @en Dot product\n */\n dot(other) {\n return this.x.mul(other.x).add(this.y.mul(other.y));\n }\n /**\n * @zh 叉积(2D 返回标量)\n * @en Cross product (returns scalar in 2D)\n */\n cross(other) {\n return this.x.mul(other.y).sub(this.y.mul(other.x));\n }\n /**\n * @zh 长度的平方\n * @en Length squared\n */\n lengthSquared() {\n return this.dot(this);\n }\n /**\n * @zh 长度(模)\n * @en Length (magnitude)\n */\n length() {\n return Fixed32.sqrt(this.lengthSquared());\n }\n /**\n * @zh 归一化(转换为单位向量)\n * @en Normalize (convert to unit vector)\n */\n normalize() {\n const len = this.length();\n if (len.isZero()) {\n return FixedVector2.ZERO;\n }\n return this.div(len);\n }\n /**\n * @zh 到另一个向量的距离平方\n * @en Distance squared to another vector\n */\n distanceSquaredTo(other) {\n const dx = this.x.sub(other.x);\n const dy = this.y.sub(other.y);\n return dx.mul(dx).add(dy.mul(dy));\n }\n /**\n * @zh 到另一个向量的距离\n * @en Distance to another vector\n */\n distanceTo(other) {\n return Fixed32.sqrt(this.distanceSquaredTo(other));\n }\n /**\n * @zh 获取垂直向量(顺时针旋转90度)\n * @en Get perpendicular vector (clockwise 90 degrees)\n */\n perpendicular() {\n return new FixedVector2(this.y, this.x.neg());\n }\n /**\n * @zh 获取垂直向量(逆时针旋转90度)\n * @en Get perpendicular vector (counter-clockwise 90 degrees)\n */\n perpendicularCCW() {\n return new FixedVector2(this.y.neg(), this.x);\n }\n /**\n * @zh 投影到另一个向量上\n * @en Project onto another vector\n */\n projectOnto(onto) {\n const dot = this.dot(onto);\n const lenSq = onto.lengthSquared();\n if (lenSq.isZero()) {\n return FixedVector2.ZERO;\n }\n return onto.mul(dot.div(lenSq));\n }\n /**\n * @zh 反射向量(关于法线)\n * @en Reflect vector (about normal)\n */\n reflect(normal) {\n const dot = this.dot(normal);\n const two = Fixed32.from(2);\n return this.sub(normal.mul(two.mul(dot)));\n }\n // ==================== 旋转和角度 ====================\n /**\n * @zh 旋转向量(顺时针为正,左手坐标系)\n * @en Rotate vector (clockwise positive, left-hand coordinate system)\n * @param angle - @zh 旋转角度(弧度)@en Rotation angle in radians\n */\n rotate(angle) {\n const cos = FixedMath.cos(angle);\n const sin = FixedMath.sin(angle);\n // 顺时针旋转: x' = x*cos + y*sin, y' = -x*sin + y*cos\n return new FixedVector2(this.x.mul(cos).add(this.y.mul(sin)), this.x.neg().mul(sin).add(this.y.mul(cos)));\n }\n /**\n * @zh 围绕一个点旋转\n * @en Rotate around a point\n */\n rotateAround(center, angle) {\n return this.sub(center).rotate(angle).add(center);\n }\n /**\n * @zh 获取向量角度(弧度)\n * @en Get vector angle in radians\n */\n angle() {\n return FixedMath.atan2(this.y, this.x);\n }\n /**\n * @zh 获取与另一个向量的夹角\n * @en Get angle between this and another vector\n */\n angleTo(other) {\n const cross = this.cross(other);\n const dot = this.dot(other);\n return FixedMath.atan2(cross, dot);\n }\n /**\n * @zh 从极坐标创建向量\n * @en Create vector from polar coordinates\n */\n static fromPolar(length, angle) {\n return new FixedVector2(length.mul(FixedMath.cos(angle)), length.mul(FixedMath.sin(angle)));\n }\n /**\n * @zh 从角度创建单位向量\n * @en Create unit vector from angle\n */\n static fromAngle(angle) {\n return new FixedVector2(FixedMath.cos(angle), FixedMath.sin(angle));\n }\n // ==================== 比较运算 ====================\n /**\n * @zh 检查是否相等\n * @en Check equality\n */\n equals(other) {\n return this.x.eq(other.x) && this.y.eq(other.y);\n }\n /**\n * @zh 检查是否为零向量\n * @en Check if zero vector\n */\n isZero() {\n return this.x.isZero() && this.y.isZero();\n }\n // ==================== 限制和插值 ====================\n /**\n * @zh 限制长度\n * @en Clamp length\n */\n clampLength(maxLength) {\n const lenSq = this.lengthSquared();\n const maxLenSq = maxLength.mul(maxLength);\n if (lenSq.gt(maxLenSq)) {\n return this.normalize().mul(maxLength);\n }\n return this;\n }\n /**\n * @zh 限制分量范围\n * @en Clamp components\n */\n clamp(min, max) {\n return new FixedVector2(Fixed32.clamp(this.x, min.x, max.x), Fixed32.clamp(this.y, min.y, max.y));\n }\n /**\n * @zh 线性插值\n * @en Linear interpolation\n */\n lerp(target, t) {\n return new FixedVector2(Fixed32.lerp(this.x, target.x, t), Fixed32.lerp(this.y, target.y, t));\n }\n /**\n * @zh 向目标移动固定距离\n * @en Move towards target by fixed distance\n */\n moveTowards(target, maxDistance) {\n const diff = target.sub(this);\n const dist = diff.length();\n if (dist.isZero() || dist.le(maxDistance)) {\n return target;\n }\n return this.add(diff.div(dist).mul(maxDistance));\n }\n // ==================== 静态方法 ====================\n /**\n * @zh 向量加法(静态)\n * @en Vector addition (static)\n */\n static add(a, b) {\n return a.add(b);\n }\n /**\n * @zh 向量减法(静态)\n * @en Vector subtraction (static)\n */\n static sub(a, b) {\n return a.sub(b);\n }\n /**\n * @zh 点积(静态)\n * @en Dot product (static)\n */\n static dot(a, b) {\n return a.dot(b);\n }\n /**\n * @zh 叉积(静态)\n * @en Cross product (static)\n */\n static cross(a, b) {\n return a.cross(b);\n }\n /**\n * @zh 距离(静态)\n * @en Distance (static)\n */\n static distance(a, b) {\n return a.distanceTo(b);\n }\n /**\n * @zh 线性插值(静态)\n * @en Linear interpolation (static)\n */\n static lerp(a, b, t) {\n return a.lerp(b, t);\n }\n /**\n * @zh 获取两个向量的最小分量\n * @en Get minimum components of two vectors\n */\n static min(a, b) {\n return new FixedVector2(Fixed32.min(a.x, b.x), Fixed32.min(a.y, b.y));\n }\n /**\n * @zh 获取两个向量的最大分量\n * @en Get maximum components of two vectors\n */\n static max(a, b) {\n return new FixedVector2(Fixed32.max(a.x, b.x), Fixed32.max(a.y, b.y));\n }\n}\n// ==================== 常量 ====================\n/** @zh 零向量 (0, 0) @en Zero vector */\nFixedVector2.ZERO = new FixedVector2(Fixed32.ZERO, Fixed32.ZERO);\n/** @zh 单位向量 (1, 1) @en One vector */\nFixedVector2.ONE = new FixedVector2(Fixed32.ONE, Fixed32.ONE);\n/** @zh 右方向 (1, 0) @en Right direction */\nFixedVector2.RIGHT = new FixedVector2(Fixed32.ONE, Fixed32.ZERO);\n/** @zh 左方向 (-1, 0) @en Left direction */\nFixedVector2.LEFT = new FixedVector2(Fixed32.NEG_ONE, Fixed32.ZERO);\n/** @zh 上方向 (0, 1) @en Up direction */\nFixedVector2.UP = new FixedVector2(Fixed32.ZERO, Fixed32.ONE);\n/** @zh 下方向 (0, -1) @en Down direction */\nFixedVector2.DOWN = new FixedVector2(Fixed32.ZERO, Fixed32.NEG_ONE);\n//# sourceMappingURL=FixedVector2.js.map","import { Vector2 } from './Vector2';\n/**\n * 数学工具函数集合\n *\n * 提供常用的数学运算、插值、随机数生成等实用工具函数\n */\nexport class MathUtils {\n // 角度转换\n /**\n * 角度转弧度\n * @param degrees 角度值\n * @returns 弧度值\n */\n static degToRad(degrees) {\n return degrees * MathUtils.DEG_TO_RAD;\n }\n /**\n * 弧度转角度\n * @param radians 弧度值\n * @returns 角度值\n */\n static radToDeg(radians) {\n return radians * MathUtils.RAD_TO_DEG;\n }\n /**\n * 规范化角度到[0, 2π)范围\n * @param radians 角度(弧度)\n * @returns 规范化后的角度\n */\n static normalizeAngle(radians) {\n while (radians < 0)\n radians += MathUtils.TWO_PI;\n while (radians >= MathUtils.TWO_PI)\n radians -= MathUtils.TWO_PI;\n return radians;\n }\n /**\n * 规范化角度到(-π, π]范围\n * @param radians 角度(弧度)\n * @returns 规范化后的角度\n */\n static normalizeAngleSigned(radians) {\n while (radians <= -Math.PI)\n radians += MathUtils.TWO_PI;\n while (radians > Math.PI)\n radians -= MathUtils.TWO_PI;\n return radians;\n }\n /**\n * 计算两个角度之间的最短角度差\n * @param from 起始角度(弧度)\n * @param to 目标角度(弧度)\n * @returns 角度差(-π到π)\n */\n static angleDifference(from, to) {\n let diff = to - from;\n diff = MathUtils.normalizeAngleSigned(diff);\n return diff;\n }\n /**\n * 角度插值(处理角度环绕)\n * @param from 起始角度(弧度)\n * @param to 目标角度(弧度)\n * @param t 插值参数(0到1)\n * @returns 插值结果角度\n */\n static lerpAngle(from, to, t) {\n const diff = MathUtils.angleDifference(from, to);\n return from + diff * t;\n }\n // 数值操作\n /**\n * 限制数值在指定范围内\n * @param value 待限制的值\n * @param min 最小值\n * @param max 最大值\n * @returns 限制后的值\n */\n static clamp(value, min, max) {\n return Math.max(min, Math.min(max, value));\n }\n /**\n * 限制数值在0到1之间\n * @param value 待限制的值\n * @returns 限制后的值\n */\n static clamp01(value) {\n return Math.max(0, Math.min(1, value));\n }\n /**\n * 线性插值\n * @param a 起始值\n * @param b 目标值\n * @param t 插值参数(0到1)\n * @returns 插值结果\n */\n static lerp(a, b, t) {\n return a + (b - a) * t;\n }\n /**\n * 反向线性插值(获取插值参数)\n * @param a 起始值\n * @param b 目标值\n * @param value 当前值\n * @returns 插值参数\n */\n static inverseLerp(a, b, value) {\n if (Math.abs(b - a) < MathUtils.EPSILON) {\n return 0;\n }\n return (value - a) / (b - a);\n }\n /**\n * 重映射数值从一个范围到另一个范围\n * @param value 输入值\n * @param inMin 输入范围最小值\n * @param inMax 输入范围最大值\n * @param outMin 输出范围最小值\n * @param outMax 输出范围最大值\n * @returns 重映射后的值\n */\n static remap(value, inMin, inMax, outMin, outMax) {\n const t = MathUtils.inverseLerp(inMin, inMax, value);\n return MathUtils.lerp(outMin, outMax, t);\n }\n /**\n * 平滑阶跃函数(Hermite插值)\n * @param t 输入参数(0到1)\n * @returns 平滑输出(0到1)\n */\n static smoothStep(t) {\n t = MathUtils.clamp01(t);\n return t * t * (3 - 2 * t);\n }\n /**\n * 更平滑的阶跃函数\n * @param t 输入参数(0到1)\n * @returns 平滑输出(0到1)\n */\n static smootherStep(t) {\n t = MathUtils.clamp01(t);\n return t * t * t * (t * (t * 6 - 15) + 10);\n }\n // 比较操作\n /**\n * 浮点数相等比较\n * @param a 数值a\n * @param b 数值b\n * @param epsilon 容差,默认为EPSILON\n * @returns 是否相等\n */\n static approximately(a, b, epsilon = MathUtils.EPSILON) {\n return Math.abs(a - b) < epsilon;\n }\n /**\n * 检查数值是否为零\n * @param value 数值\n * @param epsilon 容差,默认为EPSILON\n * @returns 是否为零\n */\n static isZero(value, epsilon = MathUtils.EPSILON) {\n return Math.abs(value) < epsilon;\n }\n /**\n * 获取数值的符号\n * @param value 数值\n * @returns 1、-1或0\n */\n static sign(value) {\n return value > 0 ? 1 : value < 0 ? -1 : 0;\n }\n // 随机数生成\n /**\n * 生成指定范围内的随机数\n * @param min 最小值(包含)\n * @param max 最大值(不包含)\n * @returns 随机数\n */\n static random(min = 0, max = 1) {\n return Math.random() * (max - min) + min;\n }\n /**\n * 生成指定范围内的随机整数\n * @param min 最小值(包含)\n * @param max 最大值(包含)\n * @returns 随机整数\n */\n static randomInt(min, max) {\n return Math.floor(Math.random() * (max - min + 1)) + min;\n }\n /**\n * 随机选择数组中的一个元素\n * @param array 数组\n * @returns 随机元素\n */\n static randomChoice(array) {\n return array[Math.floor(Math.random() * array.length)];\n }\n /**\n * 生成随机布尔值\n * @param probability 为true的概率(0到1),默认0.5\n * @returns 随机布尔值\n */\n static randomBoolean(probability = 0.5) {\n return Math.random() < probability;\n }\n /**\n * 生成单位圆内的随机点\n * @returns 随机向量\n */\n static randomInUnitCircle() {\n const angle = Math.random() * MathUtils.TWO_PI;\n const radius = Math.sqrt(Math.random());\n return Vector2.fromPolar(radius, angle);\n }\n /**\n * 生成单位圆上的随机点\n * @returns 随机单位向量\n */\n static randomOnUnitCircle() {\n const angle = Math.random() * MathUtils.TWO_PI;\n return Vector2.fromAngle(angle);\n }\n // 数学函数\n /**\n * 快速平方根倒数(用于归一化)\n * @param value 输入值\n * @returns 平方根倒数\n */\n static fastInverseSqrt(value) {\n // 简化版本,现代JavaScript引擎优化很好\n return 1 / Math.sqrt(value);\n }\n /**\n * 快速幂运算(整数指数)\n * @param base 底数\n * @param exponent 指数(整数)\n * @returns 幂运算结果\n */\n static fastPow(base, exponent) {\n if (exponent === 0)\n return 1;\n if (exponent === 1)\n return base;\n if (exponent === 2)\n return base * base;\n if (exponent === 3)\n return base * base * base;\n return Math.pow(base, exponent);\n }\n /**\n * 阶乘\n * @param n 非负整数\n * @returns 阶乘结果\n */\n static factorial(n) {\n if (n < 0)\n return NaN;\n if (n === 0 || n === 1)\n return 1;\n let result = 1;\n for (let i = 2; i <= n; i++) {\n result *= i;\n }\n return result;\n }\n /**\n * 最大公约数\n * @param a 整数a\n * @param b 整数b\n * @returns 最大公约数\n */\n static gcd(a, b) {\n a = Math.abs(Math.floor(a));\n b = Math.abs(Math.floor(b));\n while (b !== 0) {\n const temp = b;\n b = a % b;\n a = temp;\n }\n return a;\n }\n /**\n * 最小公倍数\n * @param a 整数a\n * @param b 整数b\n * @returns 最小公倍数\n */\n static lcm(a, b) {\n return Math.abs(a * b) / MathUtils.gcd(a, b);\n }\n // 序列和级数\n /**\n * 斐波那契数列\n * @param n 项数\n * @returns 第n项斐波那契数\n */\n static fibonacci(n) {\n if (n <= 0)\n return 0;\n if (n === 1)\n return 1;\n let a = 0, b = 1;\n for (let i = 2; i <= n; i++) {\n const temp = a + b;\n a = b;\n b = temp;\n }\n return b;\n }\n /**\n * 等差数列求和\n * @param first 首项\n * @param last 末项\n * @param count 项数\n * @returns 等差数列和\n */\n static arithmeticSum(first, last, count) {\n return (first + last) * count * 0.5;\n }\n /**\n * 等比数列求和\n * @param first 首项\n * @param ratio 公比\n * @param count 项数\n * @returns 等比数列和\n */\n static geometricSum(first, ratio, count) {\n if (Math.abs(ratio - 1) < MathUtils.EPSILON) {\n return first * count;\n }\n return first * (1 - Math.pow(ratio, count)) / (1 - ratio);\n }\n // 曲线和插值\n /**\n * 贝塞尔二次曲线\n * @param p0 控制点0\n * @param p1 控制点1\n * @param p2 控制点2\n * @param t 参数(0到1)\n * @returns 曲线上的点\n */\n static quadraticBezier(p0, p1, p2, t) {\n const u = 1 - t;\n const tt = t * t;\n const uu = u * u;\n return new Vector2(uu * p0.x + 2 * u * t * p1.x + tt * p2.x, uu * p0.y + 2 * u * t * p1.y + tt * p2.y);\n }\n /**\n * 贝塞尔三次曲线\n * @param p0 控制点0\n * @param p1 控制点1\n * @param p2 控制点2\n * @param p3 控制点3\n * @param t 参数(0到1)\n * @returns 曲线上的点\n */\n static cubicBezier(p0, p1, p2, p3, t) {\n const u = 1 - t;\n const tt = t * t;\n const uu = u * u;\n const uuu = uu * u;\n const ttt = tt * t;\n return new Vector2(uuu * p0.x + 3 * uu * t * p1.x + 3 * u * tt * p2.x + ttt * p3.x, uuu * p0.y + 3 * uu * t * p1.y + 3 * u * tt * p2.y + ttt * p3.y);\n }\n /**\n * Catmull-Rom样条插值\n * @param p0 控制点0\n * @param p1 控制点1\n * @param p2 控制点2\n * @param p3 控制点3\n * @param t 参数(0到1)\n * @returns 插值结果点\n */\n static catmullRom(p0, p1, p2, p3, t) {\n const t2 = t * t;\n const t3 = t2 * t;\n const x = 0.5 * ((2 * p1.x) +\n (-p0.x + p2.x) * t +\n (2 * p0.x - 5 * p1.x + 4 * p2.x - p3.x) * t2 +\n (-p0.x + 3 * p1.x - 3 * p2.x + p3.x) * t3);\n const y = 0.5 * ((2 * p1.y) +\n (-p0.y + p2.y) * t +\n (2 * p0.y - 5 * p1.y + 4 * p2.y - p3.y) * t2 +\n (-p0.y + 3 * p1.y - 3 * p2.y + p3.y) * t3);\n return new Vector2(x, y);\n }\n // 噪声函数\n /**\n * 简单伪随机噪声(基于种子)\n * @param x 输入X\n * @param y 输入Y\n * @param seed 种子\n * @returns 噪声值(0到1)\n */\n static noise(x, y = 0, seed = 0) {\n const n = Math.sin(x * 12.9898 + y * 78.233 + seed * 37.719) * 43758.5453;\n return n - Math.floor(n);\n }\n /**\n * 平滑噪声\n * @param x 输入X\n * @param y 输入Y\n * @param seed 种子\n * @returns 平滑噪声值(0到1)\n */\n static smoothNoise(x, y = 0, seed = 0) {\n const intX = Math.floor(x);\n const intY = Math.floor(y);\n const fracX = x - intX;\n const fracY = y - intY;\n const a = MathUtils.noise(intX, intY, seed);\n const b = MathUtils.noise(intX + 1, intY, seed);\n const c = MathUtils.noise(intX, intY + 1, seed);\n const d = MathUtils.noise(intX + 1, intY + 1, seed);\n const i1 = MathUtils.lerp(a, b, fracX);\n const i2 = MathUtils.lerp(c, d, fracX);\n return MathUtils.lerp(i1, i2, fracY);\n }\n // 实用工具\n /**\n * 将数值转换为指定精度\n * @param value 数值\n * @param precision 精度(小数位数)\n * @returns 转换后的数值\n */\n static toPrecision(value, precision) {\n const factor = Math.pow(10, precision);\n return Math.round(value * factor) / factor;\n }\n /**\n * 检查数值是否在指定范围内\n * @param value 数值\n * @param min 最小值\n * @param max 最大值\n * @returns 是否在范围内\n */\n static inRange(value, min, max) {\n return value >= min && value <= max;\n }\n /**\n * 获取数组中的最小值\n * @param values 数值数组\n * @returns 最小值\n */\n static min(...values) {\n return Math.min(...values);\n }\n /**\n * 获取数组中的最大值\n * @param values 数值数组\n * @returns 最大值\n */\n static max(...values) {\n return Math.max(...values);\n }\n /**\n * 计算数组的平均值\n * @param values 数值数组\n * @returns 平均值\n */\n static average(values) {\n if (values.length === 0)\n return 0;\n return values.reduce((sum, val) => sum + val, 0) / values.length;\n }\n /**\n * 计算数组的中位数\n * @param values 数值数组\n * @returns 中位数\n */\n static median(values) {\n if (values.length === 0)\n return 0;\n const sorted = [...values].sort((a, b) => a - b);\n const middle = Math.floor(sorted.length / 2);\n if (sorted.length % 2 === 0) {\n return (sorted[middle - 1] + sorted[middle]) / 2;\n }\n return sorted[middle];\n }\n}\n// 数学常量\n/** 圆周率 */\nMathUtils.PI = Math.PI;\n/** 2π */\nMathUtils.TWO_PI = Math.PI * 2;\n/** π/2 */\nMathUtils.HALF_PI = Math.PI * 0.5;\n/** π/4 */\nMathUtils.QUARTER_PI = Math.PI * 0.25;\n/** 角度到弧度转换系数 */\nMathUtils.DEG_TO_RAD = Math.PI / 180;\n/** 弧度到角度转换系数 */\nMathUtils.RAD_TO_DEG = 180 / Math.PI;\n/** 黄金比例 */\nMathUtils.GOLDEN_RATIO = (1 + Math.sqrt(5)) * 0.5;\n/** 默认浮点数比较容差 */\nMathUtils.EPSILON = Number.EPSILON;\n//# sourceMappingURL=MathUtils.js.map","/**\n * Color utility class for game engine\n * 游戏引擎颜色工具类\n *\n * Provides color conversion, manipulation, and packing utilities.\n * 提供颜色转换、操作和打包工具。\n */\n/**\n * Color class for color manipulation and conversion\n * 颜色类,用于颜色操作和转换\n */\nexport class Color {\n /**\n * Create a new Color instance\n * 创建新的 Color 实例\n */\n constructor(r = 255, g = 255, b = 255, a = 1) {\n this.r = Math.round(Math.max(0, Math.min(255, r)));\n this.g = Math.round(Math.max(0, Math.min(255, g)));\n this.b = Math.round(Math.max(0, Math.min(255, b)));\n this.a = Math.max(0, Math.min(1, a));\n }\n // ===== Factory Methods | 工厂方法 =====\n /**\n * Create color from hex string\n * 从十六进制字符串创建颜色\n * @param hex Hex string (e.g., \"#FF0000\", \"#F00\", \"FF0000\") | 十六进制字符串\n * @param alpha Optional alpha value (0-1) | 可选的透明度值\n */\n static fromHex(hex, alpha = 1) {\n const { r, g, b } = Color.hexToRgb(hex);\n return new Color(r, g, b, alpha);\n }\n /**\n * Create color from packed uint32 (0xRRGGBB or 0xAARRGGBB)\n * 从打包的 uint32 创建颜色\n * @param value Packed color value | 打包的颜色值\n * @param hasAlpha Whether value includes alpha | 是否包含透明度\n */\n static fromUint32(value, hasAlpha = false) {\n if (hasAlpha) {\n const a = ((value >> 24) & 0xFF) / 255;\n const r = (value >> 16) & 0xFF;\n const g = (value >> 8) & 0xFF;\n const b = value & 0xFF;\n return new Color(r, g, b, a);\n }\n else {\n const r = (value >> 16) & 0xFF;\n const g = (value >> 8) & 0xFF;\n const b = value & 0xFF;\n return new Color(r, g, b);\n }\n }\n /**\n * Create color from HSL values\n * 从 HSL 值创建颜色\n * @param h Hue (0-360) | 色相\n * @param s Saturation (0-1) | 饱和度\n * @param l Lightness (0-1) | 亮度\n * @param a Alpha (0-1) | 透明度\n */\n static fromHSL(h, s, l, a = 1) {\n const { r, g, b } = Color.hslToRgb(h, s, l);\n return new Color(r, g, b, a);\n }\n /**\n * Create color from normalized float values (0-1)\n * 从归一化浮点值创建颜色 (0-1)\n */\n static fromFloat(r, g, b, a = 1) {\n return new Color(r * 255, g * 255, b * 255, a);\n }\n // ===== Conversion Methods | 转换方法 =====\n /**\n * Convert hex string to RGB\n * 将十六进制字符串转换为 RGB\n */\n static hexToRgb(hex) {\n const colorHex = hex.replace('#', '');\n let r = 255, g = 255, b = 255;\n if (colorHex.length === 6) {\n r = parseInt(colorHex.substring(0, 2), 16);\n g = parseInt(colorHex.substring(2, 4), 16);\n b = parseInt(colorHex.substring(4, 6), 16);\n }\n else if (colorHex.length === 3) {\n r = parseInt(colorHex[0] + colorHex[0], 16);\n g = parseInt(colorHex[1] + colorHex[1], 16);\n b = parseInt(colorHex[2] + colorHex[2], 16);\n }\n else if (colorHex.length === 8) {\n // AARRGGBB format\n r = parseInt(colorHex.substring(2, 4), 16);\n g = parseInt(colorHex.substring(4, 6), 16);\n b = parseInt(colorHex.substring(6, 8), 16);\n }\n return { r, g, b };\n }\n /**\n * Convert RGB to hex string\n * 将 RGB 转换为十六进制字符串\n */\n static rgbToHex(r, g, b) {\n const toHex = (n) => Math.round(n).toString(16).padStart(2, '0');\n return `#${toHex(r)}${toHex(g)}${toHex(b)}`;\n }\n /**\n * Convert HSL to RGB\n * 将 HSL 转换为 RGB\n */\n static hslToRgb(h, s, l) {\n h = ((h % 360) + 360) % 360 / 360;\n s = Math.max(0, Math.min(1, s));\n l = Math.max(0, Math.min(1, l));\n let r, g, b;\n if (s === 0) {\n r = g = b = l;\n }\n else {\n const hue2rgb = (p, q, t) => {\n if (t < 0)\n t += 1;\n if (t > 1)\n t -= 1;\n if (t < 1 / 6)\n return p + (q - p) * 6 * t;\n if (t < 1 / 2)\n return q;\n if (t < 2 / 3)\n return p + (q - p) * (2 / 3 - t) * 6;\n return p;\n };\n const q = l < 0.5 ? l * (1 + s) : l + s - l * s;\n const p = 2 * l - q;\n r = hue2rgb(p, q, h + 1 / 3);\n g = hue2rgb(p, q, h);\n b = hue2rgb(p, q, h - 1 / 3);\n }\n return {\n r: Math.round(r * 255),\n g: Math.round(g * 255),\n b: Math.round(b * 255)\n };\n }\n /**\n * Convert RGB to HSL\n * 将 RGB 转换为 HSL\n */\n static rgbToHsl(r, g, b) {\n r /= 255;\n g /= 255;\n b /= 255;\n const max = Math.max(r, g, b);\n const min = Math.min(r, g, b);\n let h = 0;\n let s = 0;\n const l = (max + min) / 2;\n if (max !== min) {\n const d = max - min;\n s = l > 0.5 ? d / (2 - max - min) : d / (max + min);\n switch (max) {\n case r:\n h = ((g - b) / d + (g < b ? 6 : 0)) / 6;\n break;\n case g:\n h = ((b - r) / d + 2) / 6;\n break;\n case b:\n h = ((r - g) / d + 4) / 6;\n break;\n }\n }\n return { h: h * 360, s, l };\n }\n // ===== Packing Methods | 打包方法 =====\n /**\n * Pack color to uint32 (0xRRGGBB)\n * 打包颜色为 uint32 (0xRRGGBB)\n */\n static packRGB(r, g, b) {\n return ((r & 0xFF) << 16) | ((g & 0xFF) << 8) | (b & 0xFF);\n }\n /**\n * Pack color to uint32 (0xAARRGGBB)\n * 打包颜色为 uint32 (0xAARRGGBB)\n */\n static packARGB(r, g, b, a) {\n const alpha = Math.round(a * 255);\n return ((alpha & 0xFF) << 24) | ((r & 0xFF) << 16) | ((g & 0xFF) << 8) | (b & 0xFF);\n }\n /**\n * Pack color to uint32 for WebGL (0xAABBGGRR)\n * 打包颜色为 WebGL 格式的 uint32 (0xAABBGGRR)\n */\n static packABGR(r, g, b, a) {\n const alpha = Math.round(a * 255);\n return ((alpha & 0xFF) << 24) | ((b & 0xFF) << 16) | ((g & 0xFF) << 8) | (r & 0xFF);\n }\n /**\n * Pack hex string and alpha to WebGL uint32 (0xAABBGGRR)\n * 将十六进制字符串和透明度打包为 WebGL 格式 uint32\n */\n static packHexAlpha(hex, alpha) {\n const { r, g, b } = Color.hexToRgb(hex);\n return Color.packABGR(r, g, b, alpha);\n }\n /**\n * Unpack uint32 to RGBA (assumes 0xAARRGGBB)\n * 解包 uint32 为 RGBA (假设格式为 0xAARRGGBB)\n */\n static unpackARGB(value) {\n return {\n a: ((value >> 24) & 0xFF) / 255,\n r: (value >> 16) & 0xFF,\n g: (value >> 8) & 0xFF,\n b: value & 0xFF\n };\n }\n /**\n * Unpack uint32 to RGBA (assumes 0xAABBGGRR - WebGL format)\n * 解包 uint32 为 RGBA (假设格式为 0xAABBGGRR - WebGL 格式)\n */\n static unpackABGR(value) {\n return {\n a: ((value >> 24) & 0xFF) / 255,\n b: (value >> 16) & 0xFF,\n g: (value >> 8) & 0xFF,\n r: value & 0xFF\n };\n }\n // ===== Color Operations | 颜色操作 =====\n /**\n * Interpolate between two colors\n * 在两个颜色之间插值\n */\n static lerp(from, to, t) {\n t = Math.max(0, Math.min(1, t));\n return new Color(from.r + (to.r - from.r) * t, from.g + (to.g - from.g) * t, from.b + (to.b - from.b) * t, from.a + (to.a - from.a) * t);\n }\n /**\n * Interpolate between two packed uint32 colors (0xRRGGBB)\n * 在两个打包的 uint32 颜色之间插值\n */\n static lerpUint32(from, to, t) {\n t = Math.max(0, Math.min(1, t));\n const fromR = (from >> 16) & 0xFF;\n const fromG = (from >> 8) & 0xFF;\n const fromB = from & 0xFF;\n const toR = (to >> 16) & 0xFF;\n const toG = (to >> 8) & 0xFF;\n const toB = to & 0xFF;\n const r = Math.round(fromR + (toR - fromR) * t);\n const g = Math.round(fromG + (toG - fromG) * t);\n const b = Math.round(fromB + (toB - fromB) * t);\n return (r << 16) | (g << 8) | b;\n }\n /**\n * Mix two colors\n * 混合两个颜色\n */\n static mix(color1, color2, ratio = 0.5) {\n return Color.lerp(color1, color2, ratio);\n }\n /**\n * Lighten a color\n * 使颜色变亮\n */\n static lighten(color, amount) {\n const hsl = Color.rgbToHsl(color.r, color.g, color.b);\n hsl.l = Math.min(1, hsl.l + amount);\n const rgb = Color.hslToRgb(hsl.h, hsl.s, hsl.l);\n return new Color(rgb.r, rgb.g, rgb.b, color.a);\n }\n /**\n * Darken a color\n * 使颜色变暗\n */\n static darken(color, amount) {\n const hsl = Color.rgbToHsl(color.r, color.g, color.b);\n hsl.l = Math.max(0, hsl.l - amount);\n const rgb = Color.hslToRgb(hsl.h, hsl.s, hsl.l);\n return new Color(rgb.r, rgb.g, rgb.b, color.a);\n }\n /**\n * Saturate a color\n * 增加颜色饱和度\n */\n static saturate(color, amount) {\n const hsl = Color.rgbToHsl(color.r, color.g, color.b);\n hsl.s = Math.min(1, hsl.s + amount);\n const rgb = Color.hslToRgb(hsl.h, hsl.s, hsl.l);\n return new Color(rgb.r, rgb.g, rgb.b, color.a);\n }\n /**\n * Desaturate a color\n * 降低颜色饱和度\n */\n static desaturate(color, amount) {\n const hsl = Color.rgbToHsl(color.r, color.g, color.b);\n hsl.s = Math.max(0, hsl.s - amount);\n const rgb = Color.hslToRgb(hsl.h, hsl.s, hsl.l);\n return new Color(rgb.r, rgb.g, rgb.b, color.a);\n }\n /**\n * Invert a color\n * 反转颜色\n */\n static invert(color) {\n return new Color(255 - color.r, 255 - color.g, 255 - color.b, color.a);\n }\n /**\n * Convert color to grayscale\n * 将颜色转换为灰度\n */\n static grayscale(color) {\n const gray = Math.round(0.299 * color.r + 0.587 * color.g + 0.114 * color.b);\n return new Color(gray, gray, gray, color.a);\n }\n /**\n * Get color luminance (perceived brightness)\n * 获取颜色亮度(感知亮度)\n */\n static luminance(color) {\n return (0.299 * color.r + 0.587 * color.g + 0.114 * color.b) / 255;\n }\n /**\n * Get contrast ratio between two colors\n * 获取两个颜色之间的对比度\n */\n static contrastRatio(color1, color2) {\n const l1 = Color.luminance(color1);\n const l2 = Color.luminance(color2);\n const lighter = Math.max(l1, l2);\n const darker = Math.min(l1, l2);\n return (lighter + 0.05) / (darker + 0.05);\n }\n // ===== Instance Methods | 实例方法 =====\n /**\n * Convert to hex string\n * 转换为十六进制字符串\n */\n toHex() {\n return Color.rgbToHex(this.r, this.g, this.b);\n }\n /**\n * Convert to hex string with alpha\n * 转换为带透明度的十六进制字符串\n */\n toHexAlpha() {\n const alphaHex = Math.round(this.a * 255).toString(16).padStart(2, '0');\n return `#${alphaHex}${this.toHex().slice(1)}`;\n }\n /**\n * Convert to CSS rgba string\n * 转换为 CSS rgba 字符串\n */\n toRgba() {\n return `rgba(${this.r}, ${this.g}, ${this.b}, ${this.a})`;\n }\n /**\n * Convert to CSS rgb string\n * 转换为 CSS rgb 字符串\n */\n toRgb() {\n return `rgb(${this.r}, ${this.g}, ${this.b})`;\n }\n /**\n * Convert to HSL\n * 转换为 HSL\n */\n toHSL() {\n return Color.rgbToHsl(this.r, this.g, this.b);\n }\n /**\n * Pack to uint32 (0xRRGGBB)\n * 打包为 uint32 (0xRRGGBB)\n */\n toUint32() {\n return Color.packRGB(this.r, this.g, this.b);\n }\n /**\n * Pack to uint32 with alpha (0xAARRGGBB)\n * 打包为带透明度的 uint32 (0xAARRGGBB)\n */\n toUint32Alpha() {\n return Color.packARGB(this.r, this.g, this.b, this.a);\n }\n /**\n * Pack to WebGL uint32 (0xAABBGGRR)\n * 打包为 WebGL 格式 uint32 (0xAABBGGRR)\n */\n toWebGL() {\n return Color.packABGR(this.r, this.g, this.b, this.a);\n }\n /**\n * Get normalized float array [r, g, b, a] (0-1)\n * 获取归一化浮点数组 [r, g, b, a] (0-1)\n */\n toFloatArray() {\n return [this.r / 255, this.g / 255, this.b / 255, this.a];\n }\n /**\n * Clone this color\n * 克隆此颜色\n */\n clone() {\n return new Color(this.r, this.g, this.b, this.a);\n }\n /**\n * Set color values\n * 设置颜色值\n */\n set(r, g, b, a) {\n this.r = Math.round(Math.max(0, Math.min(255, r)));\n this.g = Math.round(Math.max(0, Math.min(255, g)));\n this.b = Math.round(Math.max(0, Math.min(255, b)));\n if (a !== undefined) {\n this.a = Math.max(0, Math.min(1, a));\n }\n return this;\n }\n /**\n * Copy from another color\n * 从另一个颜色复制\n */\n copy(other) {\n this.r = other.r;\n this.g = other.g;\n this.b = other.b;\n this.a = other.a;\n return this;\n }\n /**\n * Check equality with another color\n * 检查与另一个颜色是否相等\n */\n equals(other) {\n return this.r === other.r && this.g === other.g && this.b === other.b && this.a === other.a;\n }\n /**\n * String representation\n * 字符串表示\n */\n toString() {\n return `Color(${this.r}, ${this.g}, ${this.b}, ${this.a})`;\n }\n}\n// ===== Predefined Colors | 预定义颜色 =====\n/** White (0xFFFFFF) | 白色 */\nColor.WHITE = new Color(255, 255, 255);\n/** Black (0x000000) | 黑色 */\nColor.BLACK = new Color(0, 0, 0);\n/** Red (0xFF0000) | 红色 */\nColor.RED = new Color(255, 0, 0);\n/** Green (0x00FF00) | 绿色 */\nColor.GREEN = new Color(0, 255, 0);\n/** Blue (0x0000FF) | 蓝色 */\nColor.BLUE = new Color(0, 0, 255);\n/** Yellow (0xFFFF00) | 黄色 */\nColor.YELLOW = new Color(255, 255, 0);\n/** Cyan (0x00FFFF) | 青色 */\nColor.CYAN = new Color(0, 255, 255);\n/** Magenta (0xFF00FF) | 品红色 */\nColor.MAGENTA = new Color(255, 0, 255);\n/** Transparent (0x00000000) | 透明 */\nColor.TRANSPARENT = new Color(0, 0, 0, 0);\n/** Gray (0x808080) | 灰色 */\nColor.GRAY = new Color(128, 128, 128);\n//# sourceMappingURL=Color.js.map","/**\n * 缓动函数集合\n *\n * 提供各种常用的缓动函数,用于创建平滑的动画效果\n * 所有函数接受时间参数 t (0-1),返回缓动后的值 (通常0-1)\n */\nexport class Easing {\n // 线性缓动\n /**\n * 线性缓动(无缓动)\n * @param t 时间参数 (0-1)\n * @returns 缓动值\n */\n static linear(t) {\n return t;\n }\n // 二次方缓动 (Quadratic)\n /**\n * 二次方缓入\n * @param t 时间参数 (0-1)\n * @returns 缓动值\n */\n static quadIn(t) {\n return t * t;\n }\n /**\n * 二次方缓出\n * @param t 时间参数 (0-1)\n * @returns 缓动值\n */\n static quadOut(t) {\n return 1 - (1 - t) * (1 - t);\n }\n /**\n * 二次方缓入缓出\n * @param t 时间参数 (0-1)\n * @returns 缓动值\n */\n static quadInOut(t) {\n return t < 0.5 ? 2 * t * t : 1 - 2 * (1 - t) * (1 - t);\n }\n // 三次方缓动 (Cubic)\n /**\n * 三次方缓入\n * @param t 时间参数 (0-1)\n * @returns 缓动值\n */\n static cubicIn(t) {\n return t * t * t;\n }\n /**\n * 三次方缓出\n * @param t 时间参数 (0-1)\n * @returns 缓动值\n */\n static cubicOut(t) {\n return 1 - Math.pow(1 - t, 3);\n }\n /**\n * 三次方缓入缓出\n * @param t 时间参数 (0-1)\n * @returns 缓动值\n */\n static cubicInOut(t) {\n return t < 0.5 ? 4 * t * t * t : 1 - Math.pow(-2 * t + 2, 3) / 2;\n }\n // 四次方缓动 (Quartic)\n /**\n * 四次方缓入\n * @param t 时间参数 (0-1)\n * @returns 缓动值\n */\n static quartIn(t) {\n return t * t * t * t;\n }\n /**\n * 四次方缓出\n * @param t 时间参数 (0-1)\n * @returns 缓动值\n */\n static quartOut(t) {\n return 1 - Math.pow(1 - t, 4);\n }\n /**\n * 四次方缓入缓出\n * @param t 时间参数 (0-1)\n * @returns 缓动值\n */\n static quartInOut(t) {\n return t < 0.5 ? 8 * t * t * t * t : 1 - Math.pow(-2 * t + 2, 4) / 2;\n }\n // 五次方缓动 (Quintic)\n /**\n * 五次方缓入\n * @param t 时间参数 (0-1)\n * @returns 缓动值\n */\n static quintIn(t) {\n return t * t * t * t * t;\n }\n /**\n * 五次方缓出\n * @param t 时间参数 (0-1)\n * @returns 缓动值\n */\n static quintOut(t) {\n return 1 - Math.pow(1 - t, 5);\n }\n /**\n * 五次方缓入缓出\n * @param t 时间参数 (0-1)\n * @returns 缓动值\n */\n static quintInOut(t) {\n return t < 0.5 ? 16 * t * t * t * t * t : 1 - Math.pow(-2 * t + 2, 5) / 2;\n }\n // 正弦缓动 (Sine)\n /**\n * 正弦缓入\n * @param t 时间参数 (0-1)\n * @returns 缓动值\n */\n static sineIn(t) {\n return 1 - Math.cos((t * Math.PI) / 2);\n }\n /**\n * 正弦缓出\n * @param t 时间参数 (0-1)\n * @returns 缓动值\n */\n static sineOut(t) {\n return Math.sin((t * Math.PI) / 2);\n }\n /**\n * 正弦缓入缓出\n * @param t 时间参数 (0-1)\n * @returns 缓动值\n */\n static sineInOut(t) {\n return -(Math.cos(Math.PI * t) - 1) / 2;\n }\n // 指数缓动 (Exponential)\n /**\n * 指数缓入\n * @param t 时间参数 (0-1)\n * @returns 缓动值\n */\n static expoIn(t) {\n return t === 0 ? 0 : Math.pow(2, 10 * (t - 1));\n }\n /**\n * 指数缓出\n * @param t 时间参数 (0-1)\n * @returns 缓动值\n */\n static expoOut(t) {\n return t === 1 ? 1 : 1 - Math.pow(2, -10 * t);\n }\n /**\n * 指数缓入缓出\n * @param t 时间参数 (0-1)\n * @returns 缓动值\n */\n static expoInOut(t) {\n if (t === 0)\n return 0;\n if (t === 1)\n return 1;\n return t < 0.5\n ? Math.pow(2, 20 * t - 10) / 2\n : (2 - Math.pow(2, -20 * t + 10)) / 2;\n }\n // 圆形缓动 (Circular)\n /**\n * 圆形缓入\n * @param t 时间参数 (0-1)\n * @returns 缓动值\n */\n static circIn(t) {\n return 1 - Math.sqrt(1 - t * t);\n }\n /**\n * 圆形缓出\n * @param t 时间参数 (0-1)\n * @returns 缓动值\n */\n static circOut(t) {\n return Math.sqrt(1 - (t - 1) * (t - 1));\n }\n /**\n * 圆形缓入缓出\n * @param t 时间参数 (0-1)\n * @returns 缓动值\n */\n static circInOut(t) {\n return t < 0.5\n ? (1 - Math.sqrt(1 - 4 * t * t)) / 2\n : (Math.sqrt(1 - (-2 * t + 2) * (-2 * t + 2)) + 1) / 2;\n }\n // 回弹缓动 (Back)\n /**\n * 回弹缓入\n * @param t 时间参数 (0-1)\n * @param s 回弹强度,默认1.70158\n * @returns 缓动值\n */\n static backIn(t, s = 1.70158) {\n const c1 = s;\n const c3 = c1 + 1;\n return c3 * t * t * t - c1 * t * t;\n }\n /**\n * 回弹缓出\n * @param t 时间参数 (0-1)\n * @param s 回弹强度,默认1.70158\n * @returns 缓动值\n */\n static backOut(t, s = 1.70158) {\n const c1 = s;\n const c3 = c1 + 1;\n return 1 + c3 * Math.pow(t - 1, 3) + c1 * Math.pow(t - 1, 2);\n }\n /**\n * 回弹缓入缓出\n * @param t 时间参数 (0-1)\n * @param s 回弹强度,默认1.70158\n * @returns 缓动值\n */\n static backInOut(t, s = 1.70158) {\n const c1 = s;\n const c2 = c1 * 1.525;\n return t < 0.5\n ? (Math.pow(2 * t, 2) * ((c2 + 1) * 2 * t - c2)) / 2\n : (Math.pow(2 * t - 2, 2) * ((c2 + 1) * (t * 2 - 2) + c2) + 2) / 2;\n }\n // 弹性缓动 (Elastic)\n /**\n * 弹性缓入\n * @param t 时间参数 (0-1)\n * @param amplitude 振幅,默认1\n * @param period 周期,默认0.3\n * @returns 缓动值\n */\n static elasticIn(t, amplitude = 1, period = 0.3) {\n if (t === 0)\n return 0;\n if (t === 1)\n return 1;\n const s = period / 4;\n return -(amplitude * Math.pow(2, 10 * (t - 1)) * Math.sin((t - 1 - s) * (2 * Math.PI) / period));\n }\n /**\n * 弹性缓出\n * @param t 时间参数 (0-1)\n * @param amplitude 振幅,默认1\n * @param period 周期,默认0.3\n * @returns 缓动值\n */\n static elasticOut(t, amplitude = 1, period = 0.3) {\n if (t === 0)\n return 0;\n if (t === 1)\n return 1;\n const s = period / 4;\n return amplitude * Math.pow(2, -10 * t) * Math.sin((t - s) * (2 * Math.PI) / period) + 1;\n }\n /**\n * 弹性缓入缓出\n * @param t 时间参数 (0-1)\n * @param amplitude 振幅,默认1\n * @param period 周期,默认0.45\n * @returns 缓动值\n */\n static elasticInOut(t, amplitude = 1, period = 0.45) {\n if (t === 0)\n return 0;\n if (t === 1)\n return 1;\n const s = period / 4;\n if (t < 0.5) {\n return -0.5 * (amplitude * Math.pow(2, 10 * (2 * t - 1)) * Math.sin((2 * t - 1 - s) * (2 * Math.PI) / period));\n }\n return amplitude * Math.pow(2, -10 * (2 * t - 1)) * Math.sin((2 * t - 1 - s) * (2 * Math.PI) / period) * 0.5 + 1;\n }\n // 跳跃缓动 (Bounce)\n /**\n * 跳跃缓入\n * @param t 时间参数 (0-1)\n * @returns 缓动值\n */\n static bounceIn(t) {\n return 1 - Easing.bounceOut(1 - t);\n }\n /**\n * 跳跃缓出\n * @param t 时间参数 (0-1)\n * @returns 缓动值\n */\n static bounceOut(t) {\n const n1 = 7.5625;\n const d1 = 2.75;\n if (t < 1 / d1) {\n return n1 * t * t;\n }\n else if (t < 2 / d1) {\n return n1 * (t -= 1.5 / d1) * t + 0.75;\n }\n else if (t < 2.5 / d1) {\n return n1 * (t -= 2.25 / d1) * t + 0.9375;\n }\n else {\n return n1 * (t -= 2.625 / d1) * t + 0.984375;\n }\n }\n /**\n * 跳跃缓入缓出\n * @param t 时间参数 (0-1)\n * @returns 缓动值\n */\n static bounceInOut(t) {\n return t < 0.5\n ? (1 - Easing.bounceOut(1 - 2 * t)) / 2\n : (1 + Easing.bounceOut(2 * t - 1)) / 2;\n }\n // 组合缓动\n /**\n * 创建自定义缓动函数(组合多个缓动)\n * @param easingFunctions 缓动函数数组\n * @param weights 权重数组,默认均等\n * @returns 组合后的缓动函数\n */\n static combine(easingFunctions, weights) {\n if (!weights) {\n weights = new Array(easingFunctions.length).fill(1 / easingFunctions.length);\n }\n return (t) => {\n let result = 0;\n for (let i = 0; i < easingFunctions.length; i++) {\n result += easingFunctions[i](t) * (weights[i] || 0);\n }\n return result;\n };\n }\n /**\n * 创建分段缓动函数\n * @param segments 分段配置数组,每段包含 {duration, easing}\n * @returns 分段缓动函数\n */\n static piecewise(segments) {\n // 计算总持续时间\n const totalDuration = segments.reduce((sum, seg) => sum + seg.duration, 0);\n // 归一化持续时间\n const normalizedSegments = segments.map((seg) => ({\n ...seg,\n duration: seg.duration / totalDuration\n }));\n return (t) => {\n let accumulatedTime = 0;\n for (const segment of normalizedSegments) {\n if (t <= accumulatedTime + segment.duration) {\n const localT = (t - accumulatedTime) / segment.duration;\n return segment.easing(Math.max(0, Math.min(1, localT)));\n }\n accumulatedTime += segment.duration;\n }\n // 如果超出范围,返回最后一段的结束值\n return normalizedSegments[normalizedSegments.length - 1].easing(1);\n };\n }\n /**\n * 创建反向缓动函数\n * @param easing 原缓动函数\n * @returns 反向缓动函数\n */\n static reverse(easing) {\n return (t) => 1 - easing(1 - t);\n }\n /**\n * 创建镜像缓动函数(先正向再反向)\n * @param easing 原缓动函数\n * @returns 镜像缓动函数\n */\n static mirror(easing) {\n return (t) => {\n if (t < 0.5) {\n return easing(t * 2);\n }\n else {\n return easing(2 - t * 2);\n }\n };\n }\n}\n// 常用预设\n/** 平滑进入(常用于UI动画) */\nEasing.smoothIn = Easing.quadOut;\n/** 平滑退出(常用于UI动画) */\nEasing.smoothOut = Easing.quadIn;\n/** 快速进入(常用于出现动画) */\nEasing.quickIn = Easing.cubicOut;\n/** 快速退出(常用于消失动画) */\nEasing.quickOut = Easing.cubicIn;\n/** 自然运动(模拟物理) */\nEasing.natural = Easing.quartOut;\n/** 强调效果(吸引注意力) */\nEasing.emphasize = Easing.backOut;\n//# sourceMappingURL=Easing.js.map","import { Vector2 } from '../Vector2';\nimport { MathUtils } from '../MathUtils';\n/**\n * 带缓存的插值器类\n * 用于需要重复插值相同起始和目标值的情况\n */\nexport class CachedInterpolator {\n constructor(interpolator) {\n this.cache = new Map();\n this.interpolator = interpolator;\n }\n /**\n * 设置插值范围\n * @param from 起始值\n * @param to 目标值\n */\n setRange(from, to) {\n if (this.from !== from || this.to !== to) {\n this.from = from;\n this.to = to;\n this.cache.clear();\n }\n }\n /**\n * 获取插值结果\n * @param t 插值参数\n * @returns 插值结果\n */\n get(t) {\n if (!this.from || !this.to) {\n throw new Error('插值范围未设置');\n }\n if (!this.cache.has(t)) {\n const result = this.interpolator(this.from, this.to, t);\n this.cache.set(t, result);\n }\n return this.cache.get(t);\n }\n /**\n * 清空缓存\n */\n clearCache() {\n this.cache.clear();\n }\n}\n/**\n * 插值工具类\n *\n * 提供各种类型的插值功能,用于创建平滑的数值变化\n */\nexport class Interpolation {\n // 基础插值\n /**\n * 数值线性插值\n * @param from 起始值\n * @param to 目标值\n * @param t 插值参数 (0-1)\n * @returns 插值结果\n */\n static number(from, to, t) {\n return MathUtils.lerp(from, to, t);\n }\n /**\n * 向量线性插值\n * @param from 起始向量\n * @param to 目标向量\n * @param t 插值参数 (0-1)\n * @returns 插值结果向量\n */\n static vector2(from, to, t) {\n return Vector2.lerp(from, to, t);\n }\n /**\n * 角度插值(处理角度环绕)\n * @param from 起始角度(弧度)\n * @param to 目标角度(弧度)\n * @param t 插值参数 (0-1)\n * @returns 插值结果角度\n */\n static angle(from, to, t) {\n return MathUtils.lerpAngle(from, to, t);\n }\n /**\n * 颜色插值(RGB)\n * @param from 起始颜色 [r, g, b, a?]\n * @param to 目标颜色 [r, g, b, a?]\n * @param t 插值参数 (0-1)\n * @returns 插值结果颜色\n */\n static color(from, to, t) {\n const result = [];\n const length = Math.max(from.length, to.length);\n for (let i = 0; i < length; i++) {\n const fromVal = from[i] ?? (i === 3 ? 1 : 0); // alpha默认为1\n const toVal = to[i] ?? (i === 3 ? 1 : 0);\n result[i] = MathUtils.lerp(fromVal, toVal, t);\n }\n return result;\n }\n // 高级插值\n /**\n * 三次样条插值\n * @param p0 控制点0\n * @param p1 控制点1(起点)\n * @param p2 控制点2(终点)\n * @param p3 控制点3\n * @param t 插值参数 (0-1)\n * @returns 插值结果\n */\n static cubicSpline(p0, p1, p2, p3, t) {\n const t2 = t * t;\n const t3 = t2 * t;\n return 0.5 * ((2 * p1) +\n (-p0 + p2) * t +\n (2 * p0 - 5 * p1 + 4 * p2 - p3) * t2 +\n (-p0 + 3 * p1 - 3 * p2 + p3) * t3);\n }\n /**\n * Hermite插值\n * @param p0 起始点\n * @param m0 起始切线\n * @param p1 结束点\n * @param m1 结束切线\n * @param t 插值参数 (0-1)\n * @returns 插值结果\n */\n static hermite(p0, m0, p1, m1, t) {\n const t2 = t * t;\n const t3 = t2 * t;\n const h00 = 2 * t3 - 3 * t2 + 1;\n const h10 = t3 - 2 * t2 + t;\n const h01 = -2 * t3 + 3 * t2;\n const h11 = t3 - t2;\n return h00 * p0 + h10 * m0 + h01 * p1 + h11 * m1;\n }\n /**\n * 球面线性插值(适用于方向向量)\n * @param from 起始单位向量\n * @param to 目标单位向量\n * @param t 插值参数 (0-1)\n * @returns 插值结果向量\n */\n static slerp(from, to, t) {\n let dot = Vector2.dot(from, to);\n // 如果点积为负,取反一个向量确保走最短路径\n let toVec = to;\n if (dot < 0) {\n dot = -dot;\n toVec = to.clone().negate();\n }\n // 如果向量几乎平行,使用线性插值\n if (dot > 0.9995) {\n return Vector2.lerp(from, toVec, t).normalize();\n }\n // 球面插值\n const theta = Math.acos(Math.abs(dot));\n const sinTheta = Math.sin(theta);\n const a = Math.sin((1 - t) * theta) / sinTheta;\n const b = Math.sin(t * theta) / sinTheta;\n return new Vector2(from.x * a + toVec.x * b, from.y * a + toVec.y * b);\n }\n // 缓存插值\n /**\n * 创建带缓存的插值器\n * 用于需要重复插值相同起始和目标值的情况\n * @param interpolator 插值函数\n * @returns 缓存插值器实例\n */\n static createCachedInterpolator(interpolator) {\n return new CachedInterpolator(interpolator);\n }\n // 多点插值\n /**\n * 样条曲线插值(通过多个控制点)\n * @param points 控制点数组\n * @param t 插值参数 (0-1)\n * @returns 插值结果\n */\n static spline(points, t) {\n if (points.length === 0)\n return 0;\n if (points.length === 1)\n return points[0];\n if (points.length === 2)\n return MathUtils.lerp(points[0], points[1], t);\n const n = points.length - 1;\n const scaledT = t * n;\n const segment = Math.floor(scaledT);\n const localT = scaledT - segment;\n const i = Math.max(0, Math.min(n - 1, segment));\n const p0 = points[Math.max(0, i - 1)];\n const p1 = points[i];\n const p2 = points[Math.min(n, i + 1)];\n const p3 = points[Math.min(n, i + 2)];\n return Interpolation.cubicSpline(p0, p1, p2, p3, localT);\n }\n /**\n * 向量样条曲线插值\n * @param points 控制点数组\n * @param t 插值参数 (0-1)\n * @returns 插值结果向量\n */\n static vectorSpline(points, t) {\n if (points.length === 0)\n return new Vector2();\n if (points.length === 1)\n return points[0].clone();\n if (points.length === 2)\n return Vector2.lerp(points[0], points[1], t);\n const xPoints = points.map((p) => p.x);\n const yPoints = points.map((p) => p.y);\n return new Vector2(Interpolation.spline(xPoints, t), Interpolation.spline(yPoints, t));\n }\n // 时间轴插值\n /**\n * 关键帧动画插值\n * @param keyframes 关键帧数组(按时间排序)\n * @param time 当前时间\n * @param interpolator 插值函数\n * @returns 插值结果\n */\n static keyframe(keyframes, time, interpolator) {\n if (keyframes.length === 0) {\n throw new Error('至少需要一个关键帧');\n }\n if (keyframes.length === 1 || time <= keyframes[0].time) {\n return keyframes[0].value;\n }\n if (time >= keyframes[keyframes.length - 1].time) {\n return keyframes[keyframes.length - 1].value;\n }\n // 找到当前时间所在的区间\n for (let i = 0; i < keyframes.length - 1; i++) {\n const current = keyframes[i];\n const next = keyframes[i + 1];\n if (time >= current.time && time <= next.time) {\n const duration = next.time - current.time;\n const progress = duration > 0 ? (time - current.time) / duration : 0;\n // 应用缓动函数\n const easedProgress = current.easing ? current.easing(progress) : progress;\n return interpolator(current.value, next.value, easedProgress);\n }\n }\n return keyframes[keyframes.length - 1].value;\n }\n // 路径插值\n /**\n * 路径插值(沿着由点组成的路径)\n * @param path 路径点数组\n * @param t 插值参数 (0-1)\n * @param closed 是否为闭合路径\n * @returns 路径上的点\n */\n static pathInterpolation(path, t, closed = false) {\n if (path.length === 0)\n return new Vector2();\n if (path.length === 1)\n return path[0].clone();\n const totalLength = Interpolation.getPathLength(path, closed);\n const targetDistance = t * totalLength;\n let accumulatedDistance = 0;\n const segments = closed ? path.length : path.length - 1;\n for (let i = 0; i < segments; i++) {\n const start = path[i];\n const end = path[(i + 1) % path.length];\n const segmentLength = Vector2.distance(start, end);\n if (accumulatedDistance + segmentLength >= targetDistance) {\n const segmentT = (targetDistance - accumulatedDistance) / segmentLength;\n return Vector2.lerp(start, end, segmentT);\n }\n accumulatedDistance += segmentLength;\n }\n return path[path.length - 1].clone();\n }\n /**\n * 计算路径总长度\n * @param path 路径点数组\n * @param closed 是否为闭合路径\n * @returns 路径总长度\n */\n static getPathLength(path, closed = false) {\n if (path.length < 2)\n return 0;\n let totalLength = 0;\n const segments = closed ? path.length : path.length - 1;\n for (let i = 0; i < segments; i++) {\n const start = path[i];\n const end = path[(i + 1) % path.length];\n totalLength += Vector2.distance(start, end);\n }\n return totalLength;\n }\n // 实用工具\n /**\n * 创建数值插值器\n * @param from 起始值\n * @param to 目标值\n * @returns 插值器函数\n */\n static createNumberInterpolator(from, to) {\n return (t) => Interpolation.number(from, to, t);\n }\n /**\n * 创建向量插值器\n * @param from 起始向量\n * @param to 目标向量\n * @returns 插值器函数\n */\n static createVectorInterpolator(from, to) {\n return (t) => Interpolation.vector2(from, to, t);\n }\n /**\n * 创建组合插值器(插值多个值)\n * @param interpolators 插值器数组\n * @returns 组合插值器函数\n */\n static createCompositeInterpolator(interpolators) {\n return (from, to, t) => {\n const result = [];\n for (let i = 0; i < Math.min(interpolators.length, from.length, to.length); i++) {\n result[i] = interpolators[i](from[i], to[i], t);\n }\n return result;\n };\n }\n}\n//# sourceMappingURL=Interpolation.js.map","/**\n * @zh Vector2 蓝图节点\n * @en Vector2 Blueprint Nodes\n */\nimport { Vector2 } from '../Vector2';\n// Make Vector2\nexport const MakeVector2Template = {\n type: 'MakeVector2',\n title: 'Make Vector2',\n category: 'math',\n description: 'Creates a Vector2 from X and Y',\n keywords: ['make', 'create', 'vector', 'vector2'],\n menuPath: ['Math', 'Vector', 'Make Vector2'],\n isPure: true,\n inputs: [\n { name: 'x', displayName: 'X', type: 'float', defaultValue: 0 },\n { name: 'y', displayName: 'Y', type: 'float', defaultValue: 0 }\n ],\n outputs: [\n { name: 'vector', displayName: 'Vector', type: 'vector2' }\n ],\n color: '#2196F3'\n};\nexport class MakeVector2Executor {\n execute(node, context) {\n const ctx = context;\n const x = Number(ctx.evaluateInput(node.id, 'x', 0));\n const y = Number(ctx.evaluateInput(node.id, 'y', 0));\n return { outputs: { vector: new Vector2(x, y) } };\n }\n}\n// Break Vector2\nexport const BreakVector2Template = {\n type: 'BreakVector2',\n title: 'Break Vector2',\n category: 'math',\n description: 'Breaks a Vector2 into X and Y',\n keywords: ['break', 'split', 'vector', 'vector2'],\n menuPath: ['Math', 'Vector', 'Break Vector2'],\n isPure: true,\n inputs: [\n { name: 'vector', displayName: 'Vector', type: 'vector2' }\n ],\n outputs: [\n { name: 'x', displayName: 'X', type: 'float' },\n { name: 'y', displayName: 'Y', type: 'float' }\n ],\n color: '#2196F3'\n};\nexport class BreakVector2Executor {\n execute(node, context) {\n const ctx = context;\n const vector = ctx.evaluateInput(node.id, 'vector', Vector2.ZERO);\n return { outputs: { x: vector?.x ?? 0, y: vector?.y ?? 0 } };\n }\n}\n// Vector2 Add\nexport const Vector2AddTemplate = {\n type: 'Vector2Add',\n title: 'Vector2 +',\n category: 'math',\n description: 'Adds two vectors',\n keywords: ['add', 'plus', 'vector'],\n menuPath: ['Math', 'Vector', 'Add'],\n isPure: true,\n inputs: [\n { name: 'a', displayName: 'A', type: 'vector2' },\n { name: 'b', displayName: 'B', type: 'vector2' }\n ],\n outputs: [\n { name: 'result', displayName: 'Result', type: 'vector2' }\n ],\n color: '#2196F3'\n};\nexport class Vector2AddExecutor {\n execute(node, context) {\n const ctx = context;\n const a = ctx.evaluateInput(node.id, 'a', Vector2.ZERO);\n const b = ctx.evaluateInput(node.id, 'b', Vector2.ZERO);\n return { outputs: { result: Vector2.add(a ?? Vector2.ZERO, b ?? Vector2.ZERO) } };\n }\n}\n// Vector2 Subtract\nexport const Vector2SubtractTemplate = {\n type: 'Vector2Subtract',\n title: 'Vector2 -',\n category: 'math',\n description: 'Subtracts B from A',\n keywords: ['subtract', 'minus', 'vector'],\n menuPath: ['Math', 'Vector', 'Subtract'],\n isPure: true,\n inputs: [\n { name: 'a', displayName: 'A', type: 'vector2' },\n { name: 'b', displayName: 'B', type: 'vector2' }\n ],\n outputs: [\n { name: 'result', displayName: 'Result', type: 'vector2' }\n ],\n color: '#2196F3'\n};\nexport class Vector2SubtractExecutor {\n execute(node, context) {\n const ctx = context;\n const a = ctx.evaluateInput(node.id, 'a', Vector2.ZERO);\n const b = ctx.evaluateInput(node.id, 'b', Vector2.ZERO);\n return { outputs: { result: Vector2.subtract(a ?? Vector2.ZERO, b ?? Vector2.ZERO) } };\n }\n}\n// Vector2 Scale\nexport const Vector2ScaleTemplate = {\n type: 'Vector2Scale',\n title: 'Vector2 *',\n category: 'math',\n description: 'Scales a vector by a scalar',\n keywords: ['scale', 'multiply', 'vector'],\n menuPath: ['Math', 'Vector', 'Scale'],\n isPure: true,\n inputs: [\n { name: 'vector', displayName: 'Vector', type: 'vector2' },\n { name: 'scalar', displayName: 'Scalar', type: 'float', defaultValue: 1 }\n ],\n outputs: [\n { name: 'result', displayName: 'Result', type: 'vector2' }\n ],\n color: '#2196F3'\n};\nexport class Vector2ScaleExecutor {\n execute(node, context) {\n const ctx = context;\n const vector = ctx.evaluateInput(node.id, 'vector', Vector2.ZERO);\n const scalar = Number(ctx.evaluateInput(node.id, 'scalar', 1));\n return { outputs: { result: Vector2.multiply(vector ?? Vector2.ZERO, scalar) } };\n }\n}\n// Vector2 Length\nexport const Vector2LengthTemplate = {\n type: 'Vector2Length',\n title: 'Vector2 Length',\n category: 'math',\n description: 'Gets the length of a vector',\n keywords: ['length', 'magnitude', 'vector'],\n menuPath: ['Math', 'Vector', 'Length'],\n isPure: true,\n inputs: [\n { name: 'vector', displayName: 'Vector', type: 'vector2' }\n ],\n outputs: [\n { name: 'length', displayName: 'Length', type: 'float' }\n ],\n color: '#2196F3'\n};\nexport class Vector2LengthExecutor {\n execute(node, context) {\n const ctx = context;\n const vector = ctx.evaluateInput(node.id, 'vector', Vector2.ZERO);\n return { outputs: { length: (vector ?? Vector2.ZERO).length } };\n }\n}\n// Vector2 Normalize\nexport const Vector2NormalizeTemplate = {\n type: 'Vector2Normalize',\n title: 'Vector2 Normalize',\n category: 'math',\n description: 'Normalizes a vector to unit length',\n keywords: ['normalize', 'unit', 'vector'],\n menuPath: ['Math', 'Vector', 'Normalize'],\n isPure: true,\n inputs: [\n { name: 'vector', displayName: 'Vector', type: 'vector2' }\n ],\n outputs: [\n { name: 'result', displayName: 'Result', type: 'vector2' }\n ],\n color: '#2196F3'\n};\nexport class Vector2NormalizeExecutor {\n execute(node, context) {\n const ctx = context;\n const vector = ctx.evaluateInput(node.id, 'vector', Vector2.ZERO);\n return { outputs: { result: (vector ?? Vector2.ZERO).normalized() } };\n }\n}\n// Vector2 Dot\nexport const Vector2DotTemplate = {\n type: 'Vector2Dot',\n title: 'Vector2 Dot',\n category: 'math',\n description: 'Calculates dot product',\n keywords: ['dot', 'product', 'vector'],\n menuPath: ['Math', 'Vector', 'Dot Product'],\n isPure: true,\n inputs: [\n { name: 'a', displayName: 'A', type: 'vector2' },\n { name: 'b', displayName: 'B', type: 'vector2' }\n ],\n outputs: [\n { name: 'result', displayName: 'Result', type: 'float' }\n ],\n color: '#2196F3'\n};\nexport class Vector2DotExecutor {\n execute(node, context) {\n const ctx = context;\n const a = ctx.evaluateInput(node.id, 'a', Vector2.ZERO);\n const b = ctx.evaluateInput(node.id, 'b', Vector2.ZERO);\n return { outputs: { result: Vector2.dot(a ?? Vector2.ZERO, b ?? Vector2.ZERO) } };\n }\n}\n// Vector2 Cross\nexport const Vector2CrossTemplate = {\n type: 'Vector2Cross',\n title: 'Vector2 Cross',\n category: 'math',\n description: '2D cross product (returns scalar)',\n keywords: ['cross', 'product', 'vector'],\n menuPath: ['Math', 'Vector', 'Cross Product'],\n isPure: true,\n inputs: [\n { name: 'a', displayName: 'A', type: 'vector2' },\n { name: 'b', displayName: 'B', type: 'vector2' }\n ],\n outputs: [\n { name: 'result', displayName: 'Result', type: 'float' }\n ],\n color: '#2196F3'\n};\nexport class Vector2CrossExecutor {\n execute(node, context) {\n const ctx = context;\n const a = ctx.evaluateInput(node.id, 'a', Vector2.ZERO);\n const b = ctx.evaluateInput(node.id, 'b', Vector2.ZERO);\n return { outputs: { result: Vector2.cross(a ?? Vector2.ZERO, b ?? Vector2.ZERO) } };\n }\n}\n// Vector2 Distance\nexport const Vector2DistanceTemplate = {\n type: 'Vector2Distance',\n title: 'Vector2 Distance',\n category: 'math',\n description: 'Distance between two points',\n keywords: ['distance', 'length', 'vector'],\n menuPath: ['Math', 'Vector', 'Distance'],\n isPure: true,\n inputs: [\n { name: 'a', displayName: 'A', type: 'vector2' },\n { name: 'b', displayName: 'B', type: 'vector2' }\n ],\n outputs: [\n { name: 'distance', displayName: 'Distance', type: 'float' }\n ],\n color: '#2196F3'\n};\nexport class Vector2DistanceExecutor {\n execute(node, context) {\n const ctx = context;\n const a = ctx.evaluateInput(node.id, 'a', Vector2.ZERO);\n const b = ctx.evaluateInput(node.id, 'b', Vector2.ZERO);\n return { outputs: { distance: Vector2.distance(a ?? Vector2.ZERO, b ?? Vector2.ZERO) } };\n }\n}\n// Vector2 Lerp\nexport const Vector2LerpTemplate = {\n type: 'Vector2Lerp',\n title: 'Vector2 Lerp',\n category: 'math',\n description: 'Linear interpolation between two vectors',\n keywords: ['lerp', 'interpolate', 'vector'],\n menuPath: ['Math', 'Vector', 'Lerp'],\n isPure: true,\n inputs: [\n { name: 'a', displayName: 'A', type: 'vector2' },\n { name: 'b', displayName: 'B', type: 'vector2' },\n { name: 't', displayName: 'T', type: 'float', defaultValue: 0.5 }\n ],\n outputs: [\n { name: 'result', displayName: 'Result', type: 'vector2' }\n ],\n color: '#2196F3'\n};\nexport class Vector2LerpExecutor {\n execute(node, context) {\n const ctx = context;\n const a = ctx.evaluateInput(node.id, 'a', Vector2.ZERO);\n const b = ctx.evaluateInput(node.id, 'b', Vector2.ZERO);\n const t = Number(ctx.evaluateInput(node.id, 't', 0.5));\n return { outputs: { result: Vector2.lerp(a ?? Vector2.ZERO, b ?? Vector2.ZERO, t) } };\n }\n}\n// Vector2 Rotate\nexport const Vector2RotateTemplate = {\n type: 'Vector2Rotate',\n title: 'Vector2 Rotate',\n category: 'math',\n description: 'Rotates a vector by angle (radians)',\n keywords: ['rotate', 'turn', 'vector'],\n menuPath: ['Math', 'Vector', 'Rotate'],\n isPure: true,\n inputs: [\n { name: 'vector', displayName: 'Vector', type: 'vector2' },\n { name: 'angle', displayName: 'Angle (rad)', type: 'float', defaultValue: 0 }\n ],\n outputs: [\n { name: 'result', displayName: 'Result', type: 'vector2' }\n ],\n color: '#2196F3'\n};\nexport class Vector2RotateExecutor {\n execute(node, context) {\n const ctx = context;\n const vector = ctx.evaluateInput(node.id, 'vector', Vector2.ZERO);\n const angle = Number(ctx.evaluateInput(node.id, 'angle', 0));\n return { outputs: { result: (vector ?? Vector2.ZERO).rotated(angle) } };\n }\n}\n// Vector2 From Angle\nexport const Vector2FromAngleTemplate = {\n type: 'Vector2FromAngle',\n title: 'Vector2 From Angle',\n category: 'math',\n description: 'Creates unit vector from angle (radians)',\n keywords: ['from', 'angle', 'direction', 'vector'],\n menuPath: ['Math', 'Vector', 'From Angle'],\n isPure: true,\n inputs: [\n { name: 'angle', displayName: 'Angle (rad)', type: 'float', defaultValue: 0 }\n ],\n outputs: [\n { name: 'vector', displayName: 'Vector', type: 'vector2' }\n ],\n color: '#2196F3'\n};\nexport class Vector2FromAngleExecutor {\n execute(node, context) {\n const ctx = context;\n const angle = Number(ctx.evaluateInput(node.id, 'angle', 0));\n return { outputs: { vector: Vector2.fromAngle(angle) } };\n }\n}\n// Node definitions collection\nexport const VectorNodeDefinitions = [\n { template: MakeVector2Template, executor: new MakeVector2Executor() },\n { template: BreakVector2Template, executor: new BreakVector2Executor() },\n { template: Vector2AddTemplate, executor: new Vector2AddExecutor() },\n { template: Vector2SubtractTemplate, executor: new Vector2SubtractExecutor() },\n { template: Vector2ScaleTemplate, executor: new Vector2ScaleExecutor() },\n { template: Vector2LengthTemplate, executor: new Vector2LengthExecutor() },\n { template: Vector2NormalizeTemplate, executor: new Vector2NormalizeExecutor() },\n { template: Vector2DotTemplate, executor: new Vector2DotExecutor() },\n { template: Vector2CrossTemplate, executor: new Vector2CrossExecutor() },\n { template: Vector2DistanceTemplate, executor: new Vector2DistanceExecutor() },\n { template: Vector2LerpTemplate, executor: new Vector2LerpExecutor() },\n { template: Vector2RotateTemplate, executor: new Vector2RotateExecutor() },\n { template: Vector2FromAngleTemplate, executor: new Vector2FromAngleExecutor() }\n];\n//# sourceMappingURL=VectorNodes.js.map","/**\n * @zh Fixed32 定点数蓝图节点\n * @en Fixed32 Blueprint Nodes\n */\nimport { Fixed32 } from '../Fixed32';\n// Make Fixed32 from float\nexport const Fixed32FromTemplate = {\n type: 'Fixed32From',\n title: 'Fixed32 From Float',\n category: 'math',\n description: 'Creates Fixed32 from float',\n keywords: ['fixed', 'fixed32', 'from', 'create', 'deterministic'],\n menuPath: ['Math', 'Fixed', 'From Float'],\n isPure: true,\n inputs: [\n { name: 'value', displayName: 'Value', type: 'float', defaultValue: 0 }\n ],\n outputs: [\n { name: 'fixed', displayName: 'Fixed32', type: 'object' }\n ],\n color: '#9C27B0'\n};\nexport class Fixed32FromExecutor {\n execute(node, context) {\n const ctx = context;\n const value = Number(ctx.evaluateInput(node.id, 'value', 0));\n return { outputs: { fixed: Fixed32.from(value) } };\n }\n}\n// Make Fixed32 from int\nexport const Fixed32FromIntTemplate = {\n type: 'Fixed32FromInt',\n title: 'Fixed32 From Int',\n category: 'math',\n description: 'Creates Fixed32 from integer (no precision loss)',\n keywords: ['fixed', 'fixed32', 'from', 'int', 'integer'],\n menuPath: ['Math', 'Fixed', 'From Int'],\n isPure: true,\n inputs: [\n { name: 'value', displayName: 'Value', type: 'int', defaultValue: 0 }\n ],\n outputs: [\n { name: 'fixed', displayName: 'Fixed32', type: 'object' }\n ],\n color: '#9C27B0'\n};\nexport class Fixed32FromIntExecutor {\n execute(node, context) {\n const ctx = context;\n const value = Math.floor(Number(ctx.evaluateInput(node.id, 'value', 0)));\n return { outputs: { fixed: Fixed32.fromInt(value) } };\n }\n}\n// Fixed32 to float\nexport const Fixed32ToFloatTemplate = {\n type: 'Fixed32ToFloat',\n title: 'Fixed32 To Float',\n category: 'math',\n description: 'Converts Fixed32 to float',\n keywords: ['fixed', 'fixed32', 'to', 'float', 'convert'],\n menuPath: ['Math', 'Fixed', 'To Float'],\n isPure: true,\n inputs: [\n { name: 'fixed', displayName: 'Fixed32', type: 'object' }\n ],\n outputs: [\n { name: 'value', displayName: 'Value', type: 'float' }\n ],\n color: '#9C27B0'\n};\nexport class Fixed32ToFloatExecutor {\n execute(node, context) {\n const ctx = context;\n const fixed = ctx.evaluateInput(node.id, 'fixed', Fixed32.ZERO);\n return { outputs: { value: fixed?.toNumber() ?? 0 } };\n }\n}\n// Fixed32 to int\nexport const Fixed32ToIntTemplate = {\n type: 'Fixed32ToInt',\n title: 'Fixed32 To Int',\n category: 'math',\n description: 'Converts Fixed32 to integer (floor)',\n keywords: ['fixed', 'fixed32', 'to', 'int', 'integer'],\n menuPath: ['Math', 'Fixed', 'To Int'],\n isPure: true,\n inputs: [\n { name: 'fixed', displayName: 'Fixed32', type: 'object' }\n ],\n outputs: [\n { name: 'value', displayName: 'Value', type: 'int' }\n ],\n color: '#9C27B0'\n};\nexport class Fixed32ToIntExecutor {\n execute(node, context) {\n const ctx = context;\n const fixed = ctx.evaluateInput(node.id, 'fixed', Fixed32.ZERO);\n return { outputs: { value: fixed?.toInt() ?? 0 } };\n }\n}\n// Fixed32 Add\nexport const Fixed32AddTemplate = {\n type: 'Fixed32Add',\n title: 'Fixed32 +',\n category: 'math',\n description: 'Adds two Fixed32 values',\n keywords: ['fixed', 'add', 'plus', '+'],\n menuPath: ['Math', 'Fixed', 'Add'],\n isPure: true,\n inputs: [\n { name: 'a', displayName: 'A', type: 'object' },\n { name: 'b', displayName: 'B', type: 'object' }\n ],\n outputs: [\n { name: 'result', displayName: 'Result', type: 'object' }\n ],\n color: '#9C27B0'\n};\nexport class Fixed32AddExecutor {\n execute(node, context) {\n const ctx = context;\n const a = ctx.evaluateInput(node.id, 'a', Fixed32.ZERO);\n const b = ctx.evaluateInput(node.id, 'b', Fixed32.ZERO);\n return { outputs: { result: (a ?? Fixed32.ZERO).add(b ?? Fixed32.ZERO) } };\n }\n}\n// Fixed32 Subtract\nexport const Fixed32SubtractTemplate = {\n type: 'Fixed32Subtract',\n title: 'Fixed32 -',\n category: 'math',\n description: 'Subtracts B from A',\n keywords: ['fixed', 'subtract', 'minus', '-'],\n menuPath: ['Math', 'Fixed', 'Subtract'],\n isPure: true,\n inputs: [\n { name: 'a', displayName: 'A', type: 'object' },\n { name: 'b', displayName: 'B', type: 'object' }\n ],\n outputs: [\n { name: 'result', displayName: 'Result', type: 'object' }\n ],\n color: '#9C27B0'\n};\nexport class Fixed32SubtractExecutor {\n execute(node, context) {\n const ctx = context;\n const a = ctx.evaluateInput(node.id, 'a', Fixed32.ZERO);\n const b = ctx.evaluateInput(node.id, 'b', Fixed32.ZERO);\n return { outputs: { result: (a ?? Fixed32.ZERO).sub(b ?? Fixed32.ZERO) } };\n }\n}\n// Fixed32 Multiply\nexport const Fixed32MultiplyTemplate = {\n type: 'Fixed32Multiply',\n title: 'Fixed32 *',\n category: 'math',\n description: 'Multiplies two Fixed32 values',\n keywords: ['fixed', 'multiply', 'times', '*'],\n menuPath: ['Math', 'Fixed', 'Multiply'],\n isPure: true,\n inputs: [\n { name: 'a', displayName: 'A', type: 'object' },\n { name: 'b', displayName: 'B', type: 'object' }\n ],\n outputs: [\n { name: 'result', displayName: 'Result', type: 'object' }\n ],\n color: '#9C27B0'\n};\nexport class Fixed32MultiplyExecutor {\n execute(node, context) {\n const ctx = context;\n const a = ctx.evaluateInput(node.id, 'a', Fixed32.ONE);\n const b = ctx.evaluateInput(node.id, 'b', Fixed32.ONE);\n return { outputs: { result: (a ?? Fixed32.ONE).mul(b ?? Fixed32.ONE) } };\n }\n}\n// Fixed32 Divide\nexport const Fixed32DivideTemplate = {\n type: 'Fixed32Divide',\n title: 'Fixed32 /',\n category: 'math',\n description: 'Divides A by B',\n keywords: ['fixed', 'divide', '/'],\n menuPath: ['Math', 'Fixed', 'Divide'],\n isPure: true,\n inputs: [\n { name: 'a', displayName: 'A', type: 'object' },\n { name: 'b', displayName: 'B', type: 'object' }\n ],\n outputs: [\n { name: 'result', displayName: 'Result', type: 'object' }\n ],\n color: '#9C27B0'\n};\nexport class Fixed32DivideExecutor {\n execute(node, context) {\n const ctx = context;\n const a = ctx.evaluateInput(node.id, 'a', Fixed32.ZERO);\n const b = ctx.evaluateInput(node.id, 'b', Fixed32.ONE);\n const divisor = b ?? Fixed32.ONE;\n if (divisor.isZero()) {\n return { outputs: { result: Fixed32.ZERO } };\n }\n return { outputs: { result: (a ?? Fixed32.ZERO).div(divisor) } };\n }\n}\n// Fixed32 Negate\nexport const Fixed32NegateTemplate = {\n type: 'Fixed32Negate',\n title: 'Fixed32 Negate',\n category: 'math',\n description: 'Negates a Fixed32 value',\n keywords: ['fixed', 'negate', '-'],\n menuPath: ['Math', 'Fixed', 'Negate'],\n isPure: true,\n inputs: [\n { name: 'value', displayName: 'Value', type: 'object' }\n ],\n outputs: [\n { name: 'result', displayName: 'Result', type: 'object' }\n ],\n color: '#9C27B0'\n};\nexport class Fixed32NegateExecutor {\n execute(node, context) {\n const ctx = context;\n const value = ctx.evaluateInput(node.id, 'value', Fixed32.ZERO);\n return { outputs: { result: (value ?? Fixed32.ZERO).neg() } };\n }\n}\n// Fixed32 Abs\nexport const Fixed32AbsTemplate = {\n type: 'Fixed32Abs',\n title: 'Fixed32 Abs',\n category: 'math',\n description: 'Absolute value of Fixed32',\n keywords: ['fixed', 'abs', 'absolute'],\n menuPath: ['Math', 'Fixed', 'Abs'],\n isPure: true,\n inputs: [\n { name: 'value', displayName: 'Value', type: 'object' }\n ],\n outputs: [\n { name: 'result', displayName: 'Result', type: 'object' }\n ],\n color: '#9C27B0'\n};\nexport class Fixed32AbsExecutor {\n execute(node, context) {\n const ctx = context;\n const value = ctx.evaluateInput(node.id, 'value', Fixed32.ZERO);\n return { outputs: { result: (value ?? Fixed32.ZERO).abs() } };\n }\n}\n// Fixed32 Sqrt\nexport const Fixed32SqrtTemplate = {\n type: 'Fixed32Sqrt',\n title: 'Fixed32 Sqrt',\n category: 'math',\n description: 'Square root (deterministic)',\n keywords: ['fixed', 'sqrt', 'square', 'root'],\n menuPath: ['Math', 'Fixed', 'Sqrt'],\n isPure: true,\n inputs: [\n { name: 'value', displayName: 'Value', type: 'object' }\n ],\n outputs: [\n { name: 'result', displayName: 'Result', type: 'object' }\n ],\n color: '#9C27B0'\n};\nexport class Fixed32SqrtExecutor {\n execute(node, context) {\n const ctx = context;\n const value = ctx.evaluateInput(node.id, 'value', Fixed32.ZERO);\n return { outputs: { result: Fixed32.sqrt(value ?? Fixed32.ZERO) } };\n }\n}\n// Fixed32 Floor\nexport const Fixed32FloorTemplate = {\n type: 'Fixed32Floor',\n title: 'Fixed32 Floor',\n category: 'math',\n description: 'Floor of Fixed32',\n keywords: ['fixed', 'floor', 'round', 'down'],\n menuPath: ['Math', 'Fixed', 'Floor'],\n isPure: true,\n inputs: [\n { name: 'value', displayName: 'Value', type: 'object' }\n ],\n outputs: [\n { name: 'result', displayName: 'Result', type: 'object' }\n ],\n color: '#9C27B0'\n};\nexport class Fixed32FloorExecutor {\n execute(node, context) {\n const ctx = context;\n const value = ctx.evaluateInput(node.id, 'value', Fixed32.ZERO);\n return { outputs: { result: Fixed32.floor(value ?? Fixed32.ZERO) } };\n }\n}\n// Fixed32 Ceil\nexport const Fixed32CeilTemplate = {\n type: 'Fixed32Ceil',\n title: 'Fixed32 Ceil',\n category: 'math',\n description: 'Ceiling of Fixed32',\n keywords: ['fixed', 'ceil', 'ceiling', 'round', 'up'],\n menuPath: ['Math', 'Fixed', 'Ceil'],\n isPure: true,\n inputs: [\n { name: 'value', displayName: 'Value', type: 'object' }\n ],\n outputs: [\n { name: 'result', displayName: 'Result', type: 'object' }\n ],\n color: '#9C27B0'\n};\nexport class Fixed32CeilExecutor {\n execute(node, context) {\n const ctx = context;\n const value = ctx.evaluateInput(node.id, 'value', Fixed32.ZERO);\n return { outputs: { result: Fixed32.ceil(value ?? Fixed32.ZERO) } };\n }\n}\n// Fixed32 Round\nexport const Fixed32RoundTemplate = {\n type: 'Fixed32Round',\n title: 'Fixed32 Round',\n category: 'math',\n description: 'Rounds Fixed32 to nearest integer',\n keywords: ['fixed', 'round'],\n menuPath: ['Math', 'Fixed', 'Round'],\n isPure: true,\n inputs: [\n { name: 'value', displayName: 'Value', type: 'object' }\n ],\n outputs: [\n { name: 'result', displayName: 'Result', type: 'object' }\n ],\n color: '#9C27B0'\n};\nexport class Fixed32RoundExecutor {\n execute(node, context) {\n const ctx = context;\n const value = ctx.evaluateInput(node.id, 'value', Fixed32.ZERO);\n return { outputs: { result: Fixed32.round(value ?? Fixed32.ZERO) } };\n }\n}\n// Fixed32 Sign\nexport const Fixed32SignTemplate = {\n type: 'Fixed32Sign',\n title: 'Fixed32 Sign',\n category: 'math',\n description: 'Sign of Fixed32 (-1, 0, or 1)',\n keywords: ['fixed', 'sign'],\n menuPath: ['Math', 'Fixed', 'Sign'],\n isPure: true,\n inputs: [\n { name: 'value', displayName: 'Value', type: 'object' }\n ],\n outputs: [\n { name: 'result', displayName: 'Result', type: 'object' }\n ],\n color: '#9C27B0'\n};\nexport class Fixed32SignExecutor {\n execute(node, context) {\n const ctx = context;\n const value = ctx.evaluateInput(node.id, 'value', Fixed32.ZERO);\n return { outputs: { result: Fixed32.sign(value ?? Fixed32.ZERO) } };\n }\n}\n// Fixed32 Min\nexport const Fixed32MinTemplate = {\n type: 'Fixed32Min',\n title: 'Fixed32 Min',\n category: 'math',\n description: 'Minimum of two Fixed32 values',\n keywords: ['fixed', 'min', 'minimum'],\n menuPath: ['Math', 'Fixed', 'Min'],\n isPure: true,\n inputs: [\n { name: 'a', displayName: 'A', type: 'object' },\n { name: 'b', displayName: 'B', type: 'object' }\n ],\n outputs: [\n { name: 'result', displayName: 'Result', type: 'object' }\n ],\n color: '#9C27B0'\n};\nexport class Fixed32MinExecutor {\n execute(node, context) {\n const ctx = context;\n const a = ctx.evaluateInput(node.id, 'a', Fixed32.ZERO);\n const b = ctx.evaluateInput(node.id, 'b', Fixed32.ZERO);\n return { outputs: { result: Fixed32.min(a ?? Fixed32.ZERO, b ?? Fixed32.ZERO) } };\n }\n}\n// Fixed32 Max\nexport const Fixed32MaxTemplate = {\n type: 'Fixed32Max',\n title: 'Fixed32 Max',\n category: 'math',\n description: 'Maximum of two Fixed32 values',\n keywords: ['fixed', 'max', 'maximum'],\n menuPath: ['Math', 'Fixed', 'Max'],\n isPure: true,\n inputs: [\n { name: 'a', displayName: 'A', type: 'object' },\n { name: 'b', displayName: 'B', type: 'object' }\n ],\n outputs: [\n { name: 'result', displayName: 'Result', type: 'object' }\n ],\n color: '#9C27B0'\n};\nexport class Fixed32MaxExecutor {\n execute(node, context) {\n const ctx = context;\n const a = ctx.evaluateInput(node.id, 'a', Fixed32.ZERO);\n const b = ctx.evaluateInput(node.id, 'b', Fixed32.ZERO);\n return { outputs: { result: Fixed32.max(a ?? Fixed32.ZERO, b ?? Fixed32.ZERO) } };\n }\n}\n// Fixed32 Clamp\nexport const Fixed32ClampTemplate = {\n type: 'Fixed32Clamp',\n title: 'Fixed32 Clamp',\n category: 'math',\n description: 'Clamps Fixed32 to range',\n keywords: ['fixed', 'clamp', 'limit', 'range'],\n menuPath: ['Math', 'Fixed', 'Clamp'],\n isPure: true,\n inputs: [\n { name: 'value', displayName: 'Value', type: 'object' },\n { name: 'min', displayName: 'Min', type: 'object' },\n { name: 'max', displayName: 'Max', type: 'object' }\n ],\n outputs: [\n { name: 'result', displayName: 'Result', type: 'object' }\n ],\n color: '#9C27B0'\n};\nexport class Fixed32ClampExecutor {\n execute(node, context) {\n const ctx = context;\n const value = ctx.evaluateInput(node.id, 'value', Fixed32.ZERO);\n const min = ctx.evaluateInput(node.id, 'min', Fixed32.ZERO);\n const max = ctx.evaluateInput(node.id, 'max', Fixed32.ONE);\n return { outputs: { result: Fixed32.clamp(value ?? Fixed32.ZERO, min ?? Fixed32.ZERO, max ?? Fixed32.ONE) } };\n }\n}\n// Fixed32 Lerp\nexport const Fixed32LerpTemplate = {\n type: 'Fixed32Lerp',\n title: 'Fixed32 Lerp',\n category: 'math',\n description: 'Linear interpolation between A and B',\n keywords: ['fixed', 'lerp', 'interpolate', 'blend'],\n menuPath: ['Math', 'Fixed', 'Lerp'],\n isPure: true,\n inputs: [\n { name: 'a', displayName: 'A', type: 'object' },\n { name: 'b', displayName: 'B', type: 'object' },\n { name: 't', displayName: 'T', type: 'object' }\n ],\n outputs: [\n { name: 'result', displayName: 'Result', type: 'object' }\n ],\n color: '#9C27B0'\n};\nexport class Fixed32LerpExecutor {\n execute(node, context) {\n const ctx = context;\n const a = ctx.evaluateInput(node.id, 'a', Fixed32.ZERO);\n const b = ctx.evaluateInput(node.id, 'b', Fixed32.ONE);\n const t = ctx.evaluateInput(node.id, 't', Fixed32.HALF);\n return { outputs: { result: Fixed32.lerp(a ?? Fixed32.ZERO, b ?? Fixed32.ONE, t ?? Fixed32.HALF) } };\n }\n}\n// Fixed32 Compare\nexport const Fixed32CompareTemplate = {\n type: 'Fixed32Compare',\n title: 'Fixed32 Compare',\n category: 'math',\n description: 'Compares two Fixed32 values',\n keywords: ['fixed', 'compare', 'equal', 'less', 'greater'],\n menuPath: ['Math', 'Fixed', 'Compare'],\n isPure: true,\n inputs: [\n { name: 'a', displayName: 'A', type: 'object' },\n { name: 'b', displayName: 'B', type: 'object' }\n ],\n outputs: [\n { name: 'equal', displayName: 'A == B', type: 'bool' },\n { name: 'less', displayName: 'A < B', type: 'bool' },\n { name: 'greater', displayName: 'A > B', type: 'bool' }\n ],\n color: '#9C27B0'\n};\nexport class Fixed32CompareExecutor {\n execute(node, context) {\n const ctx = context;\n const a = ctx.evaluateInput(node.id, 'a', Fixed32.ZERO);\n const b = ctx.evaluateInput(node.id, 'b', Fixed32.ZERO);\n const aVal = a ?? Fixed32.ZERO;\n const bVal = b ?? Fixed32.ZERO;\n return {\n outputs: {\n equal: aVal.eq(bVal),\n less: aVal.lt(bVal),\n greater: aVal.gt(bVal)\n }\n };\n }\n}\n// Fixed32 IsZero\nexport const Fixed32IsZeroTemplate = {\n type: 'Fixed32IsZero',\n title: 'Fixed32 Is Zero',\n category: 'math',\n description: 'Checks if Fixed32 is zero, positive, or negative',\n keywords: ['fixed', 'zero', 'check'],\n menuPath: ['Math', 'Fixed', 'Is Zero'],\n isPure: true,\n inputs: [\n { name: 'value', displayName: 'Value', type: 'object' }\n ],\n outputs: [\n { name: 'isZero', displayName: 'Is Zero', type: 'bool' },\n { name: 'isPositive', displayName: 'Is Positive', type: 'bool' },\n { name: 'isNegative', displayName: 'Is Negative', type: 'bool' }\n ],\n color: '#9C27B0'\n};\nexport class Fixed32IsZeroExecutor {\n execute(node, context) {\n const ctx = context;\n const value = ctx.evaluateInput(node.id, 'value', Fixed32.ZERO);\n const val = value ?? Fixed32.ZERO;\n return {\n outputs: {\n isZero: val.isZero(),\n isPositive: val.isPositive(),\n isNegative: val.isNegative()\n }\n };\n }\n}\n// Fixed32 Constants\nexport const Fixed32ConstantsTemplate = {\n type: 'Fixed32Constants',\n title: 'Fixed32 Constants',\n category: 'math',\n description: 'Common Fixed32 constants',\n keywords: ['fixed', 'constant', 'pi', 'zero', 'one'],\n menuPath: ['Math', 'Fixed', 'Constants'],\n isPure: true,\n inputs: [],\n outputs: [\n { name: 'zero', displayName: '0', type: 'object' },\n { name: 'one', displayName: '1', type: 'object' },\n { name: 'half', displayName: '0.5', type: 'object' },\n { name: 'pi', displayName: 'PI', type: 'object' },\n { name: 'twoPi', displayName: '2PI', type: 'object' }\n ],\n color: '#9C27B0'\n};\nexport class Fixed32ConstantsExecutor {\n execute() {\n return {\n outputs: {\n zero: Fixed32.ZERO,\n one: Fixed32.ONE,\n half: Fixed32.HALF,\n pi: Fixed32.PI,\n twoPi: Fixed32.TWO_PI\n }\n };\n }\n}\n// Node definitions collection\nexport const FixedNodeDefinitions = [\n { template: Fixed32FromTemplate, executor: new Fixed32FromExecutor() },\n { template: Fixed32FromIntTemplate, executor: new Fixed32FromIntExecutor() },\n { template: Fixed32ToFloatTemplate, executor: new Fixed32ToFloatExecutor() },\n { template: Fixed32ToIntTemplate, executor: new Fixed32ToIntExecutor() },\n { template: Fixed32AddTemplate, executor: new Fixed32AddExecutor() },\n { template: Fixed32SubtractTemplate, executor: new Fixed32SubtractExecutor() },\n { template: Fixed32MultiplyTemplate, executor: new Fixed32MultiplyExecutor() },\n { template: Fixed32DivideTemplate, executor: new Fixed32DivideExecutor() },\n { template: Fixed32NegateTemplate, executor: new Fixed32NegateExecutor() },\n { template: Fixed32AbsTemplate, executor: new Fixed32AbsExecutor() },\n { template: Fixed32SqrtTemplate, executor: new Fixed32SqrtExecutor() },\n { template: Fixed32FloorTemplate, executor: new Fixed32FloorExecutor() },\n { template: Fixed32CeilTemplate, executor: new Fixed32CeilExecutor() },\n { template: Fixed32RoundTemplate, executor: new Fixed32RoundExecutor() },\n { template: Fixed32SignTemplate, executor: new Fixed32SignExecutor() },\n { template: Fixed32MinTemplate, executor: new Fixed32MinExecutor() },\n { template: Fixed32MaxTemplate, executor: new Fixed32MaxExecutor() },\n { template: Fixed32ClampTemplate, executor: new Fixed32ClampExecutor() },\n { template: Fixed32LerpTemplate, executor: new Fixed32LerpExecutor() },\n { template: Fixed32CompareTemplate, executor: new Fixed32CompareExecutor() },\n { template: Fixed32IsZeroTemplate, executor: new Fixed32IsZeroExecutor() },\n { template: Fixed32ConstantsTemplate, executor: new Fixed32ConstantsExecutor() }\n];\n//# sourceMappingURL=FixedNodes.js.map","/**\n * @zh FixedVector2 定点向量蓝图节点\n * @en FixedVector2 Blueprint Nodes\n */\nimport { FixedVector2 } from '../FixedVector2';\nimport { Fixed32 } from '../Fixed32';\n// Make FixedVector2\nexport const MakeFixedVector2Template = {\n type: 'MakeFixedVector2',\n title: 'Make FixedVector2',\n category: 'math',\n description: 'Creates FixedVector2 from floats',\n keywords: ['make', 'create', 'fixed', 'vector', 'deterministic'],\n menuPath: ['Math', 'Fixed Vector', 'Make FixedVector2'],\n isPure: true,\n inputs: [\n { name: 'x', displayName: 'X', type: 'float', defaultValue: 0 },\n { name: 'y', displayName: 'Y', type: 'float', defaultValue: 0 }\n ],\n outputs: [\n { name: 'vector', displayName: 'Vector', type: 'object' }\n ],\n color: '#673AB7'\n};\nexport class MakeFixedVector2Executor {\n execute(node, context) {\n const ctx = context;\n const x = Number(ctx.evaluateInput(node.id, 'x', 0));\n const y = Number(ctx.evaluateInput(node.id, 'y', 0));\n return { outputs: { vector: FixedVector2.from(x, y) } };\n }\n}\n// Break FixedVector2\nexport const BreakFixedVector2Template = {\n type: 'BreakFixedVector2',\n title: 'Break FixedVector2',\n category: 'math',\n description: 'Breaks FixedVector2 into X and Y floats',\n keywords: ['break', 'split', 'fixed', 'vector'],\n menuPath: ['Math', 'Fixed Vector', 'Break FixedVector2'],\n isPure: true,\n inputs: [\n { name: 'vector', displayName: 'Vector', type: 'object' }\n ],\n outputs: [\n { name: 'x', displayName: 'X', type: 'float' },\n { name: 'y', displayName: 'Y', type: 'float' }\n ],\n color: '#673AB7'\n};\nexport class BreakFixedVector2Executor {\n execute(node, context) {\n const ctx = context;\n const vector = ctx.evaluateInput(node.id, 'vector', FixedVector2.ZERO);\n const v = vector ?? FixedVector2.ZERO;\n return { outputs: { x: v.x.toNumber(), y: v.y.toNumber() } };\n }\n}\n// FixedVector2 Add\nexport const FixedVector2AddTemplate = {\n type: 'FixedVector2Add',\n title: 'FixedVector2 +',\n category: 'math',\n description: 'Adds two fixed vectors',\n keywords: ['fixed', 'vector', 'add', '+'],\n menuPath: ['Math', 'Fixed Vector', 'Add'],\n isPure: true,\n inputs: [\n { name: 'a', displayName: 'A', type: 'object' },\n { name: 'b', displayName: 'B', type: 'object' }\n ],\n outputs: [\n { name: 'result', displayName: 'Result', type: 'object' }\n ],\n color: '#673AB7'\n};\nexport class FixedVector2AddExecutor {\n execute(node, context) {\n const ctx = context;\n const a = ctx.evaluateInput(node.id, 'a', FixedVector2.ZERO);\n const b = ctx.evaluateInput(node.id, 'b', FixedVector2.ZERO);\n return { outputs: { result: (a ?? FixedVector2.ZERO).add(b ?? FixedVector2.ZERO) } };\n }\n}\n// FixedVector2 Subtract\nexport const FixedVector2SubtractTemplate = {\n type: 'FixedVector2Subtract',\n title: 'FixedVector2 -',\n category: 'math',\n description: 'Subtracts B from A',\n keywords: ['fixed', 'vector', 'subtract', '-'],\n menuPath: ['Math', 'Fixed Vector', 'Subtract'],\n isPure: true,\n inputs: [\n { name: 'a', displayName: 'A', type: 'object' },\n { name: 'b', displayName: 'B', type: 'object' }\n ],\n outputs: [\n { name: 'result', displayName: 'Result', type: 'object' }\n ],\n color: '#673AB7'\n};\nexport class FixedVector2SubtractExecutor {\n execute(node, context) {\n const ctx = context;\n const a = ctx.evaluateInput(node.id, 'a', FixedVector2.ZERO);\n const b = ctx.evaluateInput(node.id, 'b', FixedVector2.ZERO);\n return { outputs: { result: (a ?? FixedVector2.ZERO).sub(b ?? FixedVector2.ZERO) } };\n }\n}\n// FixedVector2 Scale\nexport const FixedVector2ScaleTemplate = {\n type: 'FixedVector2Scale',\n title: 'FixedVector2 *',\n category: 'math',\n description: 'Scales vector by Fixed32 scalar',\n keywords: ['fixed', 'vector', 'scale', '*'],\n menuPath: ['Math', 'Fixed Vector', 'Scale'],\n isPure: true,\n inputs: [\n { name: 'vector', displayName: 'Vector', type: 'object' },\n { name: 'scalar', displayName: 'Scalar', type: 'object' }\n ],\n outputs: [\n { name: 'result', displayName: 'Result', type: 'object' }\n ],\n color: '#673AB7'\n};\nexport class FixedVector2ScaleExecutor {\n execute(node, context) {\n const ctx = context;\n const vector = ctx.evaluateInput(node.id, 'vector', FixedVector2.ZERO);\n const scalar = ctx.evaluateInput(node.id, 'scalar', Fixed32.ONE);\n return { outputs: { result: (vector ?? FixedVector2.ZERO).mul(scalar ?? Fixed32.ONE) } };\n }\n}\n// FixedVector2 Negate\nexport const FixedVector2NegateTemplate = {\n type: 'FixedVector2Negate',\n title: 'FixedVector2 Negate',\n category: 'math',\n description: 'Negates a fixed vector',\n keywords: ['fixed', 'vector', 'negate', '-'],\n menuPath: ['Math', 'Fixed Vector', 'Negate'],\n isPure: true,\n inputs: [\n { name: 'vector', displayName: 'Vector', type: 'object' }\n ],\n outputs: [\n { name: 'result', displayName: 'Result', type: 'object' }\n ],\n color: '#673AB7'\n};\nexport class FixedVector2NegateExecutor {\n execute(node, context) {\n const ctx = context;\n const vector = ctx.evaluateInput(node.id, 'vector', FixedVector2.ZERO);\n return { outputs: { result: (vector ?? FixedVector2.ZERO).neg() } };\n }\n}\n// FixedVector2 Length\nexport const FixedVector2LengthTemplate = {\n type: 'FixedVector2Length',\n title: 'FixedVector2 Length',\n category: 'math',\n description: 'Gets the length of a fixed vector',\n keywords: ['fixed', 'vector', 'length', 'magnitude'],\n menuPath: ['Math', 'Fixed Vector', 'Length'],\n isPure: true,\n inputs: [\n { name: 'vector', displayName: 'Vector', type: 'object' }\n ],\n outputs: [\n { name: 'length', displayName: 'Length', type: 'object' }\n ],\n color: '#673AB7'\n};\nexport class FixedVector2LengthExecutor {\n execute(node, context) {\n const ctx = context;\n const vector = ctx.evaluateInput(node.id, 'vector', FixedVector2.ZERO);\n return { outputs: { length: (vector ?? FixedVector2.ZERO).length() } };\n }\n}\n// FixedVector2 Normalize\nexport const FixedVector2NormalizeTemplate = {\n type: 'FixedVector2Normalize',\n title: 'FixedVector2 Normalize',\n category: 'math',\n description: 'Normalizes a fixed vector',\n keywords: ['fixed', 'vector', 'normalize', 'unit'],\n menuPath: ['Math', 'Fixed Vector', 'Normalize'],\n isPure: true,\n inputs: [\n { name: 'vector', displayName: 'Vector', type: 'object' }\n ],\n outputs: [\n { name: 'result', displayName: 'Result', type: 'object' }\n ],\n color: '#673AB7'\n};\nexport class FixedVector2NormalizeExecutor {\n execute(node, context) {\n const ctx = context;\n const vector = ctx.evaluateInput(node.id, 'vector', FixedVector2.ZERO);\n return { outputs: { result: (vector ?? FixedVector2.ZERO).normalize() } };\n }\n}\n// FixedVector2 Dot\nexport const FixedVector2DotTemplate = {\n type: 'FixedVector2Dot',\n title: 'FixedVector2 Dot',\n category: 'math',\n description: 'Calculates dot product',\n keywords: ['fixed', 'vector', 'dot', 'product'],\n menuPath: ['Math', 'Fixed Vector', 'Dot Product'],\n isPure: true,\n inputs: [\n { name: 'a', displayName: 'A', type: 'object' },\n { name: 'b', displayName: 'B', type: 'object' }\n ],\n outputs: [\n { name: 'result', displayName: 'Result', type: 'object' }\n ],\n color: '#673AB7'\n};\nexport class FixedVector2DotExecutor {\n execute(node, context) {\n const ctx = context;\n const a = ctx.evaluateInput(node.id, 'a', FixedVector2.ZERO);\n const b = ctx.evaluateInput(node.id, 'b', FixedVector2.ZERO);\n return { outputs: { result: FixedVector2.dot(a ?? FixedVector2.ZERO, b ?? FixedVector2.ZERO) } };\n }\n}\n// FixedVector2 Cross\nexport const FixedVector2CrossTemplate = {\n type: 'FixedVector2Cross',\n title: 'FixedVector2 Cross',\n category: 'math',\n description: '2D cross product (returns Fixed32)',\n keywords: ['fixed', 'vector', 'cross', 'product'],\n menuPath: ['Math', 'Fixed Vector', 'Cross Product'],\n isPure: true,\n inputs: [\n { name: 'a', displayName: 'A', type: 'object' },\n { name: 'b', displayName: 'B', type: 'object' }\n ],\n outputs: [\n { name: 'result', displayName: 'Result', type: 'object' }\n ],\n color: '#673AB7'\n};\nexport class FixedVector2CrossExecutor {\n execute(node, context) {\n const ctx = context;\n const a = ctx.evaluateInput(node.id, 'a', FixedVector2.ZERO);\n const b = ctx.evaluateInput(node.id, 'b', FixedVector2.ZERO);\n return { outputs: { result: FixedVector2.cross(a ?? FixedVector2.ZERO, b ?? FixedVector2.ZERO) } };\n }\n}\n// FixedVector2 Distance\nexport const FixedVector2DistanceTemplate = {\n type: 'FixedVector2Distance',\n title: 'FixedVector2 Distance',\n category: 'math',\n description: 'Distance between two points',\n keywords: ['fixed', 'vector', 'distance'],\n menuPath: ['Math', 'Fixed Vector', 'Distance'],\n isPure: true,\n inputs: [\n { name: 'a', displayName: 'A', type: 'object' },\n { name: 'b', displayName: 'B', type: 'object' }\n ],\n outputs: [\n { name: 'distance', displayName: 'Distance', type: 'object' }\n ],\n color: '#673AB7'\n};\nexport class FixedVector2DistanceExecutor {\n execute(node, context) {\n const ctx = context;\n const a = ctx.evaluateInput(node.id, 'a', FixedVector2.ZERO);\n const b = ctx.evaluateInput(node.id, 'b', FixedVector2.ZERO);\n return { outputs: { distance: FixedVector2.distance(a ?? FixedVector2.ZERO, b ?? FixedVector2.ZERO) } };\n }\n}\n// FixedVector2 Lerp\nexport const FixedVector2LerpTemplate = {\n type: 'FixedVector2Lerp',\n title: 'FixedVector2 Lerp',\n category: 'math',\n description: 'Linear interpolation between two vectors',\n keywords: ['fixed', 'vector', 'lerp', 'interpolate'],\n menuPath: ['Math', 'Fixed Vector', 'Lerp'],\n isPure: true,\n inputs: [\n { name: 'a', displayName: 'A', type: 'object' },\n { name: 'b', displayName: 'B', type: 'object' },\n { name: 't', displayName: 'T', type: 'object' }\n ],\n outputs: [\n { name: 'result', displayName: 'Result', type: 'object' }\n ],\n color: '#673AB7'\n};\nexport class FixedVector2LerpExecutor {\n execute(node, context) {\n const ctx = context;\n const a = ctx.evaluateInput(node.id, 'a', FixedVector2.ZERO);\n const b = ctx.evaluateInput(node.id, 'b', FixedVector2.ZERO);\n const t = ctx.evaluateInput(node.id, 't', Fixed32.HALF);\n return { outputs: { result: FixedVector2.lerp(a ?? FixedVector2.ZERO, b ?? FixedVector2.ZERO, t ?? Fixed32.HALF) } };\n }\n}\n// Node definitions collection\nexport const FixedVectorNodeDefinitions = [\n { template: MakeFixedVector2Template, executor: new MakeFixedVector2Executor() },\n { template: BreakFixedVector2Template, executor: new BreakFixedVector2Executor() },\n { template: FixedVector2AddTemplate, executor: new FixedVector2AddExecutor() },\n { template: FixedVector2SubtractTemplate, executor: new FixedVector2SubtractExecutor() },\n { template: FixedVector2ScaleTemplate, executor: new FixedVector2ScaleExecutor() },\n { template: FixedVector2NegateTemplate, executor: new FixedVector2NegateExecutor() },\n { template: FixedVector2LengthTemplate, executor: new FixedVector2LengthExecutor() },\n { template: FixedVector2NormalizeTemplate, executor: new FixedVector2NormalizeExecutor() },\n { template: FixedVector2DotTemplate, executor: new FixedVector2DotExecutor() },\n { template: FixedVector2CrossTemplate, executor: new FixedVector2CrossExecutor() },\n { template: FixedVector2DistanceTemplate, executor: new FixedVector2DistanceExecutor() },\n { template: FixedVector2LerpTemplate, executor: new FixedVector2LerpExecutor() }\n];\n//# sourceMappingURL=FixedVectorNodes.js.map","/**\n * @zh 颜色蓝图节点\n * @en Color Blueprint Nodes\n */\nimport { Color } from '../Color';\n// Make Color from RGBA\nexport const MakeColorTemplate = {\n type: 'MakeColor',\n title: 'Make Color',\n category: 'math',\n description: 'Creates a Color from RGBA',\n keywords: ['make', 'create', 'color', 'rgba'],\n menuPath: ['Math', 'Color', 'Make Color'],\n isPure: true,\n inputs: [\n { name: 'r', displayName: 'R (0-255)', type: 'int', defaultValue: 255 },\n { name: 'g', displayName: 'G (0-255)', type: 'int', defaultValue: 255 },\n { name: 'b', displayName: 'B (0-255)', type: 'int', defaultValue: 255 },\n { name: 'a', displayName: 'A (0-1)', type: 'float', defaultValue: 1 }\n ],\n outputs: [\n { name: 'color', displayName: 'Color', type: 'color' }\n ],\n color: '#E91E63'\n};\nexport class MakeColorExecutor {\n execute(node, context) {\n const ctx = context;\n const r = Number(ctx.evaluateInput(node.id, 'r', 255));\n const g = Number(ctx.evaluateInput(node.id, 'g', 255));\n const b = Number(ctx.evaluateInput(node.id, 'b', 255));\n const a = Number(ctx.evaluateInput(node.id, 'a', 1));\n return { outputs: { color: new Color(r, g, b, a) } };\n }\n}\n// Break Color\nexport const BreakColorTemplate = {\n type: 'BreakColor',\n title: 'Break Color',\n category: 'math',\n description: 'Breaks a Color into RGBA',\n keywords: ['break', 'split', 'color', 'rgba'],\n menuPath: ['Math', 'Color', 'Break Color'],\n isPure: true,\n inputs: [\n { name: 'color', displayName: 'Color', type: 'color' }\n ],\n outputs: [\n { name: 'r', displayName: 'R', type: 'int' },\n { name: 'g', displayName: 'G', type: 'int' },\n { name: 'b', displayName: 'B', type: 'int' },\n { name: 'a', displayName: 'A', type: 'float' }\n ],\n color: '#E91E63'\n};\nexport class BreakColorExecutor {\n execute(node, context) {\n const ctx = context;\n const color = ctx.evaluateInput(node.id, 'color', Color.WHITE);\n const c = color ?? Color.WHITE;\n return { outputs: { r: c.r, g: c.g, b: c.b, a: c.a } };\n }\n}\n// Color from Hex\nexport const ColorFromHexTemplate = {\n type: 'ColorFromHex',\n title: 'Color From Hex',\n category: 'math',\n description: 'Creates a Color from hex string',\n keywords: ['color', 'hex', 'from', 'create'],\n menuPath: ['Math', 'Color', 'From Hex'],\n isPure: true,\n inputs: [\n { name: 'hex', displayName: 'Hex', type: 'string', defaultValue: '#FFFFFF' },\n { name: 'alpha', displayName: 'Alpha', type: 'float', defaultValue: 1 }\n ],\n outputs: [\n { name: 'color', displayName: 'Color', type: 'color' }\n ],\n color: '#E91E63'\n};\nexport class ColorFromHexExecutor {\n execute(node, context) {\n const ctx = context;\n const hex = String(ctx.evaluateInput(node.id, 'hex', '#FFFFFF'));\n const alpha = Number(ctx.evaluateInput(node.id, 'alpha', 1));\n return { outputs: { color: Color.fromHex(hex, alpha) } };\n }\n}\n// Color to Hex\nexport const ColorToHexTemplate = {\n type: 'ColorToHex',\n title: 'Color To Hex',\n category: 'math',\n description: 'Converts a Color to hex string',\n keywords: ['color', 'hex', 'to', 'convert'],\n menuPath: ['Math', 'Color', 'To Hex'],\n isPure: true,\n inputs: [\n { name: 'color', displayName: 'Color', type: 'color' }\n ],\n outputs: [\n { name: 'hex', displayName: 'Hex', type: 'string' }\n ],\n color: '#E91E63'\n};\nexport class ColorToHexExecutor {\n execute(node, context) {\n const ctx = context;\n const color = ctx.evaluateInput(node.id, 'color', Color.WHITE);\n return { outputs: { hex: (color ?? Color.WHITE).toHex() } };\n }\n}\n// Color from HSL\nexport const ColorFromHSLTemplate = {\n type: 'ColorFromHSL',\n title: 'Color From HSL',\n category: 'math',\n description: 'Creates a Color from HSL values',\n keywords: ['color', 'hsl', 'hue', 'saturation', 'lightness'],\n menuPath: ['Math', 'Color', 'From HSL'],\n isPure: true,\n inputs: [\n { name: 'h', displayName: 'H (0-360)', type: 'float', defaultValue: 0 },\n { name: 's', displayName: 'S (0-1)', type: 'float', defaultValue: 1 },\n { name: 'l', displayName: 'L (0-1)', type: 'float', defaultValue: 0.5 },\n { name: 'a', displayName: 'A (0-1)', type: 'float', defaultValue: 1 }\n ],\n outputs: [\n { name: 'color', displayName: 'Color', type: 'color' }\n ],\n color: '#E91E63'\n};\nexport class ColorFromHSLExecutor {\n execute(node, context) {\n const ctx = context;\n const h = Number(ctx.evaluateInput(node.id, 'h', 0));\n const s = Number(ctx.evaluateInput(node.id, 's', 1));\n const l = Number(ctx.evaluateInput(node.id, 'l', 0.5));\n const a = Number(ctx.evaluateInput(node.id, 'a', 1));\n return { outputs: { color: Color.fromHSL(h, s, l, a) } };\n }\n}\n// Color to HSL\nexport const ColorToHSLTemplate = {\n type: 'ColorToHSL',\n title: 'Color To HSL',\n category: 'math',\n description: 'Converts a Color to HSL values',\n keywords: ['color', 'hsl', 'convert'],\n menuPath: ['Math', 'Color', 'To HSL'],\n isPure: true,\n inputs: [\n { name: 'color', displayName: 'Color', type: 'color' }\n ],\n outputs: [\n { name: 'h', displayName: 'H', type: 'float' },\n { name: 's', displayName: 'S', type: 'float' },\n { name: 'l', displayName: 'L', type: 'float' }\n ],\n color: '#E91E63'\n};\nexport class ColorToHSLExecutor {\n execute(node, context) {\n const ctx = context;\n const color = ctx.evaluateInput(node.id, 'color', Color.WHITE);\n const hsl = (color ?? Color.WHITE).toHSL();\n return { outputs: { h: hsl.h, s: hsl.s, l: hsl.l } };\n }\n}\n// Color Lerp\nexport const ColorLerpTemplate = {\n type: 'ColorLerp',\n title: 'Color Lerp',\n category: 'math',\n description: 'Linear interpolation between two colors',\n keywords: ['color', 'lerp', 'interpolate', 'blend'],\n menuPath: ['Math', 'Color', 'Lerp'],\n isPure: true,\n inputs: [\n { name: 'from', displayName: 'From', type: 'color' },\n { name: 'to', displayName: 'To', type: 'color' },\n { name: 't', displayName: 'T', type: 'float', defaultValue: 0.5 }\n ],\n outputs: [\n { name: 'result', displayName: 'Result', type: 'color' }\n ],\n color: '#E91E63'\n};\nexport class ColorLerpExecutor {\n execute(node, context) {\n const ctx = context;\n const from = ctx.evaluateInput(node.id, 'from', Color.BLACK);\n const to = ctx.evaluateInput(node.id, 'to', Color.WHITE);\n const t = Number(ctx.evaluateInput(node.id, 't', 0.5));\n return { outputs: { result: Color.lerp(from ?? Color.BLACK, to ?? Color.WHITE, t) } };\n }\n}\n// Color Lighten\nexport const ColorLightenTemplate = {\n type: 'ColorLighten',\n title: 'Color Lighten',\n category: 'math',\n description: 'Lightens a color',\n keywords: ['color', 'lighten', 'bright'],\n menuPath: ['Math', 'Color', 'Lighten'],\n isPure: true,\n inputs: [\n { name: 'color', displayName: 'Color', type: 'color' },\n { name: 'amount', displayName: 'Amount', type: 'float', defaultValue: 0.1 }\n ],\n outputs: [\n { name: 'result', displayName: 'Result', type: 'color' }\n ],\n color: '#E91E63'\n};\nexport class ColorLightenExecutor {\n execute(node, context) {\n const ctx = context;\n const color = ctx.evaluateInput(node.id, 'color', Color.GRAY);\n const amount = Number(ctx.evaluateInput(node.id, 'amount', 0.1));\n return { outputs: { result: Color.lighten(color ?? Color.GRAY, amount) } };\n }\n}\n// Color Darken\nexport const ColorDarkenTemplate = {\n type: 'ColorDarken',\n title: 'Color Darken',\n category: 'math',\n description: 'Darkens a color',\n keywords: ['color', 'darken', 'dark'],\n menuPath: ['Math', 'Color', 'Darken'],\n isPure: true,\n inputs: [\n { name: 'color', displayName: 'Color', type: 'color' },\n { name: 'amount', displayName: 'Amount', type: 'float', defaultValue: 0.1 }\n ],\n outputs: [\n { name: 'result', displayName: 'Result', type: 'color' }\n ],\n color: '#E91E63'\n};\nexport class ColorDarkenExecutor {\n execute(node, context) {\n const ctx = context;\n const color = ctx.evaluateInput(node.id, 'color', Color.GRAY);\n const amount = Number(ctx.evaluateInput(node.id, 'amount', 0.1));\n return { outputs: { result: Color.darken(color ?? Color.GRAY, amount) } };\n }\n}\n// Color Saturate\nexport const ColorSaturateTemplate = {\n type: 'ColorSaturate',\n title: 'Color Saturate',\n category: 'math',\n description: 'Increases color saturation',\n keywords: ['color', 'saturate', 'saturation'],\n menuPath: ['Math', 'Color', 'Saturate'],\n isPure: true,\n inputs: [\n { name: 'color', displayName: 'Color', type: 'color' },\n { name: 'amount', displayName: 'Amount', type: 'float', defaultValue: 0.1 }\n ],\n outputs: [\n { name: 'result', displayName: 'Result', type: 'color' }\n ],\n color: '#E91E63'\n};\nexport class ColorSaturateExecutor {\n execute(node, context) {\n const ctx = context;\n const color = ctx.evaluateInput(node.id, 'color', Color.GRAY);\n const amount = Number(ctx.evaluateInput(node.id, 'amount', 0.1));\n return { outputs: { result: Color.saturate(color ?? Color.GRAY, amount) } };\n }\n}\n// Color Desaturate\nexport const ColorDesaturateTemplate = {\n type: 'ColorDesaturate',\n title: 'Color Desaturate',\n category: 'math',\n description: 'Decreases color saturation',\n keywords: ['color', 'desaturate', 'saturation'],\n menuPath: ['Math', 'Color', 'Desaturate'],\n isPure: true,\n inputs: [\n { name: 'color', displayName: 'Color', type: 'color' },\n { name: 'amount', displayName: 'Amount', type: 'float', defaultValue: 0.1 }\n ],\n outputs: [\n { name: 'result', displayName: 'Result', type: 'color' }\n ],\n color: '#E91E63'\n};\nexport class ColorDesaturateExecutor {\n execute(node, context) {\n const ctx = context;\n const color = ctx.evaluateInput(node.id, 'color', Color.GRAY);\n const amount = Number(ctx.evaluateInput(node.id, 'amount', 0.1));\n return { outputs: { result: Color.desaturate(color ?? Color.GRAY, amount) } };\n }\n}\n// Color Invert\nexport const ColorInvertTemplate = {\n type: 'ColorInvert',\n title: 'Color Invert',\n category: 'math',\n description: 'Inverts a color',\n keywords: ['color', 'invert', 'inverse'],\n menuPath: ['Math', 'Color', 'Invert'],\n isPure: true,\n inputs: [\n { name: 'color', displayName: 'Color', type: 'color' }\n ],\n outputs: [\n { name: 'result', displayName: 'Result', type: 'color' }\n ],\n color: '#E91E63'\n};\nexport class ColorInvertExecutor {\n execute(node, context) {\n const ctx = context;\n const color = ctx.evaluateInput(node.id, 'color', Color.WHITE);\n return { outputs: { result: Color.invert(color ?? Color.WHITE) } };\n }\n}\n// Color Grayscale\nexport const ColorGrayscaleTemplate = {\n type: 'ColorGrayscale',\n title: 'Color Grayscale',\n category: 'math',\n description: 'Converts color to grayscale',\n keywords: ['color', 'grayscale', 'gray', 'grey'],\n menuPath: ['Math', 'Color', 'Grayscale'],\n isPure: true,\n inputs: [\n { name: 'color', displayName: 'Color', type: 'color' }\n ],\n outputs: [\n { name: 'result', displayName: 'Result', type: 'color' }\n ],\n color: '#E91E63'\n};\nexport class ColorGrayscaleExecutor {\n execute(node, context) {\n const ctx = context;\n const color = ctx.evaluateInput(node.id, 'color', Color.WHITE);\n return { outputs: { result: Color.grayscale(color ?? Color.WHITE) } };\n }\n}\n// Color Luminance\nexport const ColorLuminanceTemplate = {\n type: 'ColorLuminance',\n title: 'Color Luminance',\n category: 'math',\n description: 'Gets perceived brightness (0-1)',\n keywords: ['color', 'luminance', 'brightness'],\n menuPath: ['Math', 'Color', 'Luminance'],\n isPure: true,\n inputs: [\n { name: 'color', displayName: 'Color', type: 'color' }\n ],\n outputs: [\n { name: 'luminance', displayName: 'Luminance', type: 'float' }\n ],\n color: '#E91E63'\n};\nexport class ColorLuminanceExecutor {\n execute(node, context) {\n const ctx = context;\n const color = ctx.evaluateInput(node.id, 'color', Color.WHITE);\n return { outputs: { luminance: Color.luminance(color ?? Color.WHITE) } };\n }\n}\n// Color Constants\nexport const ColorConstantsTemplate = {\n type: 'ColorConstants',\n title: 'Color Constants',\n category: 'math',\n description: 'Common color constants',\n keywords: ['color', 'constant', 'red', 'green', 'blue', 'white', 'black'],\n menuPath: ['Math', 'Color', 'Constants'],\n isPure: true,\n inputs: [],\n outputs: [\n { name: 'white', displayName: 'White', type: 'color' },\n { name: 'black', displayName: 'Black', type: 'color' },\n { name: 'red', displayName: 'Red', type: 'color' },\n { name: 'green', displayName: 'Green', type: 'color' },\n { name: 'blue', displayName: 'Blue', type: 'color' },\n { name: 'transparent', displayName: 'Transparent', type: 'color' }\n ],\n color: '#E91E63'\n};\nexport class ColorConstantsExecutor {\n execute() {\n return {\n outputs: {\n white: Color.WHITE,\n black: Color.BLACK,\n red: Color.RED,\n green: Color.GREEN,\n blue: Color.BLUE,\n transparent: Color.TRANSPARENT\n }\n };\n }\n}\n// Node definitions collection\nexport const ColorNodeDefinitions = [\n { template: MakeColorTemplate, executor: new MakeColorExecutor() },\n { template: BreakColorTemplate, executor: new BreakColorExecutor() },\n { template: ColorFromHexTemplate, executor: new ColorFromHexExecutor() },\n { template: ColorToHexTemplate, executor: new ColorToHexExecutor() },\n { template: ColorFromHSLTemplate, executor: new ColorFromHSLExecutor() },\n { template: ColorToHSLTemplate, executor: new ColorToHSLExecutor() },\n { template: ColorLerpTemplate, executor: new ColorLerpExecutor() },\n { template: ColorLightenTemplate, executor: new ColorLightenExecutor() },\n { template: ColorDarkenTemplate, executor: new ColorDarkenExecutor() },\n { template: ColorSaturateTemplate, executor: new ColorSaturateExecutor() },\n { template: ColorDesaturateTemplate, executor: new ColorDesaturateExecutor() },\n { template: ColorInvertTemplate, executor: new ColorInvertExecutor() },\n { template: ColorGrayscaleTemplate, executor: new ColorGrayscaleExecutor() },\n { template: ColorLuminanceTemplate, executor: new ColorLuminanceExecutor() },\n { template: ColorConstantsTemplate, executor: new ColorConstantsExecutor() }\n];\n//# sourceMappingURL=ColorNodes.js.map","/**\n * @zh 数学库蓝图节点\n * @en Math Library Blueprint Nodes\n *\n * @zh 导出所有数学相关的蓝图节点\n * @en Exports all math-related blueprint nodes\n */\nexport * from './VectorNodes';\nexport * from './FixedNodes';\nexport * from './FixedVectorNodes';\nexport * from './ColorNodes';\n// Re-export node definition collections\nimport { VectorNodeDefinitions } from './VectorNodes';\nimport { FixedNodeDefinitions } from './FixedNodes';\nimport { FixedVectorNodeDefinitions } from './FixedVectorNodes';\nimport { ColorNodeDefinitions } from './ColorNodes';\n/**\n * @zh 所有数学库蓝图节点定义\n * @en All math library blueprint node definitions\n */\nexport const MathNodeDefinitions = [\n ...VectorNodeDefinitions,\n ...FixedNodeDefinitions,\n ...FixedVectorNodeDefinitions,\n ...ColorNodeDefinitions\n];\n//# sourceMappingURL=index.js.map","import { Vector2 } from '../Vector2';\n/**\n * 碰撞检测器\n *\n * 提供各种几何体之间的碰撞检测功能\n */\nexport class CollisionDetector {\n // 点与几何体碰撞检测\n /**\n * 点与圆形碰撞检测\n * @param point 点\n * @param circle 圆形\n * @returns 碰撞信息\n */\n static pointCircle(point, circle) {\n const distance = Vector2.distance(point, circle.center);\n const collided = distance <= circle.radius;\n if (!collided) {\n return { collided: false };\n }\n const normal = distance > 0\n ? Vector2.subtract(point, circle.center).normalize()\n : new Vector2(1, 0); // 默认法线\n return {\n collided: true,\n normal,\n penetration: circle.radius - distance,\n contactPoint: point.clone()\n };\n }\n /**\n * 点与矩形碰撞检测\n * @param point 点\n * @param rect 矩形\n * @returns 碰撞信息\n */\n static pointRect(point, rect) {\n const collided = rect.containsPoint(point);\n if (!collided) {\n return { collided: false };\n }\n // 计算到各边的距离\n const distLeft = point.x - rect.left;\n const distRight = rect.right - point.x;\n const distTop = point.y - rect.top;\n const distBottom = rect.bottom - point.y;\n // 找到最小距离确定法线方向\n const minDist = Math.min(distLeft, distRight, distTop, distBottom);\n let normal;\n const penetration = minDist;\n if (minDist === distLeft) {\n normal = new Vector2(-1, 0);\n }\n else if (minDist === distRight) {\n normal = new Vector2(1, 0);\n }\n else if (minDist === distTop) {\n normal = new Vector2(0, -1);\n }\n else {\n normal = new Vector2(0, 1);\n }\n return {\n collided: true,\n normal,\n penetration,\n contactPoint: point.clone()\n };\n }\n // 圆形碰撞检测\n /**\n * 圆形与圆形碰撞检测\n * @param circle1 第一个圆形\n * @param circle2 第二个圆形\n * @returns 碰撞信息\n */\n static circleCircle(circle1, circle2) {\n const distance = Vector2.distance(circle1.center, circle2.center);\n const radiusSum = circle1.radius + circle2.radius;\n const collided = distance <= radiusSum;\n if (!collided) {\n return { collided: false };\n }\n const normal = distance > 0\n ? Vector2.subtract(circle2.center, circle1.center).normalize()\n : new Vector2(1, 0); // 默认法线\n const penetration = radiusSum - distance;\n const contactPoint = circle1.center.clone().add(normal.clone().multiply(circle1.radius - penetration * 0.5));\n return {\n collided: true,\n normal,\n penetration,\n contactPoint\n };\n }\n /**\n * 圆形与矩形碰撞检测\n * @param circle 圆形\n * @param rect 矩形\n * @returns 碰撞信息\n */\n static circleRect(circle, rect) {\n // 找到矩形上离圆心最近的点\n const closestPoint = rect.closestPointTo(circle.center);\n // 检查是否碰撞\n const distance = Vector2.distance(circle.center, closestPoint);\n const collided = distance <= circle.radius;\n if (!collided) {\n return { collided: false };\n }\n // 计算法线和穿透深度\n const normal = distance > 0\n ? Vector2.subtract(closestPoint, circle.center).normalize()\n : new Vector2(0, -1); // 默认法线(圆心在矩形内部时)\n const penetration = circle.radius - distance;\n return {\n collided: true,\n normal,\n penetration,\n contactPoint: closestPoint\n };\n }\n // 矩形碰撞检测\n /**\n * 矩形与矩形碰撞检测(AABB)\n * @param rect1 第一个矩形\n * @param rect2 第二个矩形\n * @returns 碰撞信息\n */\n static rectRect(rect1, rect2) {\n const collided = rect1.intersects(rect2);\n if (!collided) {\n return { collided: false };\n }\n // 计算重叠区域\n const overlapLeft = Math.max(rect1.left, rect2.left);\n const overlapRight = Math.min(rect1.right, rect2.right);\n const overlapTop = Math.max(rect1.top, rect2.top);\n const overlapBottom = Math.min(rect1.bottom, rect2.bottom);\n const overlapWidth = overlapRight - overlapLeft;\n const overlapHeight = overlapBottom - overlapTop;\n // 确定分离方向(最小重叠轴)\n let normal;\n let penetration;\n if (overlapWidth < overlapHeight) {\n // 水平分离\n penetration = overlapWidth;\n if (rect1.centerX < rect2.centerX) {\n normal = new Vector2(-1, 0);\n }\n else {\n normal = new Vector2(1, 0);\n }\n }\n else {\n // 垂直分离\n penetration = overlapHeight;\n if (rect1.centerY < rect2.centerY) {\n normal = new Vector2(0, -1);\n }\n else {\n normal = new Vector2(0, 1);\n }\n }\n const contactPoint = new Vector2((overlapLeft + overlapRight) * 0.5, (overlapTop + overlapBottom) * 0.5);\n return {\n collided: true,\n normal,\n penetration,\n contactPoint\n };\n }\n // 射线投射\n /**\n * 射线与圆形相交检测\n * @param rayOrigin 射线起点\n * @param rayDirection 射线方向(单位向量)\n * @param circle 圆形\n * @param maxDistance 最大检测距离,默认无限\n * @returns 碰撞信息,包含距离信息\n */\n static rayCircle(rayOrigin, rayDirection, circle, maxDistance = Infinity) {\n const oc = Vector2.subtract(rayOrigin, circle.center);\n const a = rayDirection.lengthSquared;\n const b = 2 * Vector2.dot(oc, rayDirection);\n const c = oc.lengthSquared - circle.radius * circle.radius;\n const discriminant = b * b - 4 * a * c;\n if (discriminant < 0) {\n return { collided: false };\n }\n const sqrt = Math.sqrt(discriminant);\n const t1 = (-b - sqrt) / (2 * a);\n const t2 = (-b + sqrt) / (2 * a);\n // 选择最近的正距离\n const t = t1 >= 0 ? t1 : t2;\n if (t < 0 || t > maxDistance) {\n return { collided: false };\n }\n const contactPoint = rayOrigin.clone().add(rayDirection.clone().multiply(t));\n const normal = Vector2.subtract(contactPoint, circle.center).normalize();\n return {\n collided: true,\n normal,\n contactPoint,\n distance: t,\n penetration: 0 // 射线检测不计算穿透\n };\n }\n /**\n * 射线与矩形相交检测\n * @param rayOrigin 射线起点\n * @param rayDirection 射线方向(单位向量)\n * @param rect 矩形\n * @param maxDistance 最大检测距离,默认无限\n * @returns 碰撞信息,包含距离信息\n */\n static rayRect(rayOrigin, rayDirection, rect, maxDistance = Infinity) {\n // 避免除零\n const invDirX = rayDirection.x !== 0 ? 1 / rayDirection.x : 1e10;\n const invDirY = rayDirection.y !== 0 ? 1 / rayDirection.y : 1e10;\n // 计算与各边的交点参数\n const t1 = (rect.left - rayOrigin.x) * invDirX;\n const t2 = (rect.right - rayOrigin.x) * invDirX;\n const t3 = (rect.top - rayOrigin.y) * invDirY;\n const t4 = (rect.bottom - rayOrigin.y) * invDirY;\n const tmin = Math.max(Math.min(t1, t2), Math.min(t3, t4));\n const tmax = Math.min(Math.max(t1, t2), Math.max(t3, t4));\n // 没有交点或交点在射线反方向\n if (tmax < 0 || tmin > tmax || tmin > maxDistance) {\n return { collided: false };\n }\n const t = tmin >= 0 ? tmin : tmax;\n const contactPoint = rayOrigin.clone().add(rayDirection.clone().multiply(t));\n // 确定法线方向\n let normal;\n const epsilon = 1e-6;\n if (Math.abs(contactPoint.x - rect.left) < epsilon) {\n normal = new Vector2(-1, 0);\n }\n else if (Math.abs(contactPoint.x - rect.right) < epsilon) {\n normal = new Vector2(1, 0);\n }\n else if (Math.abs(contactPoint.y - rect.top) < epsilon) {\n normal = new Vector2(0, -1);\n }\n else {\n normal = new Vector2(0, 1);\n }\n return {\n collided: true,\n normal,\n contactPoint,\n distance: t,\n penetration: 0 // 射线检测不计算穿透\n };\n }\n // 线段相交检测\n /**\n * 线段与线段相交检测\n * @param p1 第一条线段起点\n * @param p2 第一条线段终点\n * @param p3 第二条线段起点\n * @param p4 第二条线段终点\n * @returns 碰撞信息\n */\n static lineSegmentLineSegment(p1, p2, p3, p4) {\n const d1 = Vector2.subtract(p2, p1);\n const d2 = Vector2.subtract(p4, p3);\n const d3 = Vector2.subtract(p3, p1);\n const cross = Vector2.cross(d1, d2);\n if (Math.abs(cross) < Number.EPSILON) {\n // 平行或共线\n return { collided: false };\n }\n const t1 = Vector2.cross(d3, d2) / cross;\n const t2 = Vector2.cross(d3, d1) / cross;\n if (t1 >= 0 && t1 <= 1 && t2 >= 0 && t2 <= 1) {\n const contactPoint = p1.clone().add(d1.clone().multiply(t1));\n // 计算法线(垂直于第一条线段)\n const normal = d1.perpendicular().normalize();\n return {\n collided: true,\n normal,\n contactPoint,\n penetration: 0 // 线段相交不计算穿透\n };\n }\n return { collided: false };\n }\n /**\n * 线段与圆形相交检测\n * @param lineStart 线段起点\n * @param lineEnd 线段终点\n * @param circle 圆形\n * @returns 碰撞信息\n */\n static lineSegmentCircle(lineStart, lineEnd, circle) {\n const d = Vector2.subtract(lineEnd, lineStart);\n const f = Vector2.subtract(lineStart, circle.center);\n const a = Vector2.dot(d, d);\n const b = 2 * Vector2.dot(f, d);\n const c = Vector2.dot(f, f) - circle.radius * circle.radius;\n const discriminant = b * b - 4 * a * c;\n if (discriminant < 0) {\n return { collided: false };\n }\n const sqrt = Math.sqrt(discriminant);\n const t1 = (-b - sqrt) / (2 * a);\n const t2 = (-b + sqrt) / (2 * a);\n // 检查交点是否在线段上\n const validT = [];\n if (t1 >= 0 && t1 <= 1)\n validT.push(t1);\n if (t2 >= 0 && t2 <= 1)\n validT.push(t2);\n if (validT.length === 0) {\n return { collided: false };\n }\n // 使用最近的交点\n const t = validT[0];\n const contactPoint = lineStart.clone().add(d.clone().multiply(t));\n const normal = Vector2.subtract(contactPoint, circle.center).normalize();\n return {\n collided: true,\n normal,\n contactPoint,\n penetration: 0 // 线段相交不计算穿透\n };\n }\n // 快速排斥测试\n /**\n * AABB包围盒快速排斥测试\n * @param bounds1 第一个包围盒\n * @param bounds2 第二个包围盒\n * @returns 是否可能相交\n */\n static aabbTest(bounds1, bounds2) {\n return bounds1.intersects(bounds2);\n }\n /**\n * 圆形包围盒快速排斥测试\n * @param center1 第一个圆心\n * @param radius1 第一个半径\n * @param center2 第二个圆心\n * @param radius2 第二个半径\n * @returns 是否可能相交\n */\n static circleTest(center1, radius1, center2, radius2) {\n const distance = Vector2.distance(center1, center2);\n return distance <= radius1 + radius2;\n }\n}\n//# sourceMappingURL=CollisionDetector.js.map"],"names":["Vector2","constructor","x","y","this","length","Math","sqrt","lengthSquared","angle","atan2","isZero","isUnit","lenSq","abs","Number","EPSILON","set","copy","other","clone","add","subtract","multiply","scalar","divide","Error","negate","dot","cross","normalize","len","normalized","distanceTo","dx","dy","distanceToSquared","angleTo","lenProduct","acos","max","min","projectOnto","onto","projectOntoLength","perpendicular","rotate","cos","sin","rotated","rotateAround","center","reflect","normal","reflected","lerp","target","t","clampLength","maxLength","clamp","equals","epsilon","exactEquals","a","b","vector","distance","fromAngle","fromPolar","toString","toFixed","toArray","toObject","ZERO","ONE","RIGHT","LEFT","UP","DOWN","Vector3","z","dz","FORWARD","BACK","Matrix3","elements","Float32Array","identity","get","row","col","value","m00","m01","m02","m10","m11","m12","m20","m21","m22","zero","fill","fromArray","i","multiplyScalar","result","premultiply","makeTranslation","makeRotation","makeScale","scaleX","scaleY","translate","scale","transpose","tmp","determinant","e","invert","det","console","warn","invDet","transformVector","w","transformDirection","transformVectors","vectors","map","v","getTranslation","getRotation","getScale","decompose","translation","rotation","isIdentity","IDENTITY","TRS","Array","from","toCSSTransform","Rectangle","width","height","left","right","top","bottom","centerX","centerY","topLeft","topRight","bottomLeft","bottomRight","area","perimeter","isEmpty","isSquare","setPosition","setSize","setCenter","inflate","amount","inflateXY","horizontal","vertical","containsPoint","point","contains","containsRect","intersects","intersection","EMPTY","union","intersectionArea","distanceToPoint","distanceToRect","closestPointTo","fromCenter","fromPoints","point1","point2","fromPointArray","points","minX","minY","maxX","maxY","square","size","getVertices","Circle","radius","diameter","PI","circumference","bounds","setRadius","translateBy","offset","containsCircle","distanceToCircle","pointOnBoundary","distanceSquared","radiusSum","intersectsRect","rect","closestX","closestY","d","smallerRadius","r1","r2","distanceToPointFromBoundary","distanceToCircleFromBoundary","direction","farthestPointFrom","getPointAtAngle","getAngleToPoint","getLineIntersections","lineStart","lineEnd","fx","fy","discriminant","t1","t2","fromDiameter","fromThreePoints","p1","p2","p3","ax","ay","bx","by","cx","cy","ux","uy","maxDistance","UNIT","Fixed32","raw","n","round","SCALE","fromRaw","fromInt","FRACTION_BITS","toNumber","toRaw","toInt","sub","mul","aLow","aHigh","bLow","bHigh","lowLow","lowHigh","highLow","div","mod","neg","eq","ne","lt","le","gt","ge","isPositive","isNegative","guess","prev","floor","ceil","sign","NEG_ONE","MAX_VALUE","MIN_VALUE","HALF","TWO_PI","HALF_PI","RAD_TO_DEG","DEG_TO_RAD","FixedMath","generateSinTable","table","Int32Array","SIN_TABLE_SIZE","halfPi","pi","tableAngle","negative","tableIndex","SIN_TABLE","tan","cosVal","yRaw","xRaw","absY","absX","atanApprox","num","den","ratio","x2","factor","asin","one","normalizeAngle","angleDelta","to","lerpAngle","delta","radToDeg","rad","degToRad","deg","pow","base","exp","x3","x4","ln","two","expY","diff","sum","FixedVector2","rawX","rawY","fromObject","obj","toRawObject","mulComponents","divComponents","distanceSquaredTo","perpendicularCCW","maxLenSq","moveTowards","dist","MathUtils","degrees","radians","normalizeAngleSigned","angleDifference","clamp01","inverseLerp","remap","inMin","inMax","outMin","outMax","smoothStep","smootherStep","approximately","random","randomInt","randomChoice","array","randomBoolean","probability","randomInUnitCircle","randomOnUnitCircle","fastInverseSqrt","fastPow","exponent","factorial","NaN","gcd","temp","lcm","fibonacci","arithmeticSum","first","last","count","geometricSum","quadraticBezier","p0","u","tt","uu","cubicBezier","uuu","ttt","catmullRom","t3","noise","seed","smoothNoise","intX","intY","fracX","fracY","c","i1","i2","toPrecision","precision","inRange","values","average","reduce","val","median","sorted","sort","middle","QUARTER_PI","GOLDEN_RATIO","Color","r","g","fromHex","hex","alpha","hexToRgb","fromUint32","hasAlpha","fromHSL","h","s","l","hslToRgb","fromFloat","colorHex","replace","parseInt","substring","rgbToHex","toHex","padStart","hue2rgb","p","q","rgbToHsl","packRGB","packARGB","packABGR","packHexAlpha","unpackARGB","unpackABGR","lerpUint32","fromR","fromG","fromB","toR","toG","toB","mix","color1","color2","lighten","color","hsl","rgb","darken","saturate","desaturate","grayscale","gray","luminance","contrastRatio","l1","l2","toHexAlpha","slice","toRgba","toRgb","toHSL","toUint32","toUint32Alpha","toWebGL","toFloatArray","undefined","WHITE","BLACK","RED","GREEN","BLUE","YELLOW","CYAN","MAGENTA","TRANSPARENT","GRAY","Easing","linear","quadIn","quadOut","quadInOut","cubicIn","cubicOut","cubicInOut","quartIn","quartOut","quartInOut","quintIn","quintOut","quintInOut","sineIn","sineOut","sineInOut","expoIn","expoOut","expoInOut","circIn","circOut","circInOut","backIn","backOut","c1","backInOut","c2","elasticIn","amplitude","period","elasticOut","elasticInOut","bounceIn","bounceOut","n1","d1","bounceInOut","combine","easingFunctions","weights","piecewise","segments","totalDuration","seg","duration","normalizedSegments","accumulatedTime","segment","localT","easing","reverse","mirror","smoothIn","smoothOut","quickIn","quickOut","natural","emphasize","CachedInterpolator","interpolator","cache","Map","setRange","clear","has","clearCache","Interpolation","number","vector2","fromVal","toVal","cubicSpline","hermite","m0","m1","slerp","toVec","theta","sinTheta","createCachedInterpolator","spline","scaledT","vectorSpline","xPoints","yPoints","keyframe","keyframes","time","current","next","progress","easedProgress","pathInterpolation","path","closed","targetDistance","getPathLength","accumulatedDistance","start","end","segmentLength","segmentT","totalLength","createNumberInterpolator","createVectorInterpolator","createCompositeInterpolator","interpolators","MakeVector2Template","type","title","category","description","keywords","menuPath","isPure","inputs","name","displayName","defaultValue","outputs","MakeVector2Executor","execute","node","context","ctx","evaluateInput","id","BreakVector2Template","BreakVector2Executor","Vector2AddTemplate","Vector2AddExecutor","Vector2SubtractTemplate","Vector2SubtractExecutor","Vector2ScaleTemplate","Vector2ScaleExecutor","Vector2LengthTemplate","Vector2LengthExecutor","Vector2NormalizeTemplate","Vector2NormalizeExecutor","Vector2DotTemplate","Vector2DotExecutor","Vector2CrossTemplate","Vector2CrossExecutor","Vector2DistanceTemplate","Vector2DistanceExecutor","Vector2LerpTemplate","Vector2LerpExecutor","Vector2RotateTemplate","Vector2RotateExecutor","Vector2FromAngleTemplate","Vector2FromAngleExecutor","VectorNodeDefinitions","template","executor","Fixed32FromTemplate","Fixed32FromExecutor","fixed","Fixed32FromIntTemplate","Fixed32FromIntExecutor","Fixed32ToFloatTemplate","Fixed32ToFloatExecutor","Fixed32ToIntTemplate","Fixed32ToIntExecutor","Fixed32AddTemplate","Fixed32AddExecutor","Fixed32SubtractTemplate","Fixed32SubtractExecutor","Fixed32MultiplyTemplate","Fixed32MultiplyExecutor","Fixed32DivideTemplate","Fixed32DivideExecutor","divisor","Fixed32NegateTemplate","Fixed32NegateExecutor","Fixed32AbsTemplate","Fixed32AbsExecutor","Fixed32SqrtTemplate","Fixed32SqrtExecutor","Fixed32FloorTemplate","Fixed32FloorExecutor","Fixed32CeilTemplate","Fixed32CeilExecutor","Fixed32RoundTemplate","Fixed32RoundExecutor","Fixed32SignTemplate","Fixed32SignExecutor","Fixed32MinTemplate","Fixed32MinExecutor","Fixed32MaxTemplate","Fixed32MaxExecutor","Fixed32ClampTemplate","Fixed32ClampExecutor","Fixed32LerpTemplate","Fixed32LerpExecutor","Fixed32CompareTemplate","Fixed32CompareExecutor","aVal","bVal","equal","less","greater","Fixed32IsZeroTemplate","Fixed32IsZeroExecutor","Fixed32ConstantsTemplate","Fixed32ConstantsExecutor","half","twoPi","FixedNodeDefinitions","MakeFixedVector2Template","MakeFixedVector2Executor","BreakFixedVector2Template","BreakFixedVector2Executor","FixedVector2AddTemplate","FixedVector2AddExecutor","FixedVector2SubtractTemplate","FixedVector2SubtractExecutor","FixedVector2ScaleTemplate","FixedVector2ScaleExecutor","FixedVector2NegateTemplate","FixedVector2NegateExecutor","FixedVector2LengthTemplate","FixedVector2LengthExecutor","FixedVector2NormalizeTemplate","FixedVector2NormalizeExecutor","FixedVector2DotTemplate","FixedVector2DotExecutor","FixedVector2CrossTemplate","FixedVector2CrossExecutor","FixedVector2DistanceTemplate","FixedVector2DistanceExecutor","FixedVector2LerpTemplate","FixedVector2LerpExecutor","FixedVectorNodeDefinitions","MakeColorTemplate","MakeColorExecutor","BreakColorTemplate","BreakColorExecutor","ColorFromHexTemplate","ColorFromHexExecutor","String","ColorToHexTemplate","ColorToHexExecutor","ColorFromHSLTemplate","ColorFromHSLExecutor","ColorToHSLTemplate","ColorToHSLExecutor","ColorLerpTemplate","ColorLerpExecutor","ColorLightenTemplate","ColorLightenExecutor","ColorDarkenTemplate","ColorDarkenExecutor","ColorSaturateTemplate","ColorSaturateExecutor","ColorDesaturateTemplate","ColorDesaturateExecutor","ColorInvertTemplate","ColorInvertExecutor","ColorGrayscaleTemplate","ColorGrayscaleExecutor","ColorLuminanceTemplate","ColorLuminanceExecutor","ColorConstantsTemplate","ColorConstantsExecutor","white","black","red","green","blue","transparent","ColorNodeDefinitions","MathNodeDefinitions","pointCircle","circle","collided","penetration","contactPoint","pointRect","distLeft","distRight","distTop","distBottom","minDist","circleCircle","circle1","circle2","circleRect","closestPoint","rectRect","rect1","rect2","overlapLeft","overlapRight","overlapTop","overlapBottom","overlapWidth","overlapHeight","rayCircle","rayOrigin","rayDirection","Infinity","oc","rayRect","invDirX","invDirY","t4","tmin","tmax","lineSegmentLineSegment","p4","d2","d3","lineSegmentCircle","f","validT","push","aabbTest","bounds1","bounds2","circleTest","center1","radius1","center2","radius2"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.cjs","sources":["../bin/Vector2.js","../bin/Vector3.js","../bin/Matrix3.js","../bin/Rectangle.js","../bin/Circle.js","../bin/Polygon.js","../bin/Fixed32.js","../bin/FixedMath.js","../bin/FixedVector2.js","../bin/MathUtils.js","../bin/Color.js","../bin/Animation/Easing.js","../bin/Animation/Interpolation.js","../bin/nodes/VectorNodes.js","../bin/nodes/FixedNodes.js","../bin/nodes/FixedVectorNodes.js","../bin/nodes/ColorNodes.js","../bin/nodes/index.js","../bin/Collision/CollisionDetector.js"],"sourcesContent":["/**\n * 2D向量类\n *\n * 提供完整的2D向量运算功能,包括:\n * - 基础运算(加减乘除)\n * - 向量运算(点积、叉积、归一化)\n * - 几何运算(距离、角度、投影)\n * - 变换操作(旋转、反射、插值)\n */\nexport class Vector2 {\n /**\n * 创建2D向量\n * @param x X分量,默认为0\n * @param y Y分量,默认为0\n */\n constructor(x = 0, y = 0) {\n this.x = x;\n this.y = y;\n }\n // 基础属性\n /**\n * 获取向量长度(模)\n */\n get length() {\n return Math.sqrt(this.x * this.x + this.y * this.y);\n }\n /**\n * 获取向量长度的平方\n */\n get lengthSquared() {\n return this.x * this.x + this.y * this.y;\n }\n /**\n * 获取向量角度(弧度)\n */\n get angle() {\n return Math.atan2(this.y, this.x);\n }\n /**\n * 检查是否为零向量\n */\n get isZero() {\n return this.x === 0 && this.y === 0;\n }\n /**\n * 检查是否为单位向量\n */\n get isUnit() {\n const lenSq = this.lengthSquared;\n return Math.abs(lenSq - 1) < Number.EPSILON;\n }\n // 基础运算\n /**\n * 设置向量分量\n * @param x X分量\n * @param y Y分量\n * @returns 当前向量实例(链式调用)\n */\n set(x, y) {\n this.x = x;\n this.y = y;\n return this;\n }\n /**\n * 复制另一个向量的值\n * @param other 源向量\n * @returns 当前向量实例(链式调用)\n */\n copy(other) {\n this.x = other.x;\n this.y = other.y;\n return this;\n }\n /**\n * 克隆当前向量\n * @returns 新的向量实例\n */\n clone() {\n return new Vector2(this.x, this.y);\n }\n /**\n * 向量加法\n * @param other 另一个向量\n * @returns 当前向量实例(链式调用)\n */\n add(other) {\n this.x += other.x;\n this.y += other.y;\n return this;\n }\n /**\n * 向量减法\n * @param other 另一个向量\n * @returns 当前向量实例(链式调用)\n */\n subtract(other) {\n this.x -= other.x;\n this.y -= other.y;\n return this;\n }\n /**\n * 向量数乘\n * @param scalar 标量\n * @returns 当前向量实例(链式调用)\n */\n multiply(scalar) {\n this.x *= scalar;\n this.y *= scalar;\n return this;\n }\n /**\n * 向量数除\n * @param scalar 标量\n * @returns 当前向量实例(链式调用)\n */\n divide(scalar) {\n if (scalar === 0) {\n throw new Error('不能除以零');\n }\n this.x /= scalar;\n this.y /= scalar;\n return this;\n }\n /**\n * 向量取反\n * @returns 当前向量实例(链式调用)\n */\n negate() {\n this.x = -this.x;\n this.y = -this.y;\n return this;\n }\n // 向量运算\n /**\n * 计算与另一个向量的点积\n * @param other 另一个向量\n * @returns 点积值\n */\n dot(other) {\n return this.x * other.x + this.y * other.y;\n }\n /**\n * 计算与另一个向量的叉积(2D中返回标量)\n * @param other 另一个向量\n * @returns 叉积值\n */\n cross(other) {\n return this.x * other.y - this.y * other.x;\n }\n /**\n * 向量归一化(转换为单位向量)\n * @returns 当前向量实例(链式调用)\n */\n normalize() {\n const len = this.length;\n if (len === 0) {\n return this;\n }\n return this.divide(len);\n }\n /**\n * 获取归一化后的向量(不修改原向量)\n * @returns 新的单位向量\n */\n normalized() {\n return this.clone().normalize();\n }\n // 几何运算\n /**\n * 计算到另一个向量的距离\n * @param other 另一个向量\n * @returns 距离值\n */\n distanceTo(other) {\n const dx = this.x - other.x;\n const dy = this.y - other.y;\n return Math.sqrt(dx * dx + dy * dy);\n }\n /**\n * 计算到另一个向量的距离平方\n * @param other 另一个向量\n * @returns 距离平方值\n */\n distanceToSquared(other) {\n const dx = this.x - other.x;\n const dy = this.y - other.y;\n return dx * dx + dy * dy;\n }\n /**\n * 计算与另一个向量的夹角(弧度)\n * @param other 另一个向量\n * @returns 夹角(0到π)\n */\n angleTo(other) {\n const dot = this.dot(other);\n const lenProduct = this.length * other.length;\n if (lenProduct === 0)\n return 0;\n return Math.acos(Math.max(-1, Math.min(1, dot / lenProduct)));\n }\n /**\n * 计算向量在另一个向量上的投影\n * @param onto 投影目标向量\n * @returns 新的投影向量\n */\n projectOnto(onto) {\n const dot = this.dot(onto);\n const lenSq = onto.lengthSquared;\n if (lenSq === 0)\n return new Vector2();\n return onto.clone().multiply(dot / lenSq);\n }\n /**\n * 计算向量在另一个向量上的投影长度\n * @param onto 投影目标向量\n * @returns 投影长度(带符号)\n */\n projectOntoLength(onto) {\n const len = onto.length;\n if (len === 0)\n return 0;\n return this.dot(onto) / len;\n }\n /**\n * 获取垂直向量(顺时针旋转90度)\n * Get perpendicular vector (clockwise 90 degrees)\n * @returns 新的垂直向量\n */\n perpendicular() {\n // Clockwise 90° rotation: (x, y) -> (y, -x)\n // 顺时针旋转 90°\n return new Vector2(this.y, -this.x);\n }\n // 变换操作\n /**\n * 向量旋转(顺时针为正)\n * Rotate vector (clockwise positive)\n *\n * 使用左手坐标系约定:正角度 = 顺时针旋转\n * Uses left-hand coordinate system: positive angle = clockwise\n *\n * @param angle 旋转角度(弧度)\n * @returns 当前向量实例(链式调用)\n */\n rotate(angle) {\n const cos = Math.cos(angle);\n const sin = Math.sin(angle);\n // Clockwise rotation: x' = x*cos + y*sin, y' = -x*sin + y*cos\n // 顺时针旋转公式\n const x = this.x * cos + this.y * sin;\n const y = -this.x * sin + this.y * cos;\n this.x = x;\n this.y = y;\n return this;\n }\n /**\n * 获取旋转后的向量(不修改原向量)\n * @param angle 旋转角度(弧度)\n * @returns 新的旋转后向量\n */\n rotated(angle) {\n return this.clone().rotate(angle);\n }\n /**\n * 围绕一个点旋转\n * @param center 旋转中心点\n * @param angle 旋转角度(弧度)\n * @returns 当前向量实例(链式调用)\n */\n rotateAround(center, angle) {\n return this.subtract(center).rotate(angle).add(center);\n }\n /**\n * 反射向量(关于法线)\n * @param normal 法线向量(应为单位向量)\n * @returns 当前向量实例(链式调用)\n */\n reflect(normal) {\n const dot = this.dot(normal);\n this.x -= 2 * dot * normal.x;\n this.y -= 2 * dot * normal.y;\n return this;\n }\n /**\n * 获取反射后的向量(不修改原向量)\n * @param normal 法线向量(应为单位向量)\n * @returns 新的反射向量\n */\n reflected(normal) {\n return this.clone().reflect(normal);\n }\n // 插值和限制\n /**\n * 线性插值\n * @param target 目标向量\n * @param t 插值参数(0到1)\n * @returns 当前向量实例(链式调用)\n */\n lerp(target, t) {\n this.x += (target.x - this.x) * t;\n this.y += (target.y - this.y) * t;\n return this;\n }\n /**\n * 限制向量长度\n * @param maxLength 最大长度\n * @returns 当前向量实例(链式调用)\n */\n clampLength(maxLength) {\n const lenSq = this.lengthSquared;\n if (lenSq > maxLength * maxLength) {\n return this.normalize().multiply(maxLength);\n }\n return this;\n }\n /**\n * 限制向量分量\n * @param min 最小值向量\n * @param max 最大值向量\n * @returns 当前向量实例(链式调用)\n */\n clamp(min, max) {\n this.x = Math.max(min.x, Math.min(max.x, this.x));\n this.y = Math.max(min.y, Math.min(max.y, this.y));\n return this;\n }\n // 比较操作\n /**\n * 检查两个向量是否相等\n * @param other 另一个向量\n * @param epsilon 容差,默认为Number.EPSILON\n * @returns 是否相等\n */\n equals(other, epsilon = Number.EPSILON) {\n return Math.abs(this.x - other.x) < epsilon &&\n Math.abs(this.y - other.y) < epsilon;\n }\n /**\n * 检查两个向量是否完全相等\n * @param other 另一个向量\n * @returns 是否完全相等\n */\n exactEquals(other) {\n return this.x === other.x && this.y === other.y;\n }\n // 静态方法\n /**\n * @zh 向量加法(静态方法)\n * @en Vector addition (static method)\n * @param a - @zh 向量a @en Vector a\n * @param b - @zh 向量b @en Vector b\n * @returns @zh 新的结果向量 @en New result vector\n */\n static add(a, b) {\n return new Vector2(a.x + b.x, a.y + b.y);\n }\n /**\n * @zh 向量减法(静态方法)\n * @en Vector subtraction (static method)\n * @param a - @zh 向量a @en Vector a\n * @param b - @zh 向量b @en Vector b\n * @returns @zh 新的结果向量 @en New result vector\n */\n static subtract(a, b) {\n return new Vector2(a.x - b.x, a.y - b.y);\n }\n /**\n * @zh 向量数乘(静态方法)\n * @en Scalar multiplication (static method)\n * @param vector - @zh 向量 @en Vector\n * @param scalar - @zh 标量 @en Scalar\n * @returns @zh 新的结果向量 @en New result vector\n */\n static multiply(vector, scalar) {\n return new Vector2(vector.x * scalar, vector.y * scalar);\n }\n /**\n * @zh 向量点积(静态方法)\n * @en Dot product (static method)\n * @param a - @zh 向量a @en Vector a\n * @param b - @zh 向量b @en Vector b\n * @returns @zh 点积值 @en Dot product value\n */\n static dot(a, b) {\n return a.x * b.x + a.y * b.y;\n }\n /**\n * @zh 向量叉积(静态方法,返回标量)\n * @en Cross product (static method, returns scalar)\n * @param a - @zh 向量a @en Vector a\n * @param b - @zh 向量b @en Vector b\n * @returns @zh 叉积值(z分量)@en Cross product value (z component)\n */\n static cross(a, b) {\n return a.x * b.y - a.y * b.x;\n }\n /**\n * @zh 行列式(等同于叉积)\n * @en Determinant (same as cross product)\n * @param a - @zh 向量a @en Vector a\n * @param b - @zh 向量b @en Vector b\n * @returns @zh 行列式值 @en Determinant value\n */\n static det(a, b) {\n return a.x * b.y - a.y * b.x;\n }\n /**\n * @zh 计算向量长度的平方(静态方法)\n * @en Calculate squared length of vector (static method)\n * @param v - @zh 向量 @en Vector\n * @returns @zh 长度的平方 @en Squared length\n */\n static lengthSq(v) {\n return v.x * v.x + v.y * v.y;\n }\n /**\n * @zh 计算向量长度(静态方法)\n * @en Calculate length of vector (static method)\n * @param v - @zh 向量 @en Vector\n * @returns @zh 长度 @en Length\n */\n static len(v) {\n return Math.sqrt(v.x * v.x + v.y * v.y);\n }\n /**\n * @zh 归一化向量(静态方法)\n * @en Normalize vector (static method)\n * @param v - @zh 向量 @en Vector\n * @returns @zh 单位向量 @en Unit vector\n */\n static normalize(v) {\n const len = Math.sqrt(v.x * v.x + v.y * v.y);\n if (len < Number.EPSILON) {\n return new Vector2(0, 0);\n }\n return new Vector2(v.x / len, v.y / len);\n }\n /**\n * @zh 计算两点间距离(静态方法)\n * @en Calculate distance between two points (static method)\n * @param a - @zh 点a @en Point a\n * @param b - @zh 点b @en Point b\n * @returns @zh 距离值 @en Distance value\n */\n static distance(a, b) {\n const dx = a.x - b.x;\n const dy = a.y - b.y;\n return Math.sqrt(dx * dx + dy * dy);\n }\n /**\n * @zh 计算两点间距离的平方(静态方法)\n * @en Calculate squared distance between two points (static method)\n * @param a - @zh 点a @en Point a\n * @param b - @zh 点b @en Point b\n * @returns @zh 距离的平方 @en Squared distance\n */\n static distanceSq(a, b) {\n const dx = a.x - b.x;\n const dy = a.y - b.y;\n return dx * dx + dy * dy;\n }\n /**\n * @zh 线性插值(静态方法)\n * @en Linear interpolation (static method)\n * @param a - @zh 起始向量 @en Start vector\n * @param b - @zh 目标向量 @en Target vector\n * @param t - @zh 插值参数(0到1)@en Interpolation parameter (0 to 1)\n * @returns @zh 新的插值结果向量 @en New interpolated result vector\n */\n static lerp(a, b, t) {\n return new Vector2(a.x + (b.x - a.x) * t, a.y + (b.y - a.y) * t);\n }\n /**\n * @zh 从角度创建单位向量(静态方法)\n * @en Create unit vector from angle (static method)\n * @param angle - @zh 角度(弧度)@en Angle (radians)\n * @returns @zh 新的单位向量 @en New unit vector\n */\n static fromAngle(angle) {\n return new Vector2(Math.cos(angle), Math.sin(angle));\n }\n /**\n * @zh 从极坐标创建向量(静态方法)\n * @en Create vector from polar coordinates (static method)\n * @param len - @zh 长度 @en Length\n * @param angle - @zh 角度(弧度)@en Angle (radians)\n * @returns @zh 新的向量 @en New vector\n */\n static fromPolar(len, angle) {\n return new Vector2(len * Math.cos(angle), len * Math.sin(angle));\n }\n /**\n * @zh 获取两个向量中的最小分量向量(静态方法)\n * @en Get minimum component vector of two vectors (static method)\n * @param a - @zh 向量a @en Vector a\n * @param b - @zh 向量b @en Vector b\n * @returns @zh 新的最小分量向量 @en New minimum component vector\n */\n static min(a, b) {\n return new Vector2(Math.min(a.x, b.x), Math.min(a.y, b.y));\n }\n /**\n * @zh 获取两个向量中的最大分量向量(静态方法)\n * @en Get maximum component vector of two vectors (static method)\n * @param a - @zh 向量a @en Vector a\n * @param b - @zh 向量b @en Vector b\n * @returns @zh 新的最大分量向量 @en New maximum component vector\n */\n static max(a, b) {\n return new Vector2(Math.max(a.x, b.x), Math.max(a.y, b.y));\n }\n /**\n * @zh 获取左垂直向量(逆时针旋转90度)(静态方法)\n * @en Get left perpendicular vector (rotate 90 degrees counter-clockwise) (static method)\n * @param v - @zh 向量 @en Vector\n * @returns @zh 新的垂直向量 @en New perpendicular vector\n */\n static perpLeft(v) {\n return new Vector2(-v.y, v.x);\n }\n /**\n * @zh 获取右垂直向量(顺时针旋转90度)(静态方法)\n * @en Get right perpendicular vector (rotate 90 degrees clockwise) (static method)\n * @param v - @zh 向量 @en Vector\n * @returns @zh 新的垂直向量 @en New perpendicular vector\n */\n static perpRight(v) {\n return new Vector2(v.y, -v.x);\n }\n // 字符串转换\n /**\n * 转换为字符串\n * @returns 字符串表示\n */\n toString() {\n return `Vector2(${this.x.toFixed(3)}, ${this.y.toFixed(3)})`;\n }\n /**\n * 转换为数组\n * @returns [x, y] 数组\n */\n toArray() {\n return [this.x, this.y];\n }\n /**\n * 转换为普通对象\n * @returns {x, y} 对象\n */\n toObject() {\n return { x: this.x, y: this.y };\n }\n}\n// 静态常量\n/** 零向量 (0, 0) */\nVector2.ZERO = new Vector2(0, 0);\n/** 单位向量 (1, 1) */\nVector2.ONE = new Vector2(1, 1);\n/** 右方向向量 (1, 0) */\nVector2.RIGHT = new Vector2(1, 0);\n/** 左方向向量 (-1, 0) */\nVector2.LEFT = new Vector2(-1, 0);\n/** 上方向向量 (0, 1) */\nVector2.UP = new Vector2(0, 1);\n/** 下方向向量 (0, -1) */\nVector2.DOWN = new Vector2(0, -1);\n//# sourceMappingURL=Vector2.js.map","/**\n * 3D向量类\n *\n * 提供完整的3D向量运算功能,包括:\n * - 基础运算(加减乘除)\n * - 向量运算(点积、叉积、归一化)\n * - 几何运算(距离、角度、投影)\n * - 变换操作(旋转、反射、插值)\n */\nexport class Vector3 {\n /**\n * 创建3D向量\n * @param x X分量,默认为0\n * @param y Y分量,默认为0\n * @param z Z分量,默认为0\n */\n constructor(x = 0, y = 0, z = 0) {\n this.x = x;\n this.y = y;\n this.z = z;\n }\n // 基础属性\n /**\n * 获取向量长度(模)\n */\n get length() {\n return Math.sqrt(this.x * this.x + this.y * this.y + this.z * this.z);\n }\n /**\n * 获取向量长度的平方\n */\n get lengthSquared() {\n return this.x * this.x + this.y * this.y + this.z * this.z;\n }\n /**\n * 检查是否为零向量\n */\n get isZero() {\n return this.x === 0 && this.y === 0 && this.z === 0;\n }\n /**\n * 检查是否为单位向量\n */\n get isUnit() {\n const lenSq = this.lengthSquared;\n return Math.abs(lenSq - 1) < Number.EPSILON;\n }\n // 基础运算\n /**\n * 设置向量分量\n * @param x X分量\n * @param y Y分量\n * @param z Z分量\n * @returns 当前向量实例(链式调用)\n */\n set(x, y, z) {\n this.x = x;\n this.y = y;\n this.z = z;\n return this;\n }\n /**\n * 复制另一个向量的值\n * @param other 源向量\n * @returns 当前向量实例(链式调用)\n */\n copy(other) {\n this.x = other.x;\n this.y = other.y;\n this.z = other.z;\n return this;\n }\n /**\n * 克隆当前向量\n * @returns 新的向量实例\n */\n clone() {\n return new Vector3(this.x, this.y, this.z);\n }\n /**\n * 向量加法\n * @param other 另一个向量\n * @returns 当前向量实例(链式调用)\n */\n add(other) {\n this.x += other.x;\n this.y += other.y;\n this.z += other.z;\n return this;\n }\n /**\n * 向量减法\n * @param other 另一个向量\n * @returns 当前向量实例(链式调用)\n */\n subtract(other) {\n this.x -= other.x;\n this.y -= other.y;\n this.z -= other.z;\n return this;\n }\n /**\n * 向量数乘\n * @param scalar 标量\n * @returns 当前向量实例(链式调用)\n */\n multiply(scalar) {\n this.x *= scalar;\n this.y *= scalar;\n this.z *= scalar;\n return this;\n }\n /**\n * 向量数除\n * @param scalar 标量\n * @returns 当前向量实例(链式调用)\n */\n divide(scalar) {\n if (scalar === 0) {\n throw new Error('不能除以零');\n }\n this.x /= scalar;\n this.y /= scalar;\n this.z /= scalar;\n return this;\n }\n /**\n * 向量取反\n * @returns 当前向量实例(链式调用)\n */\n negate() {\n this.x = -this.x;\n this.y = -this.y;\n this.z = -this.z;\n return this;\n }\n // 向量运算\n /**\n * 计算与另一个向量的点积\n * @param other 另一个向量\n * @returns 点积值\n */\n dot(other) {\n return this.x * other.x + this.y * other.y + this.z * other.z;\n }\n /**\n * 计算与另一个向量的叉积\n * @param other 另一个向量\n * @returns 新的叉积向量\n */\n cross(other) {\n return new Vector3(this.y * other.z - this.z * other.y, this.z * other.x - this.x * other.z, this.x * other.y - this.y * other.x);\n }\n /**\n * 向量归一化(转换为单位向量)\n * @returns 当前向量实例(链式调用)\n */\n normalize() {\n const len = this.length;\n if (len === 0) {\n return this;\n }\n return this.divide(len);\n }\n /**\n * 获取归一化后的向量(不修改原向量)\n * @returns 新的单位向量\n */\n normalized() {\n return this.clone().normalize();\n }\n // 几何运算\n /**\n * 计算到另一个向量的距离\n * @param other 另一个向量\n * @returns 距离值\n */\n distanceTo(other) {\n const dx = this.x - other.x;\n const dy = this.y - other.y;\n const dz = this.z - other.z;\n return Math.sqrt(dx * dx + dy * dy + dz * dz);\n }\n /**\n * 计算到另一个向量的距离平方\n * @param other 另一个向量\n * @returns 距离平方值\n */\n distanceToSquared(other) {\n const dx = this.x - other.x;\n const dy = this.y - other.y;\n const dz = this.z - other.z;\n return dx * dx + dy * dy + dz * dz;\n }\n /**\n * 计算与另一个向量的夹角(弧度)\n * @param other 另一个向量\n * @returns 夹角(0到π)\n */\n angleTo(other) {\n const dot = this.dot(other);\n const lenProduct = this.length * other.length;\n if (lenProduct === 0)\n return 0;\n return Math.acos(Math.max(-1, Math.min(1, dot / lenProduct)));\n }\n /**\n * 计算向量在另一个向量上的投影\n * @param onto 投影目标向量\n * @returns 新的投影向量\n */\n projectOnto(onto) {\n const dot = this.dot(onto);\n const lenSq = onto.lengthSquared;\n if (lenSq === 0)\n return new Vector3();\n return onto.clone().multiply(dot / lenSq);\n }\n // 插值和限制\n /**\n * 线性插值\n * @param target 目标向量\n * @param t 插值参数(0到1)\n * @returns 当前向量实例(链式调用)\n */\n lerp(target, t) {\n this.x += (target.x - this.x) * t;\n this.y += (target.y - this.y) * t;\n this.z += (target.z - this.z) * t;\n return this;\n }\n /**\n * 限制向量长度\n * @param maxLength 最大长度\n * @returns 当前向量实例(链式调用)\n */\n clampLength(maxLength) {\n const lenSq = this.lengthSquared;\n if (lenSq > maxLength * maxLength) {\n return this.normalize().multiply(maxLength);\n }\n return this;\n }\n // 比较操作\n /**\n * 检查两个向量是否相等\n * @param other 另一个向量\n * @param epsilon 容差,默认为Number.EPSILON\n * @returns 是否相等\n */\n equals(other, epsilon = Number.EPSILON) {\n return Math.abs(this.x - other.x) < epsilon &&\n Math.abs(this.y - other.y) < epsilon &&\n Math.abs(this.z - other.z) < epsilon;\n }\n /**\n * 检查两个向量是否完全相等\n * @param other 另一个向量\n * @returns 是否完全相等\n */\n exactEquals(other) {\n return this.x === other.x && this.y === other.y && this.z === other.z;\n }\n // 静态方法\n /**\n * 向量加法(静态方法)\n * @param a 向量a\n * @param b 向量b\n * @returns 新的结果向量\n */\n static add(a, b) {\n return new Vector3(a.x + b.x, a.y + b.y, a.z + b.z);\n }\n /**\n * 向量减法(静态方法)\n * @param a 向量a\n * @param b 向量b\n * @returns 新的结果向量\n */\n static subtract(a, b) {\n return new Vector3(a.x - b.x, a.y - b.y, a.z - b.z);\n }\n /**\n * 向量数乘(静态方法)\n * @param vector 向量\n * @param scalar 标量\n * @returns 新的结果向量\n */\n static multiply(vector, scalar) {\n return new Vector3(vector.x * scalar, vector.y * scalar, vector.z * scalar);\n }\n /**\n * 向量点积(静态方法)\n * @param a 向量a\n * @param b 向量b\n * @returns 点积值\n */\n static dot(a, b) {\n return a.x * b.x + a.y * b.y + a.z * b.z;\n }\n /**\n * 向量叉积(静态方法)\n * @param a 向量a\n * @param b 向量b\n * @returns 新的叉积向量\n */\n static cross(a, b) {\n return new Vector3(a.y * b.z - a.z * b.y, a.z * b.x - a.x * b.z, a.x * b.y - a.y * b.x);\n }\n /**\n * 计算两点间距离(静态方法)\n * @param a 点a\n * @param b 点b\n * @returns 距离值\n */\n static distance(a, b) {\n const dx = a.x - b.x;\n const dy = a.y - b.y;\n const dz = a.z - b.z;\n return Math.sqrt(dx * dx + dy * dy + dz * dz);\n }\n /**\n * 线性插值(静态方法)\n * @param a 起始向量\n * @param b 目标向量\n * @param t 插值参数(0到1)\n * @returns 新的插值结果向量\n */\n static lerp(a, b, t) {\n return new Vector3(a.x + (b.x - a.x) * t, a.y + (b.y - a.y) * t, a.z + (b.z - a.z) * t);\n }\n // 字符串转换\n /**\n * 转换为字符串\n * @returns 字符串表示\n */\n toString() {\n return `Vector3(${this.x.toFixed(3)}, ${this.y.toFixed(3)}, ${this.z.toFixed(3)})`;\n }\n /**\n * 转换为数组\n * @returns [x, y, z] 数组\n */\n toArray() {\n return [this.x, this.y, this.z];\n }\n /**\n * 转换为普通对象\n * @returns {x, y, z} 对象\n */\n toObject() {\n return { x: this.x, y: this.y, z: this.z };\n }\n}\n// 静态常量\n/** 零向量 (0, 0, 0) */\nVector3.ZERO = new Vector3(0, 0, 0);\n/** 单位向量 (1, 1, 1) */\nVector3.ONE = new Vector3(1, 1, 1);\n/** 右方向向量 (1, 0, 0) */\nVector3.RIGHT = new Vector3(1, 0, 0);\n/** 左方向向量 (-1, 0, 0) */\nVector3.LEFT = new Vector3(-1, 0, 0);\n/** 上方向向量 (0, 1, 0) */\nVector3.UP = new Vector3(0, 1, 0);\n/** 下方向向量 (0, -1, 0) */\nVector3.DOWN = new Vector3(0, -1, 0);\n/** 前方向向量 (0, 0, 1) */\nVector3.FORWARD = new Vector3(0, 0, 1);\n/** 后方向向量 (0, 0, -1) */\nVector3.BACK = new Vector3(0, 0, -1);\n//# sourceMappingURL=Vector3.js.map","import { Vector2 } from './Vector2';\n/**\n * 3x3变换矩阵类\n * 3x3 Transform Matrix Class\n *\n * 用于2D变换(平移、旋转、缩放)的3x3矩阵\n * 使用左手坐标系(顺时针正旋转)\n *\n * 矩阵布局(顺时针旋转):\n * [m00, m01, m02] [scaleX * cos, scaleY * sin, translateX]\n * [m10, m11, m12] = [-scaleX * sin, scaleY * cos, translateY]\n * [m20, m21, m22] [0, 0, 1]\n */\nexport class Matrix3 {\n /**\n * 创建3x3矩阵\n * @param elements 矩阵元素数组(可选),默认为单位矩阵\n */\n constructor(elements) {\n this.elements = new Float32Array(9);\n if (elements) {\n this.elements.set(elements);\n }\n else {\n this.identity();\n }\n }\n // 元素访问器\n /** 获取矩阵元素 */\n get(row, col) {\n return this.elements[row * 3 + col];\n }\n /** 设置矩阵元素 */\n set(row, col, value) {\n this.elements[row * 3 + col] = value;\n return this;\n }\n // 快速访问器\n get m00() { return this.elements[0]; }\n set m00(value) { this.elements[0] = value; }\n get m01() { return this.elements[1]; }\n set m01(value) { this.elements[1] = value; }\n get m02() { return this.elements[2]; }\n set m02(value) { this.elements[2] = value; }\n get m10() { return this.elements[3]; }\n set m10(value) { this.elements[3] = value; }\n get m11() { return this.elements[4]; }\n set m11(value) { this.elements[4] = value; }\n get m12() { return this.elements[5]; }\n set m12(value) { this.elements[5] = value; }\n get m20() { return this.elements[6]; }\n set m20(value) { this.elements[6] = value; }\n get m21() { return this.elements[7]; }\n set m21(value) { this.elements[7] = value; }\n get m22() { return this.elements[8]; }\n set m22(value) { this.elements[8] = value; }\n // 基础操作\n /**\n * 设置矩阵为单位矩阵\n * @returns 当前矩阵实例(链式调用)\n */\n identity() {\n this.elements.set([\n 1, 0, 0,\n 0, 1, 0,\n 0, 0, 1\n ]);\n return this;\n }\n /**\n * 设置矩阵为零矩阵\n * @returns 当前矩阵实例(链式调用)\n */\n zero() {\n this.elements.fill(0);\n return this;\n }\n /**\n * 复制另一个矩阵的值\n * @param other 源矩阵\n * @returns 当前矩阵实例(链式调用)\n */\n copy(other) {\n this.elements.set(other.elements);\n return this;\n }\n /**\n * 克隆当前矩阵\n * @returns 新的矩阵实例\n */\n clone() {\n return new Matrix3(this.elements);\n }\n /**\n * 从数组设置矩阵元素\n * @param elements 矩阵元素数组\n * @returns 当前矩阵实例(链式调用)\n */\n fromArray(elements) {\n this.elements.set(elements);\n return this;\n }\n // 矩阵运算\n /**\n * 矩阵加法\n * @param other 另一个矩阵\n * @returns 当前矩阵实例(链式调用)\n */\n add(other) {\n for (let i = 0; i < 9; i++) {\n this.elements[i] += other.elements[i];\n }\n return this;\n }\n /**\n * 矩阵减法\n * @param other 另一个矩阵\n * @returns 当前矩阵实例(链式调用)\n */\n subtract(other) {\n for (let i = 0; i < 9; i++) {\n this.elements[i] -= other.elements[i];\n }\n return this;\n }\n /**\n * 矩阵标量乘法\n * @param scalar 标量\n * @returns 当前矩阵实例(链式调用)\n */\n multiplyScalar(scalar) {\n for (let i = 0; i < 9; i++) {\n this.elements[i] *= scalar;\n }\n return this;\n }\n /**\n * 矩阵乘法\n * @param other 另一个矩阵\n * @returns 当前矩阵实例(链式调用)\n */\n multiply(other) {\n const a = this.elements;\n const b = other.elements;\n const result = new Float32Array(9);\n result[0] = a[0] * b[0] + a[1] * b[3] + a[2] * b[6];\n result[1] = a[0] * b[1] + a[1] * b[4] + a[2] * b[7];\n result[2] = a[0] * b[2] + a[1] * b[5] + a[2] * b[8];\n result[3] = a[3] * b[0] + a[4] * b[3] + a[5] * b[6];\n result[4] = a[3] * b[1] + a[4] * b[4] + a[5] * b[7];\n result[5] = a[3] * b[2] + a[4] * b[5] + a[5] * b[8];\n result[6] = a[6] * b[0] + a[7] * b[3] + a[8] * b[6];\n result[7] = a[6] * b[1] + a[7] * b[4] + a[8] * b[7];\n result[8] = a[6] * b[2] + a[7] * b[5] + a[8] * b[8];\n this.elements.set(result);\n return this;\n }\n /**\n * 左乘另一个矩阵(other * this)\n * @param other 左乘矩阵\n * @returns 当前矩阵实例(链式调用)\n */\n premultiply(other) {\n const a = other.elements;\n const b = this.elements;\n const result = new Float32Array(9);\n result[0] = a[0] * b[0] + a[1] * b[3] + a[2] * b[6];\n result[1] = a[0] * b[1] + a[1] * b[4] + a[2] * b[7];\n result[2] = a[0] * b[2] + a[1] * b[5] + a[2] * b[8];\n result[3] = a[3] * b[0] + a[4] * b[3] + a[5] * b[6];\n result[4] = a[3] * b[1] + a[4] * b[4] + a[5] * b[7];\n result[5] = a[3] * b[2] + a[4] * b[5] + a[5] * b[8];\n result[6] = a[6] * b[0] + a[7] * b[3] + a[8] * b[6];\n result[7] = a[6] * b[1] + a[7] * b[4] + a[8] * b[7];\n result[8] = a[6] * b[2] + a[7] * b[5] + a[8] * b[8];\n this.elements.set(result);\n return this;\n }\n // 变换操作\n /**\n * 设置为平移矩阵\n * @param x X方向平移\n * @param y Y方向平移\n * @returns 当前矩阵实例(链式调用)\n */\n makeTranslation(x, y) {\n this.elements.set([\n 1, 0, x,\n 0, 1, y,\n 0, 0, 1\n ]);\n return this;\n }\n /**\n * 设置为旋转矩阵(顺时针为正)\n * Set as rotation matrix (clockwise positive)\n *\n * 使用左手坐标系约定:正角度 = 顺时针旋转\n * Uses left-hand coordinate system: positive angle = clockwise\n *\n * @param angle 旋转角度(弧度)\n * @returns 当前矩阵实例(链式调用)\n */\n makeRotation(angle) {\n const cos = Math.cos(angle);\n const sin = Math.sin(angle);\n // Clockwise rotation matrix\n // 顺时针旋转矩阵\n this.elements.set([\n cos, sin, 0,\n -sin, cos, 0,\n 0, 0, 1\n ]);\n return this;\n }\n /**\n * 设置为缩放矩阵\n * @param scaleX X方向缩放\n * @param scaleY Y方向缩放\n * @returns 当前矩阵实例(链式调用)\n */\n makeScale(scaleX, scaleY) {\n this.elements.set([\n scaleX, 0, 0,\n 0, scaleY, 0,\n 0, 0, 1\n ]);\n return this;\n }\n /**\n * 复合平移\n * @param x X方向平移\n * @param y Y方向平移\n * @returns 当前矩阵实例(链式调用)\n */\n translate(x, y) {\n this.m02 += this.m00 * x + this.m01 * y;\n this.m12 += this.m10 * x + this.m11 * y;\n return this;\n }\n /**\n * 复合旋转(顺时针为正)\n * Composite rotation (clockwise positive)\n *\n * 使用左手坐标系约定:正角度 = 顺时针旋转\n * Uses left-hand coordinate system: positive angle = clockwise\n *\n * @param angle 旋转角度(弧度)\n * @returns 当前矩阵实例(链式调用)\n */\n rotate(angle) {\n const cos = Math.cos(angle);\n const sin = Math.sin(angle);\n // Clockwise rotation: multiply by [cos, sin; -sin, cos]\n // 顺时针旋转\n const m00 = this.m00 * cos - this.m01 * sin;\n const m01 = this.m00 * sin + this.m01 * cos;\n const m10 = this.m10 * cos - this.m11 * sin;\n const m11 = this.m10 * sin + this.m11 * cos;\n this.m00 = m00;\n this.m01 = m01;\n this.m10 = m10;\n this.m11 = m11;\n return this;\n }\n /**\n * 复合缩放\n * @param scaleX X方向缩放\n * @param scaleY Y方向缩放\n * @returns 当前矩阵实例(链式调用)\n */\n scale(scaleX, scaleY) {\n this.m00 *= scaleX;\n this.m01 *= scaleY;\n this.m10 *= scaleX;\n this.m11 *= scaleY;\n return this;\n }\n // 矩阵变换\n /**\n * 矩阵转置\n * @returns 当前矩阵实例(链式调用)\n */\n transpose() {\n const elements = this.elements;\n let tmp;\n tmp = elements[1];\n elements[1] = elements[3];\n elements[3] = tmp;\n tmp = elements[2];\n elements[2] = elements[6];\n elements[6] = tmp;\n tmp = elements[5];\n elements[5] = elements[7];\n elements[7] = tmp;\n return this;\n }\n /**\n * 计算矩阵行列式\n * @returns 行列式值\n */\n determinant() {\n const e = this.elements;\n return e[0] * (e[4] * e[8] - e[5] * e[7]) -\n e[1] * (e[3] * e[8] - e[5] * e[6]) +\n e[2] * (e[3] * e[7] - e[4] * e[6]);\n }\n /**\n * 矩阵求逆\n * @returns 当前矩阵实例(链式调用),如果矩阵不可逆则保持不变\n */\n invert() {\n const e = this.elements;\n const det = this.determinant();\n if (Math.abs(det) < Number.EPSILON) {\n console.warn('Matrix3: 矩阵不可逆');\n return this;\n }\n const invDet = 1 / det;\n const result = new Float32Array(9);\n result[0] = (e[4] * e[8] - e[5] * e[7]) * invDet;\n result[1] = (e[2] * e[7] - e[1] * e[8]) * invDet;\n result[2] = (e[1] * e[5] - e[2] * e[4]) * invDet;\n result[3] = (e[5] * e[6] - e[3] * e[8]) * invDet;\n result[4] = (e[0] * e[8] - e[2] * e[6]) * invDet;\n result[5] = (e[2] * e[3] - e[0] * e[5]) * invDet;\n result[6] = (e[3] * e[7] - e[4] * e[6]) * invDet;\n result[7] = (e[1] * e[6] - e[0] * e[7]) * invDet;\n result[8] = (e[0] * e[4] - e[1] * e[3]) * invDet;\n this.elements.set(result);\n return this;\n }\n // 向量变换\n /**\n * 变换向量(应用完整的3x3变换)\n * @param vector 向量\n * @returns 新的变换后的向量\n */\n transformVector(vector) {\n const x = vector.x;\n const y = vector.y;\n const w = this.m20 * x + this.m21 * y + this.m22;\n return new Vector2((this.m00 * x + this.m01 * y + this.m02) / w, (this.m10 * x + this.m11 * y + this.m12) / w);\n }\n /**\n * 变换向量(仅应用旋转和缩放,忽略平移)\n * @param vector 向量\n * @returns 新的变换后的向量\n */\n transformDirection(vector) {\n return new Vector2(this.m00 * vector.x + this.m01 * vector.y, this.m10 * vector.x + this.m11 * vector.y);\n }\n /**\n * 批量变换向量数组\n * @param vectors 向量数组\n * @returns 变换后的向量数组\n */\n transformVectors(vectors) {\n return vectors.map((v) => this.transformVector(v));\n }\n // 属性提取\n /**\n * 获取平移分量\n * @returns 平移向量\n */\n getTranslation() {\n return new Vector2(this.m02, this.m12);\n }\n /**\n * 获取旋转角度(顺时针为正)\n * Get rotation angle (clockwise positive)\n * @returns 旋转角度(弧度)\n */\n getRotation() {\n // For clockwise rotation matrix [cos, sin; -sin, cos]\n // m00 = cos, m01 = sin, so atan2(m01, m00) = θ\n // 顺时针旋转矩阵:从 m01 和 m00 提取角度\n return Math.atan2(this.m01, this.m00);\n }\n /**\n * 获取缩放分量\n * @returns 缩放向量\n */\n getScale() {\n const scaleX = Math.sqrt(this.m00 * this.m00 + this.m10 * this.m10);\n const scaleY = Math.sqrt(this.m01 * this.m01 + this.m11 * this.m11);\n // 检查是否有反转\n const det = this.determinant();\n if (det < 0) {\n return new Vector2(-scaleX, scaleY);\n }\n return new Vector2(scaleX, scaleY);\n }\n /**\n * 分解变换矩阵为平移、旋转、缩放分量\n * @returns {translation, rotation, scale}\n */\n decompose() {\n return {\n translation: this.getTranslation(),\n rotation: this.getRotation(),\n scale: this.getScale()\n };\n }\n // 比较操作\n /**\n * 检查两个矩阵是否相等\n * @param other 另一个矩阵\n * @param epsilon 容差,默认为Number.EPSILON\n * @returns 是否相等\n */\n equals(other, epsilon = Number.EPSILON) {\n for (let i = 0; i < 9; i++) {\n if (Math.abs(this.elements[i] - other.elements[i]) >= epsilon) {\n return false;\n }\n }\n return true;\n }\n /**\n * 检查两个矩阵是否完全相等\n * @param other 另一个矩阵\n * @returns 是否完全相等\n */\n exactEquals(other) {\n for (let i = 0; i < 9; i++) {\n if (this.elements[i] !== other.elements[i]) {\n return false;\n }\n }\n return true;\n }\n /**\n * 检查是否为单位矩阵\n * @param epsilon 容差,默认为Number.EPSILON\n * @returns 是否为单位矩阵\n */\n isIdentity(epsilon = Number.EPSILON) {\n return this.equals(Matrix3.IDENTITY, epsilon);\n }\n // 静态方法\n /**\n * 矩阵乘法(静态方法)\n * @param a 矩阵a\n * @param b 矩阵b\n * @returns 新的结果矩阵\n */\n static multiply(a, b) {\n return a.clone().multiply(b);\n }\n /**\n * 创建平移矩阵(静态方法)\n * @param x X方向平移\n * @param y Y方向平移\n * @returns 新的平移矩阵\n */\n static translation(x, y) {\n return new Matrix3().makeTranslation(x, y);\n }\n /**\n * 创建旋转矩阵(静态方法)\n * @param angle 旋转角度(弧度)\n * @returns 新的旋转矩阵\n */\n static rotation(angle) {\n return new Matrix3().makeRotation(angle);\n }\n /**\n * 创建缩放矩阵(静态方法)\n * @param scaleX X方向缩放\n * @param scaleY Y方向缩放\n * @returns 新的缩放矩阵\n */\n static scale(scaleX, scaleY) {\n return new Matrix3().makeScale(scaleX, scaleY);\n }\n /**\n * 创建TRS(平移-旋转-缩放)变换矩阵(顺时针为正)\n * Create TRS (Translate-Rotate-Scale) matrix (clockwise positive)\n *\n * 使用左手坐标系约定:正角度 = 顺时针旋转\n * Uses left-hand coordinate system: positive angle = clockwise\n *\n * @param translation 平移向量\n * @param rotation 旋转角度(弧度)\n * @param scale 缩放向量\n * @returns 新的TRS矩阵\n */\n static TRS(translation, rotation, scale) {\n const cos = Math.cos(rotation);\n const sin = Math.sin(rotation);\n // Clockwise rotation matrix with scale\n // 带缩放的顺时针旋转矩阵\n return new Matrix3([\n scale.x * cos, scale.y * sin, translation.x,\n -scale.x * sin, scale.y * cos, translation.y,\n 0, 0, 1\n ]);\n }\n // 字符串转换\n /**\n * 转换为字符串\n * @returns 字符串表示\n */\n toString() {\n const e = this.elements;\n return 'Matrix3(\\n' +\n ` ${e[0].toFixed(3)}, ${e[1].toFixed(3)}, ${e[2].toFixed(3)}\\n` +\n ` ${e[3].toFixed(3)}, ${e[4].toFixed(3)}, ${e[5].toFixed(3)}\\n` +\n ` ${e[6].toFixed(3)}, ${e[7].toFixed(3)}, ${e[8].toFixed(3)}\\n` +\n ')';\n }\n /**\n * 转换为数组\n * @returns 矩阵元素数组\n */\n toArray() {\n return Array.from(this.elements);\n }\n /**\n * 转换为CSS transform字符串\n * @returns CSS transform字符串\n */\n toCSSTransform() {\n const e = this.elements;\n return `matrix(${e[0]}, ${e[3]}, ${e[1]}, ${e[4]}, ${e[2]}, ${e[5]})`;\n }\n}\n// 静态常量\n/** 单位矩阵 */\nMatrix3.IDENTITY = new Matrix3([\n 1, 0, 0,\n 0, 1, 0,\n 0, 0, 1\n]);\n/** 零矩阵 */\nMatrix3.ZERO = new Matrix3([\n 0, 0, 0,\n 0, 0, 0,\n 0, 0, 0\n]);\n//# sourceMappingURL=Matrix3.js.map","import { Vector2 } from './Vector2';\n/**\n * 2D矩形类\n *\n * 表示一个轴对齐的矩形,提供矩形相关的几何运算功能:\n * - 矩形创建和属性获取\n * - 包含检测(点、矩形)\n * - 相交检测和计算\n * - 变换和操作\n */\nexport class Rectangle {\n /**\n * 创建矩形\n * @param x 左上角X坐标,默认为0\n * @param y 左上角Y坐标,默认为0\n * @param width 宽度,默认为0\n * @param height 高度,默认为0\n */\n constructor(x = 0, y = 0, width = 0, height = 0) {\n this.x = x;\n this.y = y;\n this.width = width;\n this.height = height;\n }\n // 属性获取\n /** 获取左边界 */\n get left() {\n return this.x;\n }\n /** 获取右边界 */\n get right() {\n return this.x + this.width;\n }\n /** 获取上边界 */\n get top() {\n return this.y;\n }\n /** 获取下边界 */\n get bottom() {\n return this.y + this.height;\n }\n /** 获取中心X坐标 */\n get centerX() {\n return this.x + this.width * 0.5;\n }\n /** 获取中心Y坐标 */\n get centerY() {\n return this.y + this.height * 0.5;\n }\n /** 获取中心点 */\n get center() {\n return new Vector2(this.centerX, this.centerY);\n }\n /** 获取左上角点 */\n get topLeft() {\n return new Vector2(this.x, this.y);\n }\n /** 获取右上角点 */\n get topRight() {\n return new Vector2(this.right, this.y);\n }\n /** 获取左下角点 */\n get bottomLeft() {\n return new Vector2(this.x, this.bottom);\n }\n /** 获取右下角点 */\n get bottomRight() {\n return new Vector2(this.right, this.bottom);\n }\n /** 获取面积 */\n get area() {\n return this.width * this.height;\n }\n /** 获取周长 */\n get perimeter() {\n return 2 * (this.width + this.height);\n }\n /** 检查是否为空矩形 */\n get isEmpty() {\n return this.width <= 0 || this.height <= 0;\n }\n /** 检查是否为正方形 */\n get isSquare() {\n return this.width === this.height && this.width > 0;\n }\n // 基础操作\n /**\n * 设置矩形属性\n * @param x 左上角X坐标\n * @param y 左上角Y坐标\n * @param width 宽度\n * @param height 高度\n * @returns 当前矩形实例(链式调用)\n */\n set(x, y, width, height) {\n this.x = x;\n this.y = y;\n this.width = width;\n this.height = height;\n return this;\n }\n /**\n * 复制另一个矩形的值\n * @param other 源矩形\n * @returns 当前矩形实例(链式调用)\n */\n copy(other) {\n this.x = other.x;\n this.y = other.y;\n this.width = other.width;\n this.height = other.height;\n return this;\n }\n /**\n * 克隆当前矩形\n * @returns 新的矩形实例\n */\n clone() {\n return new Rectangle(this.x, this.y, this.width, this.height);\n }\n /**\n * 设置矩形位置\n * @param x 新的X坐标\n * @param y 新的Y坐标\n * @returns 当前矩形实例(链式调用)\n */\n setPosition(x, y) {\n this.x = x;\n this.y = y;\n return this;\n }\n /**\n * 设置矩形大小\n * @param width 新的宽度\n * @param height 新的高度\n * @returns 当前矩形实例(链式调用)\n */\n setSize(width, height) {\n this.width = width;\n this.height = height;\n return this;\n }\n /**\n * 设置矩形中心点\n * @param centerX 中心X坐标\n * @param centerY 中心Y坐标\n * @returns 当前矩形实例(链式调用)\n */\n setCenter(centerX, centerY) {\n this.x = centerX - this.width * 0.5;\n this.y = centerY - this.height * 0.5;\n return this;\n }\n // 变换操作\n /**\n * 平移矩形\n * @param dx X方向偏移\n * @param dy Y方向偏移\n * @returns 当前矩形实例(链式调用)\n */\n translate(dx, dy) {\n this.x += dx;\n this.y += dy;\n return this;\n }\n /**\n * 缩放矩形(从中心缩放)\n * @param scaleX X方向缩放因子\n * @param scaleY Y方向缩放因子,默认等于scaleX\n * @returns 当前矩形实例(链式调用)\n */\n scale(scaleX, scaleY = scaleX) {\n const centerX = this.centerX;\n const centerY = this.centerY;\n this.width *= scaleX;\n this.height *= scaleY;\n return this.setCenter(centerX, centerY);\n }\n /**\n * 扩展矩形\n * @param amount 扩展量(正值扩大,负值缩小)\n * @returns 当前矩形实例(链式调用)\n */\n inflate(amount) {\n this.x -= amount;\n this.y -= amount;\n this.width += amount * 2;\n this.height += amount * 2;\n return this;\n }\n /**\n * 扩展矩形(分别指定水平和垂直方向)\n * @param horizontal 水平方向扩展量\n * @param vertical 垂直方向扩展量\n * @returns 当前矩形实例(链式调用)\n */\n inflateXY(horizontal, vertical) {\n this.x -= horizontal;\n this.y -= vertical;\n this.width += horizontal * 2;\n this.height += vertical * 2;\n return this;\n }\n // 包含检测\n /**\n * 检查是否包含指定点\n * @param point 点\n * @returns 是否包含\n */\n containsPoint(point) {\n return point.x >= this.x && point.x <= this.right &&\n point.y >= this.y && point.y <= this.bottom;\n }\n /**\n * 检查是否包含指定坐标\n * @param x X坐标\n * @param y Y坐标\n * @returns 是否包含\n */\n contains(x, y) {\n return x >= this.x && x <= this.right &&\n y >= this.y && y <= this.bottom;\n }\n /**\n * 检查是否完全包含另一个矩形\n * @param other 另一个矩形\n * @returns 是否完全包含\n */\n containsRect(other) {\n return this.x <= other.x && this.y <= other.y &&\n this.right >= other.right && this.bottom >= other.bottom;\n }\n // 相交检测\n /**\n * 检查是否与另一个矩形相交\n * @param other 另一个矩形\n * @returns 是否相交\n */\n intersects(other) {\n return this.x < other.right && this.right > other.x &&\n this.y < other.bottom && this.bottom > other.y;\n }\n /**\n * 计算与另一个矩形的相交矩形\n * @param other 另一个矩形\n * @returns 相交矩形,如果不相交返回空矩形\n */\n intersection(other) {\n if (!this.intersects(other)) {\n return Rectangle.EMPTY.clone();\n }\n const x = Math.max(this.x, other.x);\n const y = Math.max(this.y, other.y);\n const right = Math.min(this.right, other.right);\n const bottom = Math.min(this.bottom, other.bottom);\n return new Rectangle(x, y, right - x, bottom - y);\n }\n /**\n * 计算与另一个矩形的并集矩形\n * @param other 另一个矩形\n * @returns 并集矩形\n */\n union(other) {\n const x = Math.min(this.x, other.x);\n const y = Math.min(this.y, other.y);\n const right = Math.max(this.right, other.right);\n const bottom = Math.max(this.bottom, other.bottom);\n return new Rectangle(x, y, right - x, bottom - y);\n }\n /**\n * 计算相交面积\n * @param other 另一个矩形\n * @returns 相交面积\n */\n intersectionArea(other) {\n const intersection = this.intersection(other);\n return intersection.isEmpty ? 0 : intersection.area;\n }\n // 距离计算\n /**\n * 计算点到矩形的最短距离\n * @param point 点\n * @returns 最短距离\n */\n distanceToPoint(point) {\n const dx = Math.max(0, Math.max(this.x - point.x, point.x - this.right));\n const dy = Math.max(0, Math.max(this.y - point.y, point.y - this.bottom));\n return Math.sqrt(dx * dx + dy * dy);\n }\n /**\n * 计算两个矩形间的最短距离\n * @param other 另一个矩形\n * @returns 最短距离(相交时为0)\n */\n distanceToRect(other) {\n if (this.intersects(other)) {\n return 0;\n }\n const dx = Math.max(0, Math.max(this.x - other.right, other.x - this.right));\n const dy = Math.max(0, Math.max(this.y - other.bottom, other.y - this.bottom));\n return Math.sqrt(dx * dx + dy * dy);\n }\n /**\n * 获取矩形上距离指定点最近的点\n * @param point 指定点\n * @returns 最近点\n */\n closestPointTo(point) {\n return new Vector2(Math.max(this.x, Math.min(this.right, point.x)), Math.max(this.y, Math.min(this.bottom, point.y)));\n }\n // 比较操作\n /**\n * 检查两个矩形是否相等\n * @param other 另一个矩形\n * @param epsilon 容差,默认为Number.EPSILON\n * @returns 是否相等\n */\n equals(other, epsilon = Number.EPSILON) {\n return Math.abs(this.x - other.x) < epsilon &&\n Math.abs(this.y - other.y) < epsilon &&\n Math.abs(this.width - other.width) < epsilon &&\n Math.abs(this.height - other.height) < epsilon;\n }\n /**\n * 检查两个矩形是否完全相等\n * @param other 另一个矩形\n * @returns 是否完全相等\n */\n exactEquals(other) {\n return this.x === other.x && this.y === other.y &&\n this.width === other.width && this.height === other.height;\n }\n // 静态方法\n /**\n * 从中心点和大小创建矩形\n * @param centerX 中心X坐标\n * @param centerY 中心Y坐标\n * @param width 宽度\n * @param height 高度\n * @returns 新的矩形实例\n */\n static fromCenter(centerX, centerY, width, height) {\n return new Rectangle(centerX - width * 0.5, centerY - height * 0.5, width, height);\n }\n /**\n * 从两个点创建矩形\n * @param point1 第一个点\n * @param point2 第二个点\n * @returns 新的矩形实例\n */\n static fromPoints(point1, point2) {\n const x = Math.min(point1.x, point2.x);\n const y = Math.min(point1.y, point2.y);\n const width = Math.abs(point2.x - point1.x);\n const height = Math.abs(point2.y - point1.y);\n return new Rectangle(x, y, width, height);\n }\n /**\n * 从点数组创建包围矩形\n * @param points 点数组\n * @returns 包围矩形\n */\n static fromPointArray(points) {\n if (points.length === 0) {\n return Rectangle.EMPTY.clone();\n }\n let minX = points[0].x;\n let minY = points[0].y;\n let maxX = points[0].x;\n let maxY = points[0].y;\n for (let i = 1; i < points.length; i++) {\n minX = Math.min(minX, points[i].x);\n minY = Math.min(minY, points[i].y);\n maxX = Math.max(maxX, points[i].x);\n maxY = Math.max(maxY, points[i].y);\n }\n return new Rectangle(minX, minY, maxX - minX, maxY - minY);\n }\n /**\n * 创建正方形\n * @param x 左上角X坐标\n * @param y 左上角Y坐标\n * @param size 边长\n * @returns 新的正方形矩形\n */\n static square(x, y, size) {\n return new Rectangle(x, y, size, size);\n }\n /**\n * 线性插值两个矩形\n * @param a 起始矩形\n * @param b 目标矩形\n * @param t 插值参数(0到1)\n * @returns 新的插值结果矩形\n */\n static lerp(a, b, t) {\n return new Rectangle(a.x + (b.x - a.x) * t, a.y + (b.y - a.y) * t, a.width + (b.width - a.width) * t, a.height + (b.height - a.height) * t);\n }\n // 字符串转换\n /**\n * 转换为字符串\n * @returns 字符串表示\n */\n toString() {\n return `Rectangle(${this.x.toFixed(2)}, ${this.y.toFixed(2)}, ${this.width.toFixed(2)}, ${this.height.toFixed(2)})`;\n }\n /**\n * 转换为数组\n * @returns [x, y, width, height] 数组\n */\n toArray() {\n return [this.x, this.y, this.width, this.height];\n }\n /**\n * 转换为普通对象\n * @returns {x, y, width, height} 对象\n */\n toObject() {\n return { x: this.x, y: this.y, width: this.width, height: this.height };\n }\n /**\n * 获取四个顶点\n * @returns 顶点数组 [topLeft, topRight, bottomRight, bottomLeft]\n */\n getVertices() {\n return [\n this.topLeft,\n this.topRight,\n this.bottomRight,\n this.bottomLeft\n ];\n }\n}\n// 静态常量\n/** 空矩形 */\nRectangle.EMPTY = new Rectangle(0, 0, 0, 0);\n//# sourceMappingURL=Rectangle.js.map","import { Vector2 } from './Vector2';\nimport { Rectangle } from './Rectangle';\n/**\n * 2D圆形类\n *\n * 表示一个圆形,提供圆形相关的几何运算功能:\n * - 圆形创建和属性获取\n * - 包含检测(点、圆形)\n * - 相交检测和计算\n * - 变换和操作\n */\nexport class Circle {\n /**\n * 创建圆形\n * @param x 圆心X坐标,默认为0\n * @param y 圆心Y坐标,默认为0\n * @param radius 半径,默认为0\n */\n constructor(x = 0, y = 0, radius = 0) {\n this.x = x;\n this.y = y;\n this.radius = radius;\n }\n // 属性获取\n /** 获取圆心坐标 */\n get center() {\n return new Vector2(this.x, this.y);\n }\n /** 设置圆心坐标 */\n set center(value) {\n this.x = value.x;\n this.y = value.y;\n }\n /** 获取直径 */\n get diameter() {\n return this.radius * 2;\n }\n /** 设置直径 */\n set diameter(value) {\n this.radius = value * 0.5;\n }\n /** 获取面积 */\n get area() {\n return Math.PI * this.radius * this.radius;\n }\n /** 获取周长 */\n get circumference() {\n return 2 * Math.PI * this.radius;\n }\n /** 获取包围矩形 */\n get bounds() {\n return new Rectangle(this.x - this.radius, this.y - this.radius, this.diameter, this.diameter);\n }\n /** 检查是否为空圆形 */\n get isEmpty() {\n return this.radius <= 0;\n }\n // 基础操作\n /**\n * 设置圆形属性\n * @param x 圆心X坐标\n * @param y 圆心Y坐标\n * @param radius 半径\n * @returns 当前圆形实例(链式调用)\n */\n set(x, y, radius) {\n this.x = x;\n this.y = y;\n this.radius = radius;\n return this;\n }\n /**\n * 复制另一个圆形的值\n * @param other 源圆形\n * @returns 当前圆形实例(链式调用)\n */\n copy(other) {\n this.x = other.x;\n this.y = other.y;\n this.radius = other.radius;\n return this;\n }\n /**\n * 克隆当前圆形\n * @returns 新的圆形实例\n */\n clone() {\n return new Circle(this.x, this.y, this.radius);\n }\n /**\n * 设置圆心位置\n * @param x 新的X坐标\n * @param y 新的Y坐标\n * @returns 当前圆形实例(链式调用)\n */\n setPosition(x, y) {\n this.x = x;\n this.y = y;\n return this;\n }\n /**\n * 设置圆心位置(使用向量)\n * @param center 新的圆心位置\n * @returns 当前圆形实例(链式调用)\n */\n setCenter(center) {\n this.x = center.x;\n this.y = center.y;\n return this;\n }\n /**\n * 设置半径\n * @param radius 新的半径\n * @returns 当前圆形实例(链式调用)\n */\n setRadius(radius) {\n this.radius = radius;\n return this;\n }\n // 变换操作\n /**\n * 平移圆形\n * @param dx X方向偏移\n * @param dy Y方向偏移\n * @returns 当前圆形实例(链式调用)\n */\n translate(dx, dy) {\n this.x += dx;\n this.y += dy;\n return this;\n }\n /**\n * 平移圆形(使用向量)\n * @param offset 偏移向量\n * @returns 当前圆形实例(链式调用)\n */\n translateBy(offset) {\n this.x += offset.x;\n this.y += offset.y;\n return this;\n }\n /**\n * 缩放圆形\n * @param scale 缩放因子\n * @returns 当前圆形实例(链式调用)\n */\n scale(scale) {\n this.radius *= scale;\n return this;\n }\n /**\n * 扩展圆形\n * @param amount 扩展量(正值扩大半径,负值缩小半径)\n * @returns 当前圆形实例(链式调用)\n */\n inflate(amount) {\n this.radius += amount;\n return this;\n }\n // 包含检测\n /**\n * 检查是否包含指定点\n * @param point 点\n * @returns 是否包含\n */\n containsPoint(point) {\n const dx = point.x - this.x;\n const dy = point.y - this.y;\n return dx * dx + dy * dy <= this.radius * this.radius;\n }\n /**\n * 检查是否包含指定坐标\n * @param x X坐标\n * @param y Y坐标\n * @returns 是否包含\n */\n contains(x, y) {\n const dx = x - this.x;\n const dy = y - this.y;\n return dx * dx + dy * dy <= this.radius * this.radius;\n }\n /**\n * 检查是否完全包含另一个圆形\n * @param other 另一个圆形\n * @returns 是否完全包含\n */\n containsCircle(other) {\n const distance = this.distanceToCircle(other);\n return distance + other.radius <= this.radius;\n }\n /**\n * 检查点是否在圆的边界上\n * @param point 点\n * @param epsilon 容差,默认为Number.EPSILON\n * @returns 是否在边界上\n */\n pointOnBoundary(point, epsilon = Number.EPSILON) {\n const distance = this.distanceToPoint(point);\n return Math.abs(distance - this.radius) < epsilon;\n }\n // 相交检测\n /**\n * 检查是否与另一个圆形相交\n * @param other 另一个圆形\n * @returns 是否相交\n */\n intersects(other) {\n const dx = this.x - other.x;\n const dy = this.y - other.y;\n const distanceSquared = dx * dx + dy * dy;\n const radiusSum = this.radius + other.radius;\n return distanceSquared <= radiusSum * radiusSum;\n }\n /**\n * 检查是否与矩形相交\n * @param rect 矩形\n * @returns 是否相交\n */\n intersectsRect(rect) {\n // 找到矩形上离圆心最近的点\n const closestX = Math.max(rect.x, Math.min(this.x, rect.right));\n const closestY = Math.max(rect.y, Math.min(this.y, rect.bottom));\n // 计算圆心到最近点的距离\n const dx = this.x - closestX;\n const dy = this.y - closestY;\n return dx * dx + dy * dy <= this.radius * this.radius;\n }\n /**\n * 计算与另一个圆形的相交面积\n * @param other 另一个圆形\n * @returns 相交面积\n */\n intersectionArea(other) {\n const d = this.distanceToCircle(other);\n // 不相交\n if (d >= this.radius + other.radius) {\n return 0;\n }\n // 一个圆完全包含另一个圆\n if (d <= Math.abs(this.radius - other.radius)) {\n const smallerRadius = Math.min(this.radius, other.radius);\n return Math.PI * smallerRadius * smallerRadius;\n }\n // 部分相交\n const r1 = this.radius;\n const r2 = other.radius;\n const part1 = r1 * r1 * Math.acos((d * d + r1 * r1 - r2 * r2) / (2 * d * r1));\n const part2 = r2 * r2 * Math.acos((d * d + r2 * r2 - r1 * r1) / (2 * d * r2));\n const part3 = 0.5 * Math.sqrt((-d + r1 + r2) * (d + r1 - r2) * (d - r1 + r2) * (d + r1 + r2));\n return part1 + part2 - part3;\n }\n // 距离计算\n /**\n * 计算圆心到点的距离\n * @param point 点\n * @returns 距离\n */\n distanceToPoint(point) {\n const dx = point.x - this.x;\n const dy = point.y - this.y;\n return Math.sqrt(dx * dx + dy * dy);\n }\n /**\n * 计算圆形边界到点的最短距离\n * @param point 点\n * @returns 最短距离(点在圆内时为负值)\n */\n distanceToPointFromBoundary(point) {\n return this.distanceToPoint(point) - this.radius;\n }\n /**\n * 计算两个圆心之间的距离\n * @param other 另一个圆形\n * @returns 圆心距离\n */\n distanceToCircle(other) {\n const dx = this.x - other.x;\n const dy = this.y - other.y;\n return Math.sqrt(dx * dx + dy * dy);\n }\n /**\n * 计算两个圆形边界之间的最短距离\n * @param other 另一个圆形\n * @returns 最短距离(相交时为负值)\n */\n distanceToCircleFromBoundary(other) {\n return this.distanceToCircle(other) - this.radius - other.radius;\n }\n /**\n * 计算圆形到矩形的最短距离\n * @param rect 矩形\n * @returns 最短距离\n */\n distanceToRect(rect) {\n return Math.max(0, rect.distanceToPoint(this.center) - this.radius);\n }\n /**\n * 获取圆形上距离指定点最近的点\n * @param point 指定点\n * @returns 最近点\n */\n closestPointTo(point) {\n const direction = Vector2.subtract(point, this.center);\n if (direction.isZero) {\n // 点在圆心,返回圆上任意点\n return new Vector2(this.x + this.radius, this.y);\n }\n return this.center.clone().add(direction.normalized().multiply(this.radius));\n }\n /**\n * 获取圆形上距离指定点最远的点\n * @param point 指定点\n * @returns 最远点\n */\n farthestPointFrom(point) {\n const direction = Vector2.subtract(point, this.center);\n if (direction.isZero) {\n // 点在圆心,返回圆上任意点\n return new Vector2(this.x - this.radius, this.y);\n }\n return this.center.clone().subtract(direction.normalized().multiply(this.radius));\n }\n // 几何运算\n /**\n * 获取指定角度上的圆周点\n * @param angle 角度(弧度)\n * @returns 圆周点\n */\n getPointAtAngle(angle) {\n return new Vector2(this.x + this.radius * Math.cos(angle), this.y + this.radius * Math.sin(angle));\n }\n /**\n * 获取点相对于圆心的角度\n * @param point 点\n * @returns 角度(弧度)\n */\n getAngleToPoint(point) {\n return Math.atan2(point.y - this.y, point.x - this.x);\n }\n /**\n * 获取圆形与直线的交点\n * @param lineStart 直线起点\n * @param lineEnd 直线终点\n * @returns 交点数组(0-2个点)\n */\n getLineIntersections(lineStart, lineEnd) {\n const dx = lineEnd.x - lineStart.x;\n const dy = lineEnd.y - lineStart.y;\n const fx = lineStart.x - this.x;\n const fy = lineStart.y - this.y;\n const a = dx * dx + dy * dy;\n const b = 2 * (fx * dx + fy * dy);\n const c = fx * fx + fy * fy - this.radius * this.radius;\n const discriminant = b * b - 4 * a * c;\n if (discriminant < 0) {\n return []; // 无交点\n }\n if (discriminant === 0) {\n // 一个交点(切线)\n const t = -b / (2 * a);\n return [new Vector2(lineStart.x + t * dx, lineStart.y + t * dy)];\n }\n // 两个交点\n const sqrt = Math.sqrt(discriminant);\n const t1 = (-b - sqrt) / (2 * a);\n const t2 = (-b + sqrt) / (2 * a);\n return [\n new Vector2(lineStart.x + t1 * dx, lineStart.y + t1 * dy),\n new Vector2(lineStart.x + t2 * dx, lineStart.y + t2 * dy)\n ];\n }\n // 比较操作\n /**\n * 检查两个圆形是否相等\n * @param other 另一个圆形\n * @param epsilon 容差,默认为Number.EPSILON\n * @returns 是否相等\n */\n equals(other, epsilon = Number.EPSILON) {\n return Math.abs(this.x - other.x) < epsilon &&\n Math.abs(this.y - other.y) < epsilon &&\n Math.abs(this.radius - other.radius) < epsilon;\n }\n /**\n * 检查两个圆形是否完全相等\n * @param other 另一个圆形\n * @returns 是否完全相等\n */\n exactEquals(other) {\n return this.x === other.x && this.y === other.y && this.radius === other.radius;\n }\n // 静态方法\n /**\n * 从直径创建圆形\n * @param x 圆心X坐标\n * @param y 圆心Y坐标\n * @param diameter 直径\n * @returns 新的圆形实例\n */\n static fromDiameter(x, y, diameter) {\n return new Circle(x, y, diameter * 0.5);\n }\n /**\n * 从三个点创建外接圆\n * @param p1 第一个点\n * @param p2 第二个点\n * @param p3 第三个点\n * @returns 外接圆,如果三点共线返回null\n */\n static fromThreePoints(p1, p2, p3) {\n const ax = p1.x;\n const ay = p1.y;\n const bx = p2.x;\n const by = p2.y;\n const cx = p3.x;\n const cy = p3.y;\n const d = 2 * (ax * (by - cy) + bx * (cy - ay) + cx * (ay - by));\n if (Math.abs(d) < Number.EPSILON) {\n return null; // 三点共线\n }\n const ux = ((ax * ax + ay * ay) * (by - cy) + (bx * bx + by * by) * (cy - ay) + (cx * cx + cy * cy) * (ay - by)) / d;\n const uy = ((ax * ax + ay * ay) * (cx - bx) + (bx * bx + by * by) * (ax - cx) + (cx * cx + cy * cy) * (bx - ax)) / d;\n const radius = Math.sqrt((ax - ux) * (ax - ux) + (ay - uy) * (ay - uy));\n return new Circle(ux, uy, radius);\n }\n /**\n * 从点数组创建最小包围圆\n * @param points 点数组\n * @returns 最小包围圆\n */\n static fromPointArray(points) {\n if (points.length === 0) {\n return Circle.EMPTY.clone();\n }\n if (points.length === 1) {\n return new Circle(points[0].x, points[0].y, 0);\n }\n // 使用Welzl算法的简化版本\n // 这里使用更简单的方法:找到包围所有点的圆\n let minX = points[0].x, minY = points[0].y;\n let maxX = points[0].x, maxY = points[0].y;\n for (const point of points) {\n minX = Math.min(minX, point.x);\n minY = Math.min(minY, point.y);\n maxX = Math.max(maxX, point.x);\n maxY = Math.max(maxY, point.y);\n }\n const centerX = (minX + maxX) * 0.5;\n const centerY = (minY + maxY) * 0.5;\n const center = new Vector2(centerX, centerY);\n let maxDistance = 0;\n for (const point of points) {\n const distance = Vector2.distance(center, point);\n maxDistance = Math.max(maxDistance, distance);\n }\n return new Circle(centerX, centerY, maxDistance);\n }\n /**\n * 线性插值两个圆形\n * @param a 起始圆形\n * @param b 目标圆形\n * @param t 插值参数(0到1)\n * @returns 新的插值结果圆形\n */\n static lerp(a, b, t) {\n return new Circle(a.x + (b.x - a.x) * t, a.y + (b.y - a.y) * t, a.radius + (b.radius - a.radius) * t);\n }\n // 字符串转换\n /**\n * 转换为字符串\n * @returns 字符串表示\n */\n toString() {\n return `Circle(${this.x.toFixed(2)}, ${this.y.toFixed(2)}, r=${this.radius.toFixed(2)})`;\n }\n /**\n * 转换为数组\n * @returns [x, y, radius] 数组\n */\n toArray() {\n return [this.x, this.y, this.radius];\n }\n /**\n * 转换为普通对象\n * @returns {x, y, radius} 对象\n */\n toObject() {\n return { x: this.x, y: this.y, radius: this.radius };\n }\n}\n// 静态常量\n/** 空圆形 */\nCircle.EMPTY = new Circle(0, 0, 0);\n/** 单位圆 */\nCircle.UNIT = new Circle(0, 0, 1);\n//# sourceMappingURL=Circle.js.map","/**\n * @zh 多边形工具函数\n * @en Polygon utility functions\n *\n * @zh 提供多边形顶点顺序检测、面积计算等实用函数\n * @en Provides polygon vertex order detection, area calculation and other utilities\n */\nexport class Polygon {\n /**\n * @zh 计算多边形的有符号面积(鞋带公式)\n * @en Calculate signed area of polygon (Shoelace formula)\n *\n * @zh 在标准坐标系(Y轴向上)中:\n * @en In standard coordinate system (Y-axis up):\n * - @zh 正值表示逆时针(CCW)顺序\n * - @en Positive value indicates counter-clockwise (CCW) order\n * - @zh 负值表示顺时针(CW)顺序\n * - @en Negative value indicates clockwise (CW) order\n *\n * @zh 在 Y 轴向下的坐标系中(如 Canvas),符号相反\n * @en In Y-axis down coordinate system (like Canvas), the sign is inverted\n *\n * @param vertices - @zh 多边形顶点数组 @en Array of polygon vertices\n * @returns @zh 有符号面积 @en Signed area\n *\n * @example\n * ```typescript\n * // CCW square in Y-up coords\n * const vertices = [\n * { x: 0, y: 0 },\n * { x: 1, y: 0 },\n * { x: 1, y: 1 },\n * { x: 0, y: 1 }\n * ];\n * const area = Polygon.signedArea(vertices); // > 0 (CCW)\n * ```\n */\n static signedArea(vertices) {\n const n = vertices.length;\n if (n < 3)\n return 0;\n let area = 0;\n for (let i = 0; i < n; i++) {\n const j = (i + 1) % n;\n const vi = vertices[i];\n const vj = vertices[j];\n area += vi.x * vj.y;\n area -= vj.x * vi.y;\n }\n return area * 0.5;\n }\n /**\n * @zh 计算多边形的绝对面积\n * @en Calculate absolute area of polygon\n *\n * @param vertices - @zh 多边形顶点数组 @en Array of polygon vertices\n * @returns @zh 绝对面积 @en Absolute area\n */\n static area(vertices) {\n return Math.abs(Polygon.signedArea(vertices));\n }\n /**\n * @zh 检查多边形顶点是否为逆时针(CCW)顺序\n * @en Check if polygon vertices are in counter-clockwise (CCW) order\n *\n * @zh 注意:这是基于标准数学坐标系(Y轴向上)\n * @en Note: This is based on standard math coordinate system (Y-axis up)\n *\n * @zh 在 Canvas/屏幕坐标系(Y轴向下)中,\n * @en In Canvas/screen coordinate system (Y-axis down),\n * @zh 视觉上的 CCW 实际上在数学上是 CW,反之亦然\n * @en visual CCW is actually mathematical CW, and vice versa\n *\n * @param vertices - @zh 多边形顶点数组 @en Array of polygon vertices\n * @param yAxisDown - @zh 是否使用 Y 轴向下的坐标系(默认 false)\n * @en Whether using Y-axis down coordinate system (default false)\n * @returns @zh 是否为 CCW 顺序 @en Whether in CCW order\n *\n * @example\n * ```typescript\n * // For standard Y-up coordinates (math, physics)\n * const isCCW = Polygon.isCCW(vertices);\n *\n * // For Y-down coordinates (Canvas, screen)\n * const isCCW = Polygon.isCCW(vertices, true);\n * ```\n */\n static isCCW(vertices, yAxisDown = false) {\n const area = Polygon.signedArea(vertices);\n return yAxisDown ? area < 0 : area > 0;\n }\n /**\n * @zh 检查多边形顶点是否为顺时针(CW)顺序\n * @en Check if polygon vertices are in clockwise (CW) order\n *\n * @param vertices - @zh 多边形顶点数组 @en Array of polygon vertices\n * @param yAxisDown - @zh 是否使用 Y 轴向下的坐标系(默认 false)\n * @en Whether using Y-axis down coordinate system (default false)\n * @returns @zh 是否为 CW 顺序 @en Whether in CW order\n */\n static isCW(vertices, yAxisDown = false) {\n return !Polygon.isCCW(vertices, yAxisDown);\n }\n /**\n * @zh 反转多边形顶点顺序\n * @en Reverse polygon vertex order\n *\n * @zh 将 CCW 转换为 CW,或将 CW 转换为 CCW\n * @en Converts CCW to CW, or CW to CCW\n *\n * @param vertices - @zh 多边形顶点数组 @en Array of polygon vertices\n * @returns @zh 反转后的新数组 @en New array with reversed order\n */\n static reverse(vertices) {\n return [...vertices].reverse();\n }\n /**\n * @zh 原地反转多边形顶点顺序\n * @en Reverse polygon vertex order in place\n *\n * @param vertices - @zh 多边形顶点数组(会被修改)@en Array of polygon vertices (will be modified)\n */\n static reverseInPlace(vertices) {\n vertices.reverse();\n }\n /**\n * @zh 确保多边形顶点为逆时针(CCW)顺序\n * @en Ensure polygon vertices are in counter-clockwise (CCW) order\n *\n * @zh 如果顶点已经是 CCW 顺序,返回原数组的副本\n * @en If vertices are already in CCW order, returns a copy of the original array\n * @zh 如果是 CW 顺序,返回反转后的新数组\n * @en If in CW order, returns a new array with reversed order\n *\n * @param vertices - @zh 多边形顶点数组 @en Array of polygon vertices\n * @param yAxisDown - @zh 是否使用 Y 轴向下的坐标系(默认 false)\n * @en Whether using Y-axis down coordinate system (default false)\n * @returns @zh CCW 顺序的顶点数组 @en Array of vertices in CCW order\n *\n * @example\n * ```typescript\n * // For ORCA/RVO2 obstacle avoidance (Y-up math coordinates)\n * const ccwVertices = Polygon.ensureCCW(obstacle.vertices);\n *\n * // For Canvas rendering (Y-down screen coordinates)\n * const ccwVertices = Polygon.ensureCCW(obstacle.vertices, true);\n * ```\n */\n static ensureCCW(vertices, yAxisDown = false) {\n if (Polygon.isCCW(vertices, yAxisDown)) {\n return [...vertices];\n }\n return Polygon.reverse(vertices);\n }\n /**\n * @zh 确保多边形顶点为顺时针(CW)顺序\n * @en Ensure polygon vertices are in clockwise (CW) order\n *\n * @param vertices - @zh 多边形顶点数组 @en Array of polygon vertices\n * @param yAxisDown - @zh 是否使用 Y 轴向下的坐标系(默认 false)\n * @en Whether using Y-axis down coordinate system (default false)\n * @returns @zh CW 顺序的顶点数组 @en Array of vertices in CW order\n */\n static ensureCW(vertices, yAxisDown = false) {\n if (Polygon.isCW(vertices, yAxisDown)) {\n return [...vertices];\n }\n return Polygon.reverse(vertices);\n }\n /**\n * @zh 计算多边形的质心(重心)\n * @en Calculate polygon centroid (center of mass)\n *\n * @param vertices - @zh 多边形顶点数组 @en Array of polygon vertices\n * @returns @zh 质心坐标 @en Centroid coordinates\n */\n static centroid(vertices) {\n const n = vertices.length;\n if (n === 0)\n return { x: 0, y: 0 };\n if (n === 1)\n return { x: vertices[0].x, y: vertices[0].y };\n if (n === 2) {\n return {\n x: (vertices[0].x + vertices[1].x) * 0.5,\n y: (vertices[0].y + vertices[1].y) * 0.5\n };\n }\n let cx = 0;\n let cy = 0;\n let signedArea = 0;\n for (let i = 0; i < n; i++) {\n const j = (i + 1) % n;\n const vi = vertices[i];\n const vj = vertices[j];\n const a = vi.x * vj.y - vj.x * vi.y;\n signedArea += a;\n cx += (vi.x + vj.x) * a;\n cy += (vi.y + vj.y) * a;\n }\n signedArea *= 0.5;\n const factor = 1 / (6 * signedArea);\n return {\n x: cx * factor,\n y: cy * factor\n };\n }\n /**\n * @zh 检查点是否在多边形内部(射线法)\n * @en Check if point is inside polygon (ray casting)\n *\n * @param point - @zh 要检查的点 @en Point to check\n * @param vertices - @zh 多边形顶点数组 @en Array of polygon vertices\n * @returns @zh 点是否在多边形内部 @en Whether point is inside polygon\n */\n static containsPoint(point, vertices) {\n const n = vertices.length;\n if (n < 3)\n return false;\n let inside = false;\n for (let i = 0, j = n - 1; i < n; j = i++) {\n const vi = vertices[i];\n const vj = vertices[j];\n if (((vi.y > point.y) !== (vj.y > point.y)) &&\n (point.x < (vj.x - vi.x) * (point.y - vi.y) / (vj.y - vi.y) + vi.x)) {\n inside = !inside;\n }\n }\n return inside;\n }\n /**\n * @zh 检查多边形是否为凸多边形\n * @en Check if polygon is convex\n *\n * @param vertices - @zh 多边形顶点数组 @en Array of polygon vertices\n * @returns @zh 是否为凸多边形 @en Whether polygon is convex\n */\n static isConvex(vertices) {\n const n = vertices.length;\n if (n < 3)\n return false;\n if (n === 3)\n return true;\n let sign = null;\n for (let i = 0; i < n; i++) {\n const v0 = vertices[i];\n const v1 = vertices[(i + 1) % n];\n const v2 = vertices[(i + 2) % n];\n const dx1 = v1.x - v0.x;\n const dy1 = v1.y - v0.y;\n const dx2 = v2.x - v1.x;\n const dy2 = v2.y - v1.y;\n const cross = dx1 * dy2 - dy1 * dx2;\n if (Math.abs(cross) > 1e-10) {\n if (sign === null) {\n sign = cross > 0 ? 1 : -1;\n }\n else if ((cross > 0 ? 1 : -1) !== sign) {\n return false;\n }\n }\n }\n return true;\n }\n /**\n * @zh 计算多边形的周长\n * @en Calculate polygon perimeter\n *\n * @param vertices - @zh 多边形顶点数组 @en Array of polygon vertices\n * @returns @zh 周长 @en Perimeter\n */\n static perimeter(vertices) {\n const n = vertices.length;\n if (n < 2)\n return 0;\n let perimeter = 0;\n for (let i = 0; i < n; i++) {\n const j = (i + 1) % n;\n const vi = vertices[i];\n const vj = vertices[j];\n const dx = vj.x - vi.x;\n const dy = vj.y - vi.y;\n perimeter += Math.sqrt(dx * dx + dy * dy);\n }\n return perimeter;\n }\n /**\n * @zh 获取多边形的边界框\n * @en Get polygon bounding box\n *\n * @param vertices - @zh 多边形顶点数组 @en Array of polygon vertices\n * @returns @zh 边界框 { minX, minY, maxX, maxY } @en Bounding box\n */\n static bounds(vertices) {\n if (vertices.length === 0) {\n return { minX: 0, minY: 0, maxX: 0, maxY: 0 };\n }\n let minX = Infinity;\n let minY = Infinity;\n let maxX = -Infinity;\n let maxY = -Infinity;\n for (const v of vertices) {\n if (v.x < minX)\n minX = v.x;\n if (v.y < minY)\n minY = v.y;\n if (v.x > maxX)\n maxX = v.x;\n if (v.y > maxY)\n maxY = v.y;\n }\n return { minX, minY, maxX, maxY };\n }\n}\n//# sourceMappingURL=Polygon.js.map","/**\n * @zh Q16.16 定点数,用于确定性计算(帧同步)\n * @en Q16.16 fixed-point number for deterministic calculations (lockstep)\n *\n * @zh 使用 16 位整数部分 + 16 位小数部分,范围 ±32767.99998\n * @en Uses 16-bit integer + 16-bit fraction, range ±32767.99998\n *\n * @example\n * ```typescript\n * const a = Fixed32.from(3.14);\n * const b = Fixed32.from(2);\n * const c = a.mul(b); // 6.28\n * console.log(c.toNumber());\n * ```\n */\nexport class Fixed32 {\n // ==================== 构造 ====================\n /**\n * @zh 私有构造函数,使用静态方法创建实例\n * @en Private constructor, use static methods to create instances\n */\n constructor(raw) {\n // 确保是 32 位有符号整数\n this.raw = raw | 0;\n }\n /**\n * @zh 从浮点数创建定点数\n * @en Create fixed-point from floating-point number\n * @param n - @zh 浮点数值 @en Floating-point value\n */\n static from(n) {\n return new Fixed32(Math.round(n * Fixed32.SCALE));\n }\n /**\n * @zh 从原始整数值创建定点数\n * @en Create fixed-point from raw integer value\n * @param raw - @zh 原始值 @en Raw value\n */\n static fromRaw(raw) {\n return new Fixed32(raw);\n }\n /**\n * @zh 从整数创建定点数(无精度损失)\n * @en Create fixed-point from integer (no precision loss)\n * @param n - @zh 整数值 @en Integer value\n */\n static fromInt(n) {\n return new Fixed32((n | 0) << Fixed32.FRACTION_BITS);\n }\n // ==================== 转换 ====================\n /**\n * @zh 转换为浮点数\n * @en Convert to floating-point number\n */\n toNumber() {\n return this.raw / Fixed32.SCALE;\n }\n /**\n * @zh 获取原始整数值\n * @en Get raw integer value\n */\n toRaw() {\n return this.raw;\n }\n /**\n * @zh 转换为整数(向下取整)\n * @en Convert to integer (floor)\n */\n toInt() {\n return this.raw >> Fixed32.FRACTION_BITS;\n }\n /**\n * @zh 转换为字符串\n * @en Convert to string\n */\n toString() {\n return `Fixed32(${this.toNumber().toFixed(5)})`;\n }\n // ==================== 基础运算 ====================\n /**\n * @zh 加法\n * @en Addition\n */\n add(other) {\n return new Fixed32(this.raw + other.raw);\n }\n /**\n * @zh 减法\n * @en Subtraction\n */\n sub(other) {\n return new Fixed32(this.raw - other.raw);\n }\n /**\n * @zh 乘法(使用 64 位中间结果防止溢出)\n * @en Multiplication (uses 64-bit intermediate to prevent overflow)\n */\n mul(other) {\n // 拆分为高低 16 位进行乘法,避免溢出\n const a = this.raw;\n const b = other.raw;\n // 使用 BigInt 确保精度(JS 数字在大数时会丢失精度)\n // 或者使用拆分法\n const aLow = a & 0xFFFF;\n const aHigh = a >> 16;\n const bLow = b & 0xFFFF;\n const bHigh = b >> 16;\n // (aHigh * 2^16 + aLow) * (bHigh * 2^16 + bLow) / 2^16\n // = aHigh * bHigh * 2^16 + aHigh * bLow + aLow * bHigh + aLow * bLow / 2^16\n const lowLow = (aLow * bLow) >>> 16;\n const lowHigh = aLow * bHigh;\n const highLow = aHigh * bLow;\n const highHigh = aHigh * bHigh;\n const result = highHigh * Fixed32.SCALE + lowHigh + highLow + lowLow;\n return new Fixed32(result | 0);\n }\n /**\n * @zh 除法\n * @en Division\n * @throws @zh 除数为零时抛出错误 @en Throws when dividing by zero\n */\n div(other) {\n if (other.raw === 0) {\n throw new Error('Fixed32: Division by zero');\n }\n // 先左移再除,保持精度\n const result = ((this.raw * Fixed32.SCALE) / other.raw) | 0;\n return new Fixed32(result);\n }\n /**\n * @zh 取模运算\n * @en Modulo operation\n */\n mod(other) {\n return new Fixed32(this.raw % other.raw);\n }\n /**\n * @zh 取反\n * @en Negation\n */\n neg() {\n return new Fixed32(-this.raw);\n }\n /**\n * @zh 绝对值\n * @en Absolute value\n */\n abs() {\n return this.raw >= 0 ? this : new Fixed32(-this.raw);\n }\n // ==================== 比较运算 ====================\n /**\n * @zh 等于\n * @en Equal to\n */\n eq(other) {\n return this.raw === other.raw;\n }\n /**\n * @zh 不等于\n * @en Not equal to\n */\n ne(other) {\n return this.raw !== other.raw;\n }\n /**\n * @zh 小于\n * @en Less than\n */\n lt(other) {\n return this.raw < other.raw;\n }\n /**\n * @zh 小于等于\n * @en Less than or equal to\n */\n le(other) {\n return this.raw <= other.raw;\n }\n /**\n * @zh 大于\n * @en Greater than\n */\n gt(other) {\n return this.raw > other.raw;\n }\n /**\n * @zh 大于等于\n * @en Greater than or equal to\n */\n ge(other) {\n return this.raw >= other.raw;\n }\n /**\n * @zh 检查是否为零\n * @en Check if zero\n */\n isZero() {\n return this.raw === 0;\n }\n /**\n * @zh 检查是否为正数\n * @en Check if positive\n */\n isPositive() {\n return this.raw > 0;\n }\n /**\n * @zh 检查是否为负数\n * @en Check if negative\n */\n isNegative() {\n return this.raw < 0;\n }\n // ==================== 数学函数 ====================\n /**\n * @zh 平方根(牛顿迭代法,确定性)\n * @en Square root (Newton's method, deterministic)\n */\n static sqrt(x) {\n if (x.raw <= 0)\n return Fixed32.ZERO;\n // 牛顿迭代法\n let guess = x.raw;\n let prev = 0;\n // 固定迭代次数确保确定性\n for (let i = 0; i < 16; i++) {\n prev = guess;\n guess = ((guess + ((x.raw * Fixed32.SCALE) / guess) | 0) >> 1) | 0;\n if (guess === prev)\n break;\n }\n return new Fixed32(guess);\n }\n /**\n * @zh 向下取整\n * @en Floor\n */\n static floor(x) {\n return new Fixed32(x.raw & ~(Fixed32.SCALE - 1));\n }\n /**\n * @zh 向上取整\n * @en Ceiling\n */\n static ceil(x) {\n const frac = x.raw & (Fixed32.SCALE - 1);\n if (frac === 0)\n return x;\n return new Fixed32((x.raw & ~(Fixed32.SCALE - 1)) + Fixed32.SCALE);\n }\n /**\n * @zh 四舍五入\n * @en Round\n */\n static round(x) {\n return new Fixed32((x.raw + (Fixed32.SCALE >> 1)) & ~(Fixed32.SCALE - 1));\n }\n /**\n * @zh 最小值\n * @en Minimum\n */\n static min(a, b) {\n return a.raw < b.raw ? a : b;\n }\n /**\n * @zh 最大值\n * @en Maximum\n */\n static max(a, b) {\n return a.raw > b.raw ? a : b;\n }\n /**\n * @zh 限制范围\n * @en Clamp to range\n */\n static clamp(x, min, max) {\n if (x.raw < min.raw)\n return min;\n if (x.raw > max.raw)\n return max;\n return x;\n }\n /**\n * @zh 线性插值\n * @en Linear interpolation\n * @param a - @zh 起始值 @en Start value\n * @param b - @zh 结束值 @en End value\n * @param t - @zh 插值参数 (0-1) @en Interpolation parameter (0-1)\n */\n static lerp(a, b, t) {\n // a + (b - a) * t\n return a.add(b.sub(a).mul(t));\n }\n /**\n * @zh 符号函数\n * @en Sign function\n * @returns @zh -1, 0, 或 1 @en -1, 0, or 1\n */\n static sign(x) {\n if (x.raw > 0)\n return Fixed32.ONE;\n if (x.raw < 0)\n return Fixed32.NEG_ONE;\n return Fixed32.ZERO;\n }\n // ==================== 静态运算(便捷方法) ====================\n /**\n * @zh 加法(静态)\n * @en Addition (static)\n */\n static add(a, b) {\n return a.add(b);\n }\n /**\n * @zh 减法(静态)\n * @en Subtraction (static)\n */\n static sub(a, b) {\n return a.sub(b);\n }\n /**\n * @zh 乘法(静态)\n * @en Multiplication (static)\n */\n static mul(a, b) {\n return a.mul(b);\n }\n /**\n * @zh 除法(静态)\n * @en Division (static)\n */\n static div(a, b) {\n return a.div(b);\n }\n}\n/**\n * @zh 小数位数\n * @en Fraction bits\n */\nFixed32.FRACTION_BITS = 16;\n/**\n * @zh 缩放因子 (2^16 = 65536)\n * @en Scale factor (2^16 = 65536)\n */\nFixed32.SCALE = 65536;\n/**\n * @zh 最大值 (约 32767.99998)\n * @en Maximum value (approximately 32767.99998)\n */\nFixed32.MAX_VALUE = 0x7FFFFFFF;\n/**\n * @zh 最小值 (约 -32768)\n * @en Minimum value (approximately -32768)\n */\nFixed32.MIN_VALUE = -0x80000000;\n/**\n * @zh 精度 (1/65536 ≈ 0.0000153)\n * @en Precision (1/65536 ≈ 0.0000153)\n */\nFixed32.EPSILON = 1;\n// ==================== 常量 ====================\n/** @zh 零 @en Zero */\nFixed32.ZERO = new Fixed32(0);\n/** @zh 一 @en One */\nFixed32.ONE = new Fixed32(Fixed32.SCALE);\n/** @zh 负一 @en Negative one */\nFixed32.NEG_ONE = new Fixed32(-Fixed32.SCALE);\n/** @zh 二分之一 @en One half */\nFixed32.HALF = new Fixed32(Fixed32.SCALE >> 1);\n/** @zh 圆周率 π @en Pi */\nFixed32.PI = new Fixed32(205887); // π * 65536\n/** @zh 2π @en Two Pi */\nFixed32.TWO_PI = new Fixed32(411775); // 2π * 65536\n/** @zh π/2 @en Pi divided by 2 */\nFixed32.HALF_PI = new Fixed32(102944); // π/2 * 65536\n/** @zh 弧度转角度系数 (180/π) @en Radians to degrees factor */\nFixed32.RAD_TO_DEG = new Fixed32(3754936); // (180/π) * 65536\n/** @zh 角度转弧度系数 (π/180) @en Degrees to radians factor */\nFixed32.DEG_TO_RAD = new Fixed32(1144); // (π/180) * 65536\n//# sourceMappingURL=Fixed32.js.map","import { Fixed32 } from './Fixed32';\n/**\n * @zh 定点数数学函数库,使用查表法确保确定性\n * @en Fixed-point math functions using lookup tables for determinism\n *\n * @zh 所有三角函数使用预计算的查找表,确保在所有平台上结果一致\n * @en All trigonometric functions use precomputed lookup tables to ensure consistent results across all platforms\n */\nexport class FixedMath {\n /**\n * @zh 生成正弦查找表\n * @en Generate sine lookup table\n */\n static generateSinTable() {\n const table = new Int32Array(FixedMath.SIN_TABLE_SIZE + 1);\n for (let i = 0; i <= FixedMath.SIN_TABLE_SIZE; i++) {\n const angle = (i * Math.PI) / (2 * FixedMath.SIN_TABLE_SIZE);\n table[i] = Math.round(Math.sin(angle) * Fixed32.SCALE);\n }\n return table;\n }\n /**\n * @zh 正弦函数(确定性)\n * @en Sine function (deterministic)\n * @param angle - @zh 角度(弧度,定点数) @en Angle in radians (fixed-point)\n */\n static sin(angle) {\n // 将角度规范化到 [0, 2π)\n let raw = angle.raw % Fixed32.TWO_PI.raw;\n if (raw < 0)\n raw += Fixed32.TWO_PI.raw;\n const halfPi = Fixed32.HALF_PI.raw;\n const pi = Fixed32.PI.raw;\n const threeHalfPi = halfPi * 3;\n let tableAngle;\n let negative = false;\n if (raw <= halfPi) {\n // 第一象限: [0, π/2]\n tableAngle = raw;\n }\n else if (raw <= pi) {\n // 第二象限: (π/2, π]\n tableAngle = pi - raw;\n }\n else if (raw <= threeHalfPi) {\n // 第三象限: (π, 3π/2]\n tableAngle = raw - pi;\n negative = true;\n }\n else {\n // 第四象限: (3π/2, 2π)\n tableAngle = Fixed32.TWO_PI.raw - raw;\n negative = true;\n }\n // 计算表索引 (tableAngle 范围是 [0, π/2])\n const tableIndex = Math.min(((tableAngle * FixedMath.SIN_TABLE_SIZE) / halfPi) | 0, FixedMath.SIN_TABLE_SIZE);\n const result = FixedMath.SIN_TABLE[tableIndex];\n return Fixed32.fromRaw(negative ? -result : result);\n }\n /**\n * @zh 余弦函数(确定性)\n * @en Cosine function (deterministic)\n * @param angle - @zh 角度(弧度,定点数) @en Angle in radians (fixed-point)\n */\n static cos(angle) {\n // cos(x) = sin(x + π/2)\n return FixedMath.sin(angle.add(Fixed32.HALF_PI));\n }\n /**\n * @zh 正切函数(确定性)\n * @en Tangent function (deterministic)\n * @param angle - @zh 角度(弧度,定点数) @en Angle in radians (fixed-point)\n */\n static tan(angle) {\n const cosVal = FixedMath.cos(angle);\n if (cosVal.isZero()) {\n // 返回最大值表示无穷大\n return Fixed32.fromRaw(Fixed32.MAX_VALUE);\n }\n return FixedMath.sin(angle).div(cosVal);\n }\n /**\n * @zh 反正切函数 atan2(确定性)\n * @en Arc tangent of y/x (deterministic)\n * @param y - @zh Y 坐标 @en Y coordinate\n * @param x - @zh X 坐标 @en X coordinate\n * @returns @zh 角度(弧度,范围 -π 到 π)@en Angle in radians (range -π to π)\n */\n static atan2(y, x) {\n const yRaw = y.raw;\n const xRaw = x.raw;\n if (xRaw === 0 && yRaw === 0) {\n return Fixed32.ZERO;\n }\n // 使用 CORDIC 算法的简化版本\n const absY = Math.abs(yRaw);\n const absX = Math.abs(xRaw);\n let angle;\n if (absX >= absY) {\n // |y/x| <= 1,使用泰勒展开近似\n angle = FixedMath.atanApprox(absY, absX);\n }\n else {\n // |y/x| > 1,使用恒等式 atan(y/x) = π/2 - atan(x/y)\n angle = Fixed32.HALF_PI.raw - FixedMath.atanApprox(absX, absY);\n }\n // 根据象限调整\n if (xRaw < 0) {\n angle = Fixed32.PI.raw - angle;\n }\n if (yRaw < 0) {\n angle = -angle;\n }\n return Fixed32.fromRaw(angle);\n }\n /**\n * @zh atan 近似计算(内部使用)\n * @en Approximate atan calculation (internal use)\n */\n static atanApprox(num, den) {\n if (den === 0)\n return Fixed32.HALF_PI.raw;\n // 使用多项式近似: atan(x) ≈ x - x³/3 + x⁵/5\n // 对于 |x| <= 1 精度足够\n const ratio = ((num * Fixed32.SCALE) / den) | 0;\n // 简化的多项式: atan(x) ≈ x * (1 - x²/3)\n // 更精确的版本: atan(x) ≈ x / (1 + 0.28125 * x²)\n const x2 = ((ratio * ratio) / Fixed32.SCALE) | 0;\n const factor = Fixed32.SCALE + ((x2 * 18432) / Fixed32.SCALE | 0); // 0.28125 * 65536 ≈ 18432\n const result = ((ratio * Fixed32.SCALE) / factor) | 0;\n return result;\n }\n /**\n * @zh 反正弦函数(确定性)\n * @en Arc sine function (deterministic)\n * @param x - @zh 值(范围 -1 到 1)@en Value (range -1 to 1)\n */\n static asin(x) {\n // asin(x) = atan2(x, sqrt(1 - x²))\n const one = Fixed32.ONE;\n const x2 = x.mul(x);\n const sqrt = Fixed32.sqrt(one.sub(x2));\n return FixedMath.atan2(x, sqrt);\n }\n /**\n * @zh 反余弦函数(确定性)\n * @en Arc cosine function (deterministic)\n * @param x - @zh 值(范围 -1 到 1)@en Value (range -1 to 1)\n */\n static acos(x) {\n // acos(x) = π/2 - asin(x)\n return Fixed32.HALF_PI.sub(FixedMath.asin(x));\n }\n /**\n * @zh 角度规范化到 [-π, π]\n * @en Normalize angle to [-π, π]\n */\n static normalizeAngle(angle) {\n let raw = angle.raw % Fixed32.TWO_PI.raw;\n if (raw > Fixed32.PI.raw) {\n raw -= Fixed32.TWO_PI.raw;\n }\n else if (raw < -Fixed32.PI.raw) {\n raw += Fixed32.TWO_PI.raw;\n }\n return Fixed32.fromRaw(raw);\n }\n /**\n * @zh 角度差值(最短路径)\n * @en Angle difference (shortest path)\n */\n static angleDelta(from, to) {\n return FixedMath.normalizeAngle(to.sub(from));\n }\n /**\n * @zh 角度线性插值(最短路径)\n * @en Angle linear interpolation (shortest path)\n */\n static lerpAngle(from, to, t) {\n const delta = FixedMath.angleDelta(from, to);\n return from.add(delta.mul(t));\n }\n /**\n * @zh 弧度转角度\n * @en Radians to degrees\n */\n static radToDeg(rad) {\n return rad.mul(Fixed32.RAD_TO_DEG);\n }\n /**\n * @zh 角度转弧度\n * @en Degrees to radians\n */\n static degToRad(deg) {\n return deg.mul(Fixed32.DEG_TO_RAD);\n }\n /**\n * @zh 幂函数(整数次幂)\n * @en Power function (integer exponent)\n */\n static pow(base, exp) {\n if (exp === 0)\n return Fixed32.ONE;\n if (exp < 0) {\n base = Fixed32.ONE.div(base);\n exp = -exp;\n }\n let result = Fixed32.ONE;\n while (exp > 0) {\n if (exp & 1) {\n result = result.mul(base);\n }\n base = base.mul(base);\n exp >>= 1;\n }\n return result;\n }\n /**\n * @zh 指数函数近似(e^x)\n * @en Exponential function approximation (e^x)\n */\n static exp(x) {\n // 使用泰勒展开: e^x ≈ 1 + x + x²/2 + x³/6 + x⁴/24\n const one = Fixed32.ONE;\n const x2 = x.mul(x);\n const x3 = x2.mul(x);\n const x4 = x3.mul(x);\n return one\n .add(x)\n .add(x2.div(Fixed32.from(2)))\n .add(x3.div(Fixed32.from(6)))\n .add(x4.div(Fixed32.from(24)));\n }\n /**\n * @zh 自然对数近似\n * @en Natural logarithm approximation\n */\n static ln(x) {\n if (x.raw <= 0) {\n throw new Error('FixedMath.ln: argument must be positive');\n }\n // 使用牛顿迭代法: y_{n+1} = y_n + 2 * (x - exp(y_n)) / (x + exp(y_n))\n let y = Fixed32.ZERO;\n const two = Fixed32.from(2);\n for (let i = 0; i < 10; i++) {\n const expY = FixedMath.exp(y);\n const diff = x.sub(expY);\n const sum = x.add(expY);\n y = y.add(two.mul(diff).div(sum));\n }\n return y;\n }\n}\n/**\n * @zh 正弦表大小(每 90 度的采样点数)\n * @en Sine table size (samples per 90 degrees)\n */\nFixedMath.SIN_TABLE_SIZE = 1024;\n/**\n * @zh 正弦查找表(0 到 90 度)\n * @en Sine lookup table (0 to 90 degrees)\n */\nFixedMath.SIN_TABLE = FixedMath.generateSinTable();\n//# sourceMappingURL=FixedMath.js.map","import { Fixed32 } from './Fixed32';\nimport { FixedMath } from './FixedMath';\n/**\n * @zh 定点数 2D 向量类,用于确定性计算(帧同步)\n * @en Fixed-point 2D vector class for deterministic calculations (lockstep)\n *\n * @zh 所有运算返回新实例,保证不可变性\n * @en All operations return new instances, ensuring immutability\n *\n * @example\n * ```typescript\n * const a = FixedVector2.from(3, 4);\n * const b = FixedVector2.from(1, 2);\n * const c = a.add(b); // (4, 6)\n * const len = a.length(); // 5\n * ```\n */\nexport class FixedVector2 {\n // ==================== 构造 ====================\n /**\n * @zh 创建定点数向量\n * @en Create fixed-point vector\n */\n constructor(x, y) {\n this.x = x;\n this.y = y;\n }\n /**\n * @zh 从浮点数创建向量\n * @en Create vector from floating-point numbers\n */\n static from(x, y) {\n return new FixedVector2(Fixed32.from(x), Fixed32.from(y));\n }\n /**\n * @zh 从原始整数值创建向量\n * @en Create vector from raw integer values\n */\n static fromRaw(rawX, rawY) {\n return new FixedVector2(Fixed32.fromRaw(rawX), Fixed32.fromRaw(rawY));\n }\n /**\n * @zh 从整数创建向量\n * @en Create vector from integers\n */\n static fromInt(x, y) {\n return new FixedVector2(Fixed32.fromInt(x), Fixed32.fromInt(y));\n }\n /**\n * @zh 从普通向量接口创建\n * @en Create from plain vector interface\n */\n static fromObject(obj) {\n return FixedVector2.from(obj.x, obj.y);\n }\n // ==================== 转换 ====================\n /**\n * @zh 转换为浮点数对象(用于渲染)\n * @en Convert to floating-point object (for rendering)\n */\n toObject() {\n return {\n x: this.x.toNumber(),\n y: this.y.toNumber()\n };\n }\n /**\n * @zh 转换为数组\n * @en Convert to array\n */\n toArray() {\n return [this.x.toNumber(), this.y.toNumber()];\n }\n /**\n * @zh 获取原始值对象(用于网络传输)\n * @en Get raw values object (for network transmission)\n */\n toRawObject() {\n return {\n x: this.x.toRaw(),\n y: this.y.toRaw()\n };\n }\n /**\n * @zh 转换为字符串\n * @en Convert to string\n */\n toString() {\n return `FixedVector2(${this.x.toNumber().toFixed(3)}, ${this.y.toNumber().toFixed(3)})`;\n }\n /**\n * @zh 克隆向量\n * @en Clone vector\n */\n clone() {\n return new FixedVector2(this.x, this.y);\n }\n // ==================== 基础运算 ====================\n /**\n * @zh 向量加法\n * @en Vector addition\n */\n add(other) {\n return new FixedVector2(this.x.add(other.x), this.y.add(other.y));\n }\n /**\n * @zh 向量减法\n * @en Vector subtraction\n */\n sub(other) {\n return new FixedVector2(this.x.sub(other.x), this.y.sub(other.y));\n }\n /**\n * @zh 标量乘法\n * @en Scalar multiplication\n */\n mul(scalar) {\n return new FixedVector2(this.x.mul(scalar), this.y.mul(scalar));\n }\n /**\n * @zh 标量除法\n * @en Scalar division\n */\n div(scalar) {\n return new FixedVector2(this.x.div(scalar), this.y.div(scalar));\n }\n /**\n * @zh 分量乘法\n * @en Component-wise multiplication\n */\n mulComponents(other) {\n return new FixedVector2(this.x.mul(other.x), this.y.mul(other.y));\n }\n /**\n * @zh 分量除法\n * @en Component-wise division\n */\n divComponents(other) {\n return new FixedVector2(this.x.div(other.x), this.y.div(other.y));\n }\n /**\n * @zh 取反\n * @en Negate\n */\n neg() {\n return new FixedVector2(this.x.neg(), this.y.neg());\n }\n // ==================== 向量运算 ====================\n /**\n * @zh 点积\n * @en Dot product\n */\n dot(other) {\n return this.x.mul(other.x).add(this.y.mul(other.y));\n }\n /**\n * @zh 叉积(2D 返回标量)\n * @en Cross product (returns scalar in 2D)\n */\n cross(other) {\n return this.x.mul(other.y).sub(this.y.mul(other.x));\n }\n /**\n * @zh 长度的平方\n * @en Length squared\n */\n lengthSquared() {\n return this.dot(this);\n }\n /**\n * @zh 长度(模)\n * @en Length (magnitude)\n */\n length() {\n return Fixed32.sqrt(this.lengthSquared());\n }\n /**\n * @zh 归一化(转换为单位向量)\n * @en Normalize (convert to unit vector)\n */\n normalize() {\n const len = this.length();\n if (len.isZero()) {\n return FixedVector2.ZERO;\n }\n return this.div(len);\n }\n /**\n * @zh 到另一个向量的距离平方\n * @en Distance squared to another vector\n */\n distanceSquaredTo(other) {\n const dx = this.x.sub(other.x);\n const dy = this.y.sub(other.y);\n return dx.mul(dx).add(dy.mul(dy));\n }\n /**\n * @zh 到另一个向量的距离\n * @en Distance to another vector\n */\n distanceTo(other) {\n return Fixed32.sqrt(this.distanceSquaredTo(other));\n }\n /**\n * @zh 获取垂直向量(顺时针旋转90度)\n * @en Get perpendicular vector (clockwise 90 degrees)\n */\n perpendicular() {\n return new FixedVector2(this.y, this.x.neg());\n }\n /**\n * @zh 获取垂直向量(逆时针旋转90度)\n * @en Get perpendicular vector (counter-clockwise 90 degrees)\n */\n perpendicularCCW() {\n return new FixedVector2(this.y.neg(), this.x);\n }\n /**\n * @zh 投影到另一个向量上\n * @en Project onto another vector\n */\n projectOnto(onto) {\n const dot = this.dot(onto);\n const lenSq = onto.lengthSquared();\n if (lenSq.isZero()) {\n return FixedVector2.ZERO;\n }\n return onto.mul(dot.div(lenSq));\n }\n /**\n * @zh 反射向量(关于法线)\n * @en Reflect vector (about normal)\n */\n reflect(normal) {\n const dot = this.dot(normal);\n const two = Fixed32.from(2);\n return this.sub(normal.mul(two.mul(dot)));\n }\n // ==================== 旋转和角度 ====================\n /**\n * @zh 旋转向量(顺时针为正,左手坐标系)\n * @en Rotate vector (clockwise positive, left-hand coordinate system)\n * @param angle - @zh 旋转角度(弧度)@en Rotation angle in radians\n */\n rotate(angle) {\n const cos = FixedMath.cos(angle);\n const sin = FixedMath.sin(angle);\n // 顺时针旋转: x' = x*cos + y*sin, y' = -x*sin + y*cos\n return new FixedVector2(this.x.mul(cos).add(this.y.mul(sin)), this.x.neg().mul(sin).add(this.y.mul(cos)));\n }\n /**\n * @zh 围绕一个点旋转\n * @en Rotate around a point\n */\n rotateAround(center, angle) {\n return this.sub(center).rotate(angle).add(center);\n }\n /**\n * @zh 获取向量角度(弧度)\n * @en Get vector angle in radians\n */\n angle() {\n return FixedMath.atan2(this.y, this.x);\n }\n /**\n * @zh 获取与另一个向量的夹角\n * @en Get angle between this and another vector\n */\n angleTo(other) {\n const cross = this.cross(other);\n const dot = this.dot(other);\n return FixedMath.atan2(cross, dot);\n }\n /**\n * @zh 从极坐标创建向量\n * @en Create vector from polar coordinates\n */\n static fromPolar(length, angle) {\n return new FixedVector2(length.mul(FixedMath.cos(angle)), length.mul(FixedMath.sin(angle)));\n }\n /**\n * @zh 从角度创建单位向量\n * @en Create unit vector from angle\n */\n static fromAngle(angle) {\n return new FixedVector2(FixedMath.cos(angle), FixedMath.sin(angle));\n }\n // ==================== 比较运算 ====================\n /**\n * @zh 检查是否相等\n * @en Check equality\n */\n equals(other) {\n return this.x.eq(other.x) && this.y.eq(other.y);\n }\n /**\n * @zh 检查是否为零向量\n * @en Check if zero vector\n */\n isZero() {\n return this.x.isZero() && this.y.isZero();\n }\n // ==================== 限制和插值 ====================\n /**\n * @zh 限制长度\n * @en Clamp length\n */\n clampLength(maxLength) {\n const lenSq = this.lengthSquared();\n const maxLenSq = maxLength.mul(maxLength);\n if (lenSq.gt(maxLenSq)) {\n return this.normalize().mul(maxLength);\n }\n return this;\n }\n /**\n * @zh 限制分量范围\n * @en Clamp components\n */\n clamp(min, max) {\n return new FixedVector2(Fixed32.clamp(this.x, min.x, max.x), Fixed32.clamp(this.y, min.y, max.y));\n }\n /**\n * @zh 线性插值\n * @en Linear interpolation\n */\n lerp(target, t) {\n return new FixedVector2(Fixed32.lerp(this.x, target.x, t), Fixed32.lerp(this.y, target.y, t));\n }\n /**\n * @zh 向目标移动固定距离\n * @en Move towards target by fixed distance\n */\n moveTowards(target, maxDistance) {\n const diff = target.sub(this);\n const dist = diff.length();\n if (dist.isZero() || dist.le(maxDistance)) {\n return target;\n }\n return this.add(diff.div(dist).mul(maxDistance));\n }\n // ==================== 静态方法 ====================\n /**\n * @zh 向量加法(静态)\n * @en Vector addition (static)\n */\n static add(a, b) {\n return a.add(b);\n }\n /**\n * @zh 向量减法(静态)\n * @en Vector subtraction (static)\n */\n static sub(a, b) {\n return a.sub(b);\n }\n /**\n * @zh 点积(静态)\n * @en Dot product (static)\n */\n static dot(a, b) {\n return a.dot(b);\n }\n /**\n * @zh 叉积(静态)\n * @en Cross product (static)\n */\n static cross(a, b) {\n return a.cross(b);\n }\n /**\n * @zh 距离(静态)\n * @en Distance (static)\n */\n static distance(a, b) {\n return a.distanceTo(b);\n }\n /**\n * @zh 线性插值(静态)\n * @en Linear interpolation (static)\n */\n static lerp(a, b, t) {\n return a.lerp(b, t);\n }\n /**\n * @zh 获取两个向量的最小分量\n * @en Get minimum components of two vectors\n */\n static min(a, b) {\n return new FixedVector2(Fixed32.min(a.x, b.x), Fixed32.min(a.y, b.y));\n }\n /**\n * @zh 获取两个向量的最大分量\n * @en Get maximum components of two vectors\n */\n static max(a, b) {\n return new FixedVector2(Fixed32.max(a.x, b.x), Fixed32.max(a.y, b.y));\n }\n}\n// ==================== 常量 ====================\n/** @zh 零向量 (0, 0) @en Zero vector */\nFixedVector2.ZERO = new FixedVector2(Fixed32.ZERO, Fixed32.ZERO);\n/** @zh 单位向量 (1, 1) @en One vector */\nFixedVector2.ONE = new FixedVector2(Fixed32.ONE, Fixed32.ONE);\n/** @zh 右方向 (1, 0) @en Right direction */\nFixedVector2.RIGHT = new FixedVector2(Fixed32.ONE, Fixed32.ZERO);\n/** @zh 左方向 (-1, 0) @en Left direction */\nFixedVector2.LEFT = new FixedVector2(Fixed32.NEG_ONE, Fixed32.ZERO);\n/** @zh 上方向 (0, 1) @en Up direction */\nFixedVector2.UP = new FixedVector2(Fixed32.ZERO, Fixed32.ONE);\n/** @zh 下方向 (0, -1) @en Down direction */\nFixedVector2.DOWN = new FixedVector2(Fixed32.ZERO, Fixed32.NEG_ONE);\n//# sourceMappingURL=FixedVector2.js.map","import { Vector2 } from './Vector2';\n/**\n * 数学工具函数集合\n *\n * 提供常用的数学运算、插值、随机数生成等实用工具函数\n */\nexport class MathUtils {\n // 角度转换\n /**\n * 角度转弧度\n * @param degrees 角度值\n * @returns 弧度值\n */\n static degToRad(degrees) {\n return degrees * MathUtils.DEG_TO_RAD;\n }\n /**\n * 弧度转角度\n * @param radians 弧度值\n * @returns 角度值\n */\n static radToDeg(radians) {\n return radians * MathUtils.RAD_TO_DEG;\n }\n /**\n * 规范化角度到[0, 2π)范围\n * @param radians 角度(弧度)\n * @returns 规范化后的角度\n */\n static normalizeAngle(radians) {\n while (radians < 0)\n radians += MathUtils.TWO_PI;\n while (radians >= MathUtils.TWO_PI)\n radians -= MathUtils.TWO_PI;\n return radians;\n }\n /**\n * 规范化角度到(-π, π]范围\n * @param radians 角度(弧度)\n * @returns 规范化后的角度\n */\n static normalizeAngleSigned(radians) {\n while (radians <= -Math.PI)\n radians += MathUtils.TWO_PI;\n while (radians > Math.PI)\n radians -= MathUtils.TWO_PI;\n return radians;\n }\n /**\n * 计算两个角度之间的最短角度差\n * @param from 起始角度(弧度)\n * @param to 目标角度(弧度)\n * @returns 角度差(-π到π)\n */\n static angleDifference(from, to) {\n let diff = to - from;\n diff = MathUtils.normalizeAngleSigned(diff);\n return diff;\n }\n /**\n * 角度插值(处理角度环绕)\n * @param from 起始角度(弧度)\n * @param to 目标角度(弧度)\n * @param t 插值参数(0到1)\n * @returns 插值结果角度\n */\n static lerpAngle(from, to, t) {\n const diff = MathUtils.angleDifference(from, to);\n return from + diff * t;\n }\n // 数值操作\n /**\n * 限制数值在指定范围内\n * @param value 待限制的值\n * @param min 最小值\n * @param max 最大值\n * @returns 限制后的值\n */\n static clamp(value, min, max) {\n return Math.max(min, Math.min(max, value));\n }\n /**\n * 限制数值在0到1之间\n * @param value 待限制的值\n * @returns 限制后的值\n */\n static clamp01(value) {\n return Math.max(0, Math.min(1, value));\n }\n /**\n * 线性插值\n * @param a 起始值\n * @param b 目标值\n * @param t 插值参数(0到1)\n * @returns 插值结果\n */\n static lerp(a, b, t) {\n return a + (b - a) * t;\n }\n /**\n * 反向线性插值(获取插值参数)\n * @param a 起始值\n * @param b 目标值\n * @param value 当前值\n * @returns 插值参数\n */\n static inverseLerp(a, b, value) {\n if (Math.abs(b - a) < MathUtils.EPSILON) {\n return 0;\n }\n return (value - a) / (b - a);\n }\n /**\n * 重映射数值从一个范围到另一个范围\n * @param value 输入值\n * @param inMin 输入范围最小值\n * @param inMax 输入范围最大值\n * @param outMin 输出范围最小值\n * @param outMax 输出范围最大值\n * @returns 重映射后的值\n */\n static remap(value, inMin, inMax, outMin, outMax) {\n const t = MathUtils.inverseLerp(inMin, inMax, value);\n return MathUtils.lerp(outMin, outMax, t);\n }\n /**\n * 平滑阶跃函数(Hermite插值)\n * @param t 输入参数(0到1)\n * @returns 平滑输出(0到1)\n */\n static smoothStep(t) {\n t = MathUtils.clamp01(t);\n return t * t * (3 - 2 * t);\n }\n /**\n * 更平滑的阶跃函数\n * @param t 输入参数(0到1)\n * @returns 平滑输出(0到1)\n */\n static smootherStep(t) {\n t = MathUtils.clamp01(t);\n return t * t * t * (t * (t * 6 - 15) + 10);\n }\n // 比较操作\n /**\n * 浮点数相等比较\n * @param a 数值a\n * @param b 数值b\n * @param epsilon 容差,默认为EPSILON\n * @returns 是否相等\n */\n static approximately(a, b, epsilon = MathUtils.EPSILON) {\n return Math.abs(a - b) < epsilon;\n }\n /**\n * 检查数值是否为零\n * @param value 数值\n * @param epsilon 容差,默认为EPSILON\n * @returns 是否为零\n */\n static isZero(value, epsilon = MathUtils.EPSILON) {\n return Math.abs(value) < epsilon;\n }\n /**\n * 获取数值的符号\n * @param value 数值\n * @returns 1、-1或0\n */\n static sign(value) {\n return value > 0 ? 1 : value < 0 ? -1 : 0;\n }\n // 随机数生成\n /**\n * 生成指定范围内的随机数\n * @param min 最小值(包含)\n * @param max 最大值(不包含)\n * @returns 随机数\n */\n static random(min = 0, max = 1) {\n return Math.random() * (max - min) + min;\n }\n /**\n * 生成指定范围内的随机整数\n * @param min 最小值(包含)\n * @param max 最大值(包含)\n * @returns 随机整数\n */\n static randomInt(min, max) {\n return Math.floor(Math.random() * (max - min + 1)) + min;\n }\n /**\n * 随机选择数组中的一个元素\n * @param array 数组\n * @returns 随机元素\n */\n static randomChoice(array) {\n return array[Math.floor(Math.random() * array.length)];\n }\n /**\n * 生成随机布尔值\n * @param probability 为true的概率(0到1),默认0.5\n * @returns 随机布尔值\n */\n static randomBoolean(probability = 0.5) {\n return Math.random() < probability;\n }\n /**\n * 生成单位圆内的随机点\n * @returns 随机向量\n */\n static randomInUnitCircle() {\n const angle = Math.random() * MathUtils.TWO_PI;\n const radius = Math.sqrt(Math.random());\n return Vector2.fromPolar(radius, angle);\n }\n /**\n * 生成单位圆上的随机点\n * @returns 随机单位向量\n */\n static randomOnUnitCircle() {\n const angle = Math.random() * MathUtils.TWO_PI;\n return Vector2.fromAngle(angle);\n }\n // 数学函数\n /**\n * 快速平方根倒数(用于归一化)\n * @param value 输入值\n * @returns 平方根倒数\n */\n static fastInverseSqrt(value) {\n // 简化版本,现代JavaScript引擎优化很好\n return 1 / Math.sqrt(value);\n }\n /**\n * 快速幂运算(整数指数)\n * @param base 底数\n * @param exponent 指数(整数)\n * @returns 幂运算结果\n */\n static fastPow(base, exponent) {\n if (exponent === 0)\n return 1;\n if (exponent === 1)\n return base;\n if (exponent === 2)\n return base * base;\n if (exponent === 3)\n return base * base * base;\n return Math.pow(base, exponent);\n }\n /**\n * 阶乘\n * @param n 非负整数\n * @returns 阶乘结果\n */\n static factorial(n) {\n if (n < 0)\n return NaN;\n if (n === 0 || n === 1)\n return 1;\n let result = 1;\n for (let i = 2; i <= n; i++) {\n result *= i;\n }\n return result;\n }\n /**\n * 最大公约数\n * @param a 整数a\n * @param b 整数b\n * @returns 最大公约数\n */\n static gcd(a, b) {\n a = Math.abs(Math.floor(a));\n b = Math.abs(Math.floor(b));\n while (b !== 0) {\n const temp = b;\n b = a % b;\n a = temp;\n }\n return a;\n }\n /**\n * 最小公倍数\n * @param a 整数a\n * @param b 整数b\n * @returns 最小公倍数\n */\n static lcm(a, b) {\n return Math.abs(a * b) / MathUtils.gcd(a, b);\n }\n // 序列和级数\n /**\n * 斐波那契数列\n * @param n 项数\n * @returns 第n项斐波那契数\n */\n static fibonacci(n) {\n if (n <= 0)\n return 0;\n if (n === 1)\n return 1;\n let a = 0, b = 1;\n for (let i = 2; i <= n; i++) {\n const temp = a + b;\n a = b;\n b = temp;\n }\n return b;\n }\n /**\n * 等差数列求和\n * @param first 首项\n * @param last 末项\n * @param count 项数\n * @returns 等差数列和\n */\n static arithmeticSum(first, last, count) {\n return (first + last) * count * 0.5;\n }\n /**\n * 等比数列求和\n * @param first 首项\n * @param ratio 公比\n * @param count 项数\n * @returns 等比数列和\n */\n static geometricSum(first, ratio, count) {\n if (Math.abs(ratio - 1) < MathUtils.EPSILON) {\n return first * count;\n }\n return first * (1 - Math.pow(ratio, count)) / (1 - ratio);\n }\n // 曲线和插值\n /**\n * 贝塞尔二次曲线\n * @param p0 控制点0\n * @param p1 控制点1\n * @param p2 控制点2\n * @param t 参数(0到1)\n * @returns 曲线上的点\n */\n static quadraticBezier(p0, p1, p2, t) {\n const u = 1 - t;\n const tt = t * t;\n const uu = u * u;\n return new Vector2(uu * p0.x + 2 * u * t * p1.x + tt * p2.x, uu * p0.y + 2 * u * t * p1.y + tt * p2.y);\n }\n /**\n * 贝塞尔三次曲线\n * @param p0 控制点0\n * @param p1 控制点1\n * @param p2 控制点2\n * @param p3 控制点3\n * @param t 参数(0到1)\n * @returns 曲线上的点\n */\n static cubicBezier(p0, p1, p2, p3, t) {\n const u = 1 - t;\n const tt = t * t;\n const uu = u * u;\n const uuu = uu * u;\n const ttt = tt * t;\n return new Vector2(uuu * p0.x + 3 * uu * t * p1.x + 3 * u * tt * p2.x + ttt * p3.x, uuu * p0.y + 3 * uu * t * p1.y + 3 * u * tt * p2.y + ttt * p3.y);\n }\n /**\n * Catmull-Rom样条插值\n * @param p0 控制点0\n * @param p1 控制点1\n * @param p2 控制点2\n * @param p3 控制点3\n * @param t 参数(0到1)\n * @returns 插值结果点\n */\n static catmullRom(p0, p1, p2, p3, t) {\n const t2 = t * t;\n const t3 = t2 * t;\n const x = 0.5 * ((2 * p1.x) +\n (-p0.x + p2.x) * t +\n (2 * p0.x - 5 * p1.x + 4 * p2.x - p3.x) * t2 +\n (-p0.x + 3 * p1.x - 3 * p2.x + p3.x) * t3);\n const y = 0.5 * ((2 * p1.y) +\n (-p0.y + p2.y) * t +\n (2 * p0.y - 5 * p1.y + 4 * p2.y - p3.y) * t2 +\n (-p0.y + 3 * p1.y - 3 * p2.y + p3.y) * t3);\n return new Vector2(x, y);\n }\n // 噪声函数\n /**\n * 简单伪随机噪声(基于种子)\n * @param x 输入X\n * @param y 输入Y\n * @param seed 种子\n * @returns 噪声值(0到1)\n */\n static noise(x, y = 0, seed = 0) {\n const n = Math.sin(x * 12.9898 + y * 78.233 + seed * 37.719) * 43758.5453;\n return n - Math.floor(n);\n }\n /**\n * 平滑噪声\n * @param x 输入X\n * @param y 输入Y\n * @param seed 种子\n * @returns 平滑噪声值(0到1)\n */\n static smoothNoise(x, y = 0, seed = 0) {\n const intX = Math.floor(x);\n const intY = Math.floor(y);\n const fracX = x - intX;\n const fracY = y - intY;\n const a = MathUtils.noise(intX, intY, seed);\n const b = MathUtils.noise(intX + 1, intY, seed);\n const c = MathUtils.noise(intX, intY + 1, seed);\n const d = MathUtils.noise(intX + 1, intY + 1, seed);\n const i1 = MathUtils.lerp(a, b, fracX);\n const i2 = MathUtils.lerp(c, d, fracX);\n return MathUtils.lerp(i1, i2, fracY);\n }\n // 实用工具\n /**\n * 将数值转换为指定精度\n * @param value 数值\n * @param precision 精度(小数位数)\n * @returns 转换后的数值\n */\n static toPrecision(value, precision) {\n const factor = Math.pow(10, precision);\n return Math.round(value * factor) / factor;\n }\n /**\n * 检查数值是否在指定范围内\n * @param value 数值\n * @param min 最小值\n * @param max 最大值\n * @returns 是否在范围内\n */\n static inRange(value, min, max) {\n return value >= min && value <= max;\n }\n /**\n * 获取数组中的最小值\n * @param values 数值数组\n * @returns 最小值\n */\n static min(...values) {\n return Math.min(...values);\n }\n /**\n * 获取数组中的最大值\n * @param values 数值数组\n * @returns 最大值\n */\n static max(...values) {\n return Math.max(...values);\n }\n /**\n * 计算数组的平均值\n * @param values 数值数组\n * @returns 平均值\n */\n static average(values) {\n if (values.length === 0)\n return 0;\n return values.reduce((sum, val) => sum + val, 0) / values.length;\n }\n /**\n * 计算数组的中位数\n * @param values 数值数组\n * @returns 中位数\n */\n static median(values) {\n if (values.length === 0)\n return 0;\n const sorted = [...values].sort((a, b) => a - b);\n const middle = Math.floor(sorted.length / 2);\n if (sorted.length % 2 === 0) {\n return (sorted[middle - 1] + sorted[middle]) / 2;\n }\n return sorted[middle];\n }\n}\n// 数学常量\n/** 圆周率 */\nMathUtils.PI = Math.PI;\n/** 2π */\nMathUtils.TWO_PI = Math.PI * 2;\n/** π/2 */\nMathUtils.HALF_PI = Math.PI * 0.5;\n/** π/4 */\nMathUtils.QUARTER_PI = Math.PI * 0.25;\n/** 角度到弧度转换系数 */\nMathUtils.DEG_TO_RAD = Math.PI / 180;\n/** 弧度到角度转换系数 */\nMathUtils.RAD_TO_DEG = 180 / Math.PI;\n/** 黄金比例 */\nMathUtils.GOLDEN_RATIO = (1 + Math.sqrt(5)) * 0.5;\n/** 默认浮点数比较容差 */\nMathUtils.EPSILON = Number.EPSILON;\n//# sourceMappingURL=MathUtils.js.map","/**\n * Color utility class for game engine\n * 游戏引擎颜色工具类\n *\n * Provides color conversion, manipulation, and packing utilities.\n * 提供颜色转换、操作和打包工具。\n */\n/**\n * Color class for color manipulation and conversion\n * 颜色类,用于颜色操作和转换\n */\nexport class Color {\n /**\n * Create a new Color instance\n * 创建新的 Color 实例\n */\n constructor(r = 255, g = 255, b = 255, a = 1) {\n this.r = Math.round(Math.max(0, Math.min(255, r)));\n this.g = Math.round(Math.max(0, Math.min(255, g)));\n this.b = Math.round(Math.max(0, Math.min(255, b)));\n this.a = Math.max(0, Math.min(1, a));\n }\n // ===== Factory Methods | 工厂方法 =====\n /**\n * Create color from hex string\n * 从十六进制字符串创建颜色\n * @param hex Hex string (e.g., \"#FF0000\", \"#F00\", \"FF0000\") | 十六进制字符串\n * @param alpha Optional alpha value (0-1) | 可选的透明度值\n */\n static fromHex(hex, alpha = 1) {\n const { r, g, b } = Color.hexToRgb(hex);\n return new Color(r, g, b, alpha);\n }\n /**\n * Create color from packed uint32 (0xRRGGBB or 0xAARRGGBB)\n * 从打包的 uint32 创建颜色\n * @param value Packed color value | 打包的颜色值\n * @param hasAlpha Whether value includes alpha | 是否包含透明度\n */\n static fromUint32(value, hasAlpha = false) {\n if (hasAlpha) {\n const a = ((value >> 24) & 0xFF) / 255;\n const r = (value >> 16) & 0xFF;\n const g = (value >> 8) & 0xFF;\n const b = value & 0xFF;\n return new Color(r, g, b, a);\n }\n else {\n const r = (value >> 16) & 0xFF;\n const g = (value >> 8) & 0xFF;\n const b = value & 0xFF;\n return new Color(r, g, b);\n }\n }\n /**\n * Create color from HSL values\n * 从 HSL 值创建颜色\n * @param h Hue (0-360) | 色相\n * @param s Saturation (0-1) | 饱和度\n * @param l Lightness (0-1) | 亮度\n * @param a Alpha (0-1) | 透明度\n */\n static fromHSL(h, s, l, a = 1) {\n const { r, g, b } = Color.hslToRgb(h, s, l);\n return new Color(r, g, b, a);\n }\n /**\n * Create color from normalized float values (0-1)\n * 从归一化浮点值创建颜色 (0-1)\n */\n static fromFloat(r, g, b, a = 1) {\n return new Color(r * 255, g * 255, b * 255, a);\n }\n // ===== Conversion Methods | 转换方法 =====\n /**\n * Convert hex string to RGB\n * 将十六进制字符串转换为 RGB\n */\n static hexToRgb(hex) {\n const colorHex = hex.replace('#', '');\n let r = 255, g = 255, b = 255;\n if (colorHex.length === 6) {\n r = parseInt(colorHex.substring(0, 2), 16);\n g = parseInt(colorHex.substring(2, 4), 16);\n b = parseInt(colorHex.substring(4, 6), 16);\n }\n else if (colorHex.length === 3) {\n r = parseInt(colorHex[0] + colorHex[0], 16);\n g = parseInt(colorHex[1] + colorHex[1], 16);\n b = parseInt(colorHex[2] + colorHex[2], 16);\n }\n else if (colorHex.length === 8) {\n // AARRGGBB format\n r = parseInt(colorHex.substring(2, 4), 16);\n g = parseInt(colorHex.substring(4, 6), 16);\n b = parseInt(colorHex.substring(6, 8), 16);\n }\n return { r, g, b };\n }\n /**\n * Convert RGB to hex string\n * 将 RGB 转换为十六进制字符串\n */\n static rgbToHex(r, g, b) {\n const toHex = (n) => Math.round(n).toString(16).padStart(2, '0');\n return `#${toHex(r)}${toHex(g)}${toHex(b)}`;\n }\n /**\n * Convert HSL to RGB\n * 将 HSL 转换为 RGB\n */\n static hslToRgb(h, s, l) {\n h = ((h % 360) + 360) % 360 / 360;\n s = Math.max(0, Math.min(1, s));\n l = Math.max(0, Math.min(1, l));\n let r, g, b;\n if (s === 0) {\n r = g = b = l;\n }\n else {\n const hue2rgb = (p, q, t) => {\n if (t < 0)\n t += 1;\n if (t > 1)\n t -= 1;\n if (t < 1 / 6)\n return p + (q - p) * 6 * t;\n if (t < 1 / 2)\n return q;\n if (t < 2 / 3)\n return p + (q - p) * (2 / 3 - t) * 6;\n return p;\n };\n const q = l < 0.5 ? l * (1 + s) : l + s - l * s;\n const p = 2 * l - q;\n r = hue2rgb(p, q, h + 1 / 3);\n g = hue2rgb(p, q, h);\n b = hue2rgb(p, q, h - 1 / 3);\n }\n return {\n r: Math.round(r * 255),\n g: Math.round(g * 255),\n b: Math.round(b * 255)\n };\n }\n /**\n * Convert RGB to HSL\n * 将 RGB 转换为 HSL\n */\n static rgbToHsl(r, g, b) {\n r /= 255;\n g /= 255;\n b /= 255;\n const max = Math.max(r, g, b);\n const min = Math.min(r, g, b);\n let h = 0;\n let s = 0;\n const l = (max + min) / 2;\n if (max !== min) {\n const d = max - min;\n s = l > 0.5 ? d / (2 - max - min) : d / (max + min);\n switch (max) {\n case r:\n h = ((g - b) / d + (g < b ? 6 : 0)) / 6;\n break;\n case g:\n h = ((b - r) / d + 2) / 6;\n break;\n case b:\n h = ((r - g) / d + 4) / 6;\n break;\n }\n }\n return { h: h * 360, s, l };\n }\n // ===== Packing Methods | 打包方法 =====\n /**\n * Pack color to uint32 (0xRRGGBB)\n * 打包颜色为 uint32 (0xRRGGBB)\n */\n static packRGB(r, g, b) {\n return ((r & 0xFF) << 16) | ((g & 0xFF) << 8) | (b & 0xFF);\n }\n /**\n * Pack color to uint32 (0xAARRGGBB)\n * 打包颜色为 uint32 (0xAARRGGBB)\n */\n static packARGB(r, g, b, a) {\n const alpha = Math.round(a * 255);\n return ((alpha & 0xFF) << 24) | ((r & 0xFF) << 16) | ((g & 0xFF) << 8) | (b & 0xFF);\n }\n /**\n * Pack color to uint32 for WebGL (0xAABBGGRR)\n * 打包颜色为 WebGL 格式的 uint32 (0xAABBGGRR)\n */\n static packABGR(r, g, b, a) {\n const alpha = Math.round(a * 255);\n return ((alpha & 0xFF) << 24) | ((b & 0xFF) << 16) | ((g & 0xFF) << 8) | (r & 0xFF);\n }\n /**\n * Pack hex string and alpha to WebGL uint32 (0xAABBGGRR)\n * 将十六进制字符串和透明度打包为 WebGL 格式 uint32\n */\n static packHexAlpha(hex, alpha) {\n const { r, g, b } = Color.hexToRgb(hex);\n return Color.packABGR(r, g, b, alpha);\n }\n /**\n * Unpack uint32 to RGBA (assumes 0xAARRGGBB)\n * 解包 uint32 为 RGBA (假设格式为 0xAARRGGBB)\n */\n static unpackARGB(value) {\n return {\n a: ((value >> 24) & 0xFF) / 255,\n r: (value >> 16) & 0xFF,\n g: (value >> 8) & 0xFF,\n b: value & 0xFF\n };\n }\n /**\n * Unpack uint32 to RGBA (assumes 0xAABBGGRR - WebGL format)\n * 解包 uint32 为 RGBA (假设格式为 0xAABBGGRR - WebGL 格式)\n */\n static unpackABGR(value) {\n return {\n a: ((value >> 24) & 0xFF) / 255,\n b: (value >> 16) & 0xFF,\n g: (value >> 8) & 0xFF,\n r: value & 0xFF\n };\n }\n // ===== Color Operations | 颜色操作 =====\n /**\n * Interpolate between two colors\n * 在两个颜色之间插值\n */\n static lerp(from, to, t) {\n t = Math.max(0, Math.min(1, t));\n return new Color(from.r + (to.r - from.r) * t, from.g + (to.g - from.g) * t, from.b + (to.b - from.b) * t, from.a + (to.a - from.a) * t);\n }\n /**\n * Interpolate between two packed uint32 colors (0xRRGGBB)\n * 在两个打包的 uint32 颜色之间插值\n */\n static lerpUint32(from, to, t) {\n t = Math.max(0, Math.min(1, t));\n const fromR = (from >> 16) & 0xFF;\n const fromG = (from >> 8) & 0xFF;\n const fromB = from & 0xFF;\n const toR = (to >> 16) & 0xFF;\n const toG = (to >> 8) & 0xFF;\n const toB = to & 0xFF;\n const r = Math.round(fromR + (toR - fromR) * t);\n const g = Math.round(fromG + (toG - fromG) * t);\n const b = Math.round(fromB + (toB - fromB) * t);\n return (r << 16) | (g << 8) | b;\n }\n /**\n * Mix two colors\n * 混合两个颜色\n */\n static mix(color1, color2, ratio = 0.5) {\n return Color.lerp(color1, color2, ratio);\n }\n /**\n * Lighten a color\n * 使颜色变亮\n */\n static lighten(color, amount) {\n const hsl = Color.rgbToHsl(color.r, color.g, color.b);\n hsl.l = Math.min(1, hsl.l + amount);\n const rgb = Color.hslToRgb(hsl.h, hsl.s, hsl.l);\n return new Color(rgb.r, rgb.g, rgb.b, color.a);\n }\n /**\n * Darken a color\n * 使颜色变暗\n */\n static darken(color, amount) {\n const hsl = Color.rgbToHsl(color.r, color.g, color.b);\n hsl.l = Math.max(0, hsl.l - amount);\n const rgb = Color.hslToRgb(hsl.h, hsl.s, hsl.l);\n return new Color(rgb.r, rgb.g, rgb.b, color.a);\n }\n /**\n * Saturate a color\n * 增加颜色饱和度\n */\n static saturate(color, amount) {\n const hsl = Color.rgbToHsl(color.r, color.g, color.b);\n hsl.s = Math.min(1, hsl.s + amount);\n const rgb = Color.hslToRgb(hsl.h, hsl.s, hsl.l);\n return new Color(rgb.r, rgb.g, rgb.b, color.a);\n }\n /**\n * Desaturate a color\n * 降低颜色饱和度\n */\n static desaturate(color, amount) {\n const hsl = Color.rgbToHsl(color.r, color.g, color.b);\n hsl.s = Math.max(0, hsl.s - amount);\n const rgb = Color.hslToRgb(hsl.h, hsl.s, hsl.l);\n return new Color(rgb.r, rgb.g, rgb.b, color.a);\n }\n /**\n * Invert a color\n * 反转颜色\n */\n static invert(color) {\n return new Color(255 - color.r, 255 - color.g, 255 - color.b, color.a);\n }\n /**\n * Convert color to grayscale\n * 将颜色转换为灰度\n */\n static grayscale(color) {\n const gray = Math.round(0.299 * color.r + 0.587 * color.g + 0.114 * color.b);\n return new Color(gray, gray, gray, color.a);\n }\n /**\n * Get color luminance (perceived brightness)\n * 获取颜色亮度(感知亮度)\n */\n static luminance(color) {\n return (0.299 * color.r + 0.587 * color.g + 0.114 * color.b) / 255;\n }\n /**\n * Get contrast ratio between two colors\n * 获取两个颜色之间的对比度\n */\n static contrastRatio(color1, color2) {\n const l1 = Color.luminance(color1);\n const l2 = Color.luminance(color2);\n const lighter = Math.max(l1, l2);\n const darker = Math.min(l1, l2);\n return (lighter + 0.05) / (darker + 0.05);\n }\n // ===== Instance Methods | 实例方法 =====\n /**\n * Convert to hex string\n * 转换为十六进制字符串\n */\n toHex() {\n return Color.rgbToHex(this.r, this.g, this.b);\n }\n /**\n * Convert to hex string with alpha\n * 转换为带透明度的十六进制字符串\n */\n toHexAlpha() {\n const alphaHex = Math.round(this.a * 255).toString(16).padStart(2, '0');\n return `#${alphaHex}${this.toHex().slice(1)}`;\n }\n /**\n * Convert to CSS rgba string\n * 转换为 CSS rgba 字符串\n */\n toRgba() {\n return `rgba(${this.r}, ${this.g}, ${this.b}, ${this.a})`;\n }\n /**\n * Convert to CSS rgb string\n * 转换为 CSS rgb 字符串\n */\n toRgb() {\n return `rgb(${this.r}, ${this.g}, ${this.b})`;\n }\n /**\n * Convert to HSL\n * 转换为 HSL\n */\n toHSL() {\n return Color.rgbToHsl(this.r, this.g, this.b);\n }\n /**\n * Pack to uint32 (0xRRGGBB)\n * 打包为 uint32 (0xRRGGBB)\n */\n toUint32() {\n return Color.packRGB(this.r, this.g, this.b);\n }\n /**\n * Pack to uint32 with alpha (0xAARRGGBB)\n * 打包为带透明度的 uint32 (0xAARRGGBB)\n */\n toUint32Alpha() {\n return Color.packARGB(this.r, this.g, this.b, this.a);\n }\n /**\n * Pack to WebGL uint32 (0xAABBGGRR)\n * 打包为 WebGL 格式 uint32 (0xAABBGGRR)\n */\n toWebGL() {\n return Color.packABGR(this.r, this.g, this.b, this.a);\n }\n /**\n * Get normalized float array [r, g, b, a] (0-1)\n * 获取归一化浮点数组 [r, g, b, a] (0-1)\n */\n toFloatArray() {\n return [this.r / 255, this.g / 255, this.b / 255, this.a];\n }\n /**\n * Clone this color\n * 克隆此颜色\n */\n clone() {\n return new Color(this.r, this.g, this.b, this.a);\n }\n /**\n * Set color values\n * 设置颜色值\n */\n set(r, g, b, a) {\n this.r = Math.round(Math.max(0, Math.min(255, r)));\n this.g = Math.round(Math.max(0, Math.min(255, g)));\n this.b = Math.round(Math.max(0, Math.min(255, b)));\n if (a !== undefined) {\n this.a = Math.max(0, Math.min(1, a));\n }\n return this;\n }\n /**\n * Copy from another color\n * 从另一个颜色复制\n */\n copy(other) {\n this.r = other.r;\n this.g = other.g;\n this.b = other.b;\n this.a = other.a;\n return this;\n }\n /**\n * Check equality with another color\n * 检查与另一个颜色是否相等\n */\n equals(other) {\n return this.r === other.r && this.g === other.g && this.b === other.b && this.a === other.a;\n }\n /**\n * String representation\n * 字符串表示\n */\n toString() {\n return `Color(${this.r}, ${this.g}, ${this.b}, ${this.a})`;\n }\n}\n// ===== Predefined Colors | 预定义颜色 =====\n/** White (0xFFFFFF) | 白色 */\nColor.WHITE = new Color(255, 255, 255);\n/** Black (0x000000) | 黑色 */\nColor.BLACK = new Color(0, 0, 0);\n/** Red (0xFF0000) | 红色 */\nColor.RED = new Color(255, 0, 0);\n/** Green (0x00FF00) | 绿色 */\nColor.GREEN = new Color(0, 255, 0);\n/** Blue (0x0000FF) | 蓝色 */\nColor.BLUE = new Color(0, 0, 255);\n/** Yellow (0xFFFF00) | 黄色 */\nColor.YELLOW = new Color(255, 255, 0);\n/** Cyan (0x00FFFF) | 青色 */\nColor.CYAN = new Color(0, 255, 255);\n/** Magenta (0xFF00FF) | 品红色 */\nColor.MAGENTA = new Color(255, 0, 255);\n/** Transparent (0x00000000) | 透明 */\nColor.TRANSPARENT = new Color(0, 0, 0, 0);\n/** Gray (0x808080) | 灰色 */\nColor.GRAY = new Color(128, 128, 128);\n//# sourceMappingURL=Color.js.map","/**\n * 缓动函数集合\n *\n * 提供各种常用的缓动函数,用于创建平滑的动画效果\n * 所有函数接受时间参数 t (0-1),返回缓动后的值 (通常0-1)\n */\nexport class Easing {\n // 线性缓动\n /**\n * 线性缓动(无缓动)\n * @param t 时间参数 (0-1)\n * @returns 缓动值\n */\n static linear(t) {\n return t;\n }\n // 二次方缓动 (Quadratic)\n /**\n * 二次方缓入\n * @param t 时间参数 (0-1)\n * @returns 缓动值\n */\n static quadIn(t) {\n return t * t;\n }\n /**\n * 二次方缓出\n * @param t 时间参数 (0-1)\n * @returns 缓动值\n */\n static quadOut(t) {\n return 1 - (1 - t) * (1 - t);\n }\n /**\n * 二次方缓入缓出\n * @param t 时间参数 (0-1)\n * @returns 缓动值\n */\n static quadInOut(t) {\n return t < 0.5 ? 2 * t * t : 1 - 2 * (1 - t) * (1 - t);\n }\n // 三次方缓动 (Cubic)\n /**\n * 三次方缓入\n * @param t 时间参数 (0-1)\n * @returns 缓动值\n */\n static cubicIn(t) {\n return t * t * t;\n }\n /**\n * 三次方缓出\n * @param t 时间参数 (0-1)\n * @returns 缓动值\n */\n static cubicOut(t) {\n return 1 - Math.pow(1 - t, 3);\n }\n /**\n * 三次方缓入缓出\n * @param t 时间参数 (0-1)\n * @returns 缓动值\n */\n static cubicInOut(t) {\n return t < 0.5 ? 4 * t * t * t : 1 - Math.pow(-2 * t + 2, 3) / 2;\n }\n // 四次方缓动 (Quartic)\n /**\n * 四次方缓入\n * @param t 时间参数 (0-1)\n * @returns 缓动值\n */\n static quartIn(t) {\n return t * t * t * t;\n }\n /**\n * 四次方缓出\n * @param t 时间参数 (0-1)\n * @returns 缓动值\n */\n static quartOut(t) {\n return 1 - Math.pow(1 - t, 4);\n }\n /**\n * 四次方缓入缓出\n * @param t 时间参数 (0-1)\n * @returns 缓动值\n */\n static quartInOut(t) {\n return t < 0.5 ? 8 * t * t * t * t : 1 - Math.pow(-2 * t + 2, 4) / 2;\n }\n // 五次方缓动 (Quintic)\n /**\n * 五次方缓入\n * @param t 时间参数 (0-1)\n * @returns 缓动值\n */\n static quintIn(t) {\n return t * t * t * t * t;\n }\n /**\n * 五次方缓出\n * @param t 时间参数 (0-1)\n * @returns 缓动值\n */\n static quintOut(t) {\n return 1 - Math.pow(1 - t, 5);\n }\n /**\n * 五次方缓入缓出\n * @param t 时间参数 (0-1)\n * @returns 缓动值\n */\n static quintInOut(t) {\n return t < 0.5 ? 16 * t * t * t * t * t : 1 - Math.pow(-2 * t + 2, 5) / 2;\n }\n // 正弦缓动 (Sine)\n /**\n * 正弦缓入\n * @param t 时间参数 (0-1)\n * @returns 缓动值\n */\n static sineIn(t) {\n return 1 - Math.cos((t * Math.PI) / 2);\n }\n /**\n * 正弦缓出\n * @param t 时间参数 (0-1)\n * @returns 缓动值\n */\n static sineOut(t) {\n return Math.sin((t * Math.PI) / 2);\n }\n /**\n * 正弦缓入缓出\n * @param t 时间参数 (0-1)\n * @returns 缓动值\n */\n static sineInOut(t) {\n return -(Math.cos(Math.PI * t) - 1) / 2;\n }\n // 指数缓动 (Exponential)\n /**\n * 指数缓入\n * @param t 时间参数 (0-1)\n * @returns 缓动值\n */\n static expoIn(t) {\n return t === 0 ? 0 : Math.pow(2, 10 * (t - 1));\n }\n /**\n * 指数缓出\n * @param t 时间参数 (0-1)\n * @returns 缓动值\n */\n static expoOut(t) {\n return t === 1 ? 1 : 1 - Math.pow(2, -10 * t);\n }\n /**\n * 指数缓入缓出\n * @param t 时间参数 (0-1)\n * @returns 缓动值\n */\n static expoInOut(t) {\n if (t === 0)\n return 0;\n if (t === 1)\n return 1;\n return t < 0.5\n ? Math.pow(2, 20 * t - 10) / 2\n : (2 - Math.pow(2, -20 * t + 10)) / 2;\n }\n // 圆形缓动 (Circular)\n /**\n * 圆形缓入\n * @param t 时间参数 (0-1)\n * @returns 缓动值\n */\n static circIn(t) {\n return 1 - Math.sqrt(1 - t * t);\n }\n /**\n * 圆形缓出\n * @param t 时间参数 (0-1)\n * @returns 缓动值\n */\n static circOut(t) {\n return Math.sqrt(1 - (t - 1) * (t - 1));\n }\n /**\n * 圆形缓入缓出\n * @param t 时间参数 (0-1)\n * @returns 缓动值\n */\n static circInOut(t) {\n return t < 0.5\n ? (1 - Math.sqrt(1 - 4 * t * t)) / 2\n : (Math.sqrt(1 - (-2 * t + 2) * (-2 * t + 2)) + 1) / 2;\n }\n // 回弹缓动 (Back)\n /**\n * 回弹缓入\n * @param t 时间参数 (0-1)\n * @param s 回弹强度,默认1.70158\n * @returns 缓动值\n */\n static backIn(t, s = 1.70158) {\n const c1 = s;\n const c3 = c1 + 1;\n return c3 * t * t * t - c1 * t * t;\n }\n /**\n * 回弹缓出\n * @param t 时间参数 (0-1)\n * @param s 回弹强度,默认1.70158\n * @returns 缓动值\n */\n static backOut(t, s = 1.70158) {\n const c1 = s;\n const c3 = c1 + 1;\n return 1 + c3 * Math.pow(t - 1, 3) + c1 * Math.pow(t - 1, 2);\n }\n /**\n * 回弹缓入缓出\n * @param t 时间参数 (0-1)\n * @param s 回弹强度,默认1.70158\n * @returns 缓动值\n */\n static backInOut(t, s = 1.70158) {\n const c1 = s;\n const c2 = c1 * 1.525;\n return t < 0.5\n ? (Math.pow(2 * t, 2) * ((c2 + 1) * 2 * t - c2)) / 2\n : (Math.pow(2 * t - 2, 2) * ((c2 + 1) * (t * 2 - 2) + c2) + 2) / 2;\n }\n // 弹性缓动 (Elastic)\n /**\n * 弹性缓入\n * @param t 时间参数 (0-1)\n * @param amplitude 振幅,默认1\n * @param period 周期,默认0.3\n * @returns 缓动值\n */\n static elasticIn(t, amplitude = 1, period = 0.3) {\n if (t === 0)\n return 0;\n if (t === 1)\n return 1;\n const s = period / 4;\n return -(amplitude * Math.pow(2, 10 * (t - 1)) * Math.sin((t - 1 - s) * (2 * Math.PI) / period));\n }\n /**\n * 弹性缓出\n * @param t 时间参数 (0-1)\n * @param amplitude 振幅,默认1\n * @param period 周期,默认0.3\n * @returns 缓动值\n */\n static elasticOut(t, amplitude = 1, period = 0.3) {\n if (t === 0)\n return 0;\n if (t === 1)\n return 1;\n const s = period / 4;\n return amplitude * Math.pow(2, -10 * t) * Math.sin((t - s) * (2 * Math.PI) / period) + 1;\n }\n /**\n * 弹性缓入缓出\n * @param t 时间参数 (0-1)\n * @param amplitude 振幅,默认1\n * @param period 周期,默认0.45\n * @returns 缓动值\n */\n static elasticInOut(t, amplitude = 1, period = 0.45) {\n if (t === 0)\n return 0;\n if (t === 1)\n return 1;\n const s = period / 4;\n if (t < 0.5) {\n return -0.5 * (amplitude * Math.pow(2, 10 * (2 * t - 1)) * Math.sin((2 * t - 1 - s) * (2 * Math.PI) / period));\n }\n return amplitude * Math.pow(2, -10 * (2 * t - 1)) * Math.sin((2 * t - 1 - s) * (2 * Math.PI) / period) * 0.5 + 1;\n }\n // 跳跃缓动 (Bounce)\n /**\n * 跳跃缓入\n * @param t 时间参数 (0-1)\n * @returns 缓动值\n */\n static bounceIn(t) {\n return 1 - Easing.bounceOut(1 - t);\n }\n /**\n * 跳跃缓出\n * @param t 时间参数 (0-1)\n * @returns 缓动值\n */\n static bounceOut(t) {\n const n1 = 7.5625;\n const d1 = 2.75;\n if (t < 1 / d1) {\n return n1 * t * t;\n }\n else if (t < 2 / d1) {\n return n1 * (t -= 1.5 / d1) * t + 0.75;\n }\n else if (t < 2.5 / d1) {\n return n1 * (t -= 2.25 / d1) * t + 0.9375;\n }\n else {\n return n1 * (t -= 2.625 / d1) * t + 0.984375;\n }\n }\n /**\n * 跳跃缓入缓出\n * @param t 时间参数 (0-1)\n * @returns 缓动值\n */\n static bounceInOut(t) {\n return t < 0.5\n ? (1 - Easing.bounceOut(1 - 2 * t)) / 2\n : (1 + Easing.bounceOut(2 * t - 1)) / 2;\n }\n // 组合缓动\n /**\n * 创建自定义缓动函数(组合多个缓动)\n * @param easingFunctions 缓动函数数组\n * @param weights 权重数组,默认均等\n * @returns 组合后的缓动函数\n */\n static combine(easingFunctions, weights) {\n if (!weights) {\n weights = new Array(easingFunctions.length).fill(1 / easingFunctions.length);\n }\n return (t) => {\n let result = 0;\n for (let i = 0; i < easingFunctions.length; i++) {\n result += easingFunctions[i](t) * (weights[i] || 0);\n }\n return result;\n };\n }\n /**\n * 创建分段缓动函数\n * @param segments 分段配置数组,每段包含 {duration, easing}\n * @returns 分段缓动函数\n */\n static piecewise(segments) {\n // 计算总持续时间\n const totalDuration = segments.reduce((sum, seg) => sum + seg.duration, 0);\n // 归一化持续时间\n const normalizedSegments = segments.map((seg) => ({\n ...seg,\n duration: seg.duration / totalDuration\n }));\n return (t) => {\n let accumulatedTime = 0;\n for (const segment of normalizedSegments) {\n if (t <= accumulatedTime + segment.duration) {\n const localT = (t - accumulatedTime) / segment.duration;\n return segment.easing(Math.max(0, Math.min(1, localT)));\n }\n accumulatedTime += segment.duration;\n }\n // 如果超出范围,返回最后一段的结束值\n return normalizedSegments[normalizedSegments.length - 1].easing(1);\n };\n }\n /**\n * 创建反向缓动函数\n * @param easing 原缓动函数\n * @returns 反向缓动函数\n */\n static reverse(easing) {\n return (t) => 1 - easing(1 - t);\n }\n /**\n * 创建镜像缓动函数(先正向再反向)\n * @param easing 原缓动函数\n * @returns 镜像缓动函数\n */\n static mirror(easing) {\n return (t) => {\n if (t < 0.5) {\n return easing(t * 2);\n }\n else {\n return easing(2 - t * 2);\n }\n };\n }\n}\n// 常用预设\n/** 平滑进入(常用于UI动画) */\nEasing.smoothIn = Easing.quadOut;\n/** 平滑退出(常用于UI动画) */\nEasing.smoothOut = Easing.quadIn;\n/** 快速进入(常用于出现动画) */\nEasing.quickIn = Easing.cubicOut;\n/** 快速退出(常用于消失动画) */\nEasing.quickOut = Easing.cubicIn;\n/** 自然运动(模拟物理) */\nEasing.natural = Easing.quartOut;\n/** 强调效果(吸引注意力) */\nEasing.emphasize = Easing.backOut;\n//# sourceMappingURL=Easing.js.map","import { Vector2 } from '../Vector2';\nimport { MathUtils } from '../MathUtils';\n/**\n * 带缓存的插值器类\n * 用于需要重复插值相同起始和目标值的情况\n */\nexport class CachedInterpolator {\n constructor(interpolator) {\n this.cache = new Map();\n this.interpolator = interpolator;\n }\n /**\n * 设置插值范围\n * @param from 起始值\n * @param to 目标值\n */\n setRange(from, to) {\n if (this.from !== from || this.to !== to) {\n this.from = from;\n this.to = to;\n this.cache.clear();\n }\n }\n /**\n * 获取插值结果\n * @param t 插值参数\n * @returns 插值结果\n */\n get(t) {\n if (!this.from || !this.to) {\n throw new Error('插值范围未设置');\n }\n if (!this.cache.has(t)) {\n const result = this.interpolator(this.from, this.to, t);\n this.cache.set(t, result);\n }\n return this.cache.get(t);\n }\n /**\n * 清空缓存\n */\n clearCache() {\n this.cache.clear();\n }\n}\n/**\n * 插值工具类\n *\n * 提供各种类型的插值功能,用于创建平滑的数值变化\n */\nexport class Interpolation {\n // 基础插值\n /**\n * 数值线性插值\n * @param from 起始值\n * @param to 目标值\n * @param t 插值参数 (0-1)\n * @returns 插值结果\n */\n static number(from, to, t) {\n return MathUtils.lerp(from, to, t);\n }\n /**\n * 向量线性插值\n * @param from 起始向量\n * @param to 目标向量\n * @param t 插值参数 (0-1)\n * @returns 插值结果向量\n */\n static vector2(from, to, t) {\n return Vector2.lerp(from, to, t);\n }\n /**\n * 角度插值(处理角度环绕)\n * @param from 起始角度(弧度)\n * @param to 目标角度(弧度)\n * @param t 插值参数 (0-1)\n * @returns 插值结果角度\n */\n static angle(from, to, t) {\n return MathUtils.lerpAngle(from, to, t);\n }\n /**\n * 颜色插值(RGB)\n * @param from 起始颜色 [r, g, b, a?]\n * @param to 目标颜色 [r, g, b, a?]\n * @param t 插值参数 (0-1)\n * @returns 插值结果颜色\n */\n static color(from, to, t) {\n const result = [];\n const length = Math.max(from.length, to.length);\n for (let i = 0; i < length; i++) {\n const fromVal = from[i] ?? (i === 3 ? 1 : 0); // alpha默认为1\n const toVal = to[i] ?? (i === 3 ? 1 : 0);\n result[i] = MathUtils.lerp(fromVal, toVal, t);\n }\n return result;\n }\n // 高级插值\n /**\n * 三次样条插值\n * @param p0 控制点0\n * @param p1 控制点1(起点)\n * @param p2 控制点2(终点)\n * @param p3 控制点3\n * @param t 插值参数 (0-1)\n * @returns 插值结果\n */\n static cubicSpline(p0, p1, p2, p3, t) {\n const t2 = t * t;\n const t3 = t2 * t;\n return 0.5 * ((2 * p1) +\n (-p0 + p2) * t +\n (2 * p0 - 5 * p1 + 4 * p2 - p3) * t2 +\n (-p0 + 3 * p1 - 3 * p2 + p3) * t3);\n }\n /**\n * Hermite插值\n * @param p0 起始点\n * @param m0 起始切线\n * @param p1 结束点\n * @param m1 结束切线\n * @param t 插值参数 (0-1)\n * @returns 插值结果\n */\n static hermite(p0, m0, p1, m1, t) {\n const t2 = t * t;\n const t3 = t2 * t;\n const h00 = 2 * t3 - 3 * t2 + 1;\n const h10 = t3 - 2 * t2 + t;\n const h01 = -2 * t3 + 3 * t2;\n const h11 = t3 - t2;\n return h00 * p0 + h10 * m0 + h01 * p1 + h11 * m1;\n }\n /**\n * 球面线性插值(适用于方向向量)\n * @param from 起始单位向量\n * @param to 目标单位向量\n * @param t 插值参数 (0-1)\n * @returns 插值结果向量\n */\n static slerp(from, to, t) {\n let dot = Vector2.dot(from, to);\n // 如果点积为负,取反一个向量确保走最短路径\n let toVec = to;\n if (dot < 0) {\n dot = -dot;\n toVec = to.clone().negate();\n }\n // 如果向量几乎平行,使用线性插值\n if (dot > 0.9995) {\n return Vector2.lerp(from, toVec, t).normalize();\n }\n // 球面插值\n const theta = Math.acos(Math.abs(dot));\n const sinTheta = Math.sin(theta);\n const a = Math.sin((1 - t) * theta) / sinTheta;\n const b = Math.sin(t * theta) / sinTheta;\n return new Vector2(from.x * a + toVec.x * b, from.y * a + toVec.y * b);\n }\n // 缓存插值\n /**\n * 创建带缓存的插值器\n * 用于需要重复插值相同起始和目标值的情况\n * @param interpolator 插值函数\n * @returns 缓存插值器实例\n */\n static createCachedInterpolator(interpolator) {\n return new CachedInterpolator(interpolator);\n }\n // 多点插值\n /**\n * 样条曲线插值(通过多个控制点)\n * @param points 控制点数组\n * @param t 插值参数 (0-1)\n * @returns 插值结果\n */\n static spline(points, t) {\n if (points.length === 0)\n return 0;\n if (points.length === 1)\n return points[0];\n if (points.length === 2)\n return MathUtils.lerp(points[0], points[1], t);\n const n = points.length - 1;\n const scaledT = t * n;\n const segment = Math.floor(scaledT);\n const localT = scaledT - segment;\n const i = Math.max(0, Math.min(n - 1, segment));\n const p0 = points[Math.max(0, i - 1)];\n const p1 = points[i];\n const p2 = points[Math.min(n, i + 1)];\n const p3 = points[Math.min(n, i + 2)];\n return Interpolation.cubicSpline(p0, p1, p2, p3, localT);\n }\n /**\n * 向量样条曲线插值\n * @param points 控制点数组\n * @param t 插值参数 (0-1)\n * @returns 插值结果向量\n */\n static vectorSpline(points, t) {\n if (points.length === 0)\n return new Vector2();\n if (points.length === 1)\n return points[0].clone();\n if (points.length === 2)\n return Vector2.lerp(points[0], points[1], t);\n const xPoints = points.map((p) => p.x);\n const yPoints = points.map((p) => p.y);\n return new Vector2(Interpolation.spline(xPoints, t), Interpolation.spline(yPoints, t));\n }\n // 时间轴插值\n /**\n * 关键帧动画插值\n * @param keyframes 关键帧数组(按时间排序)\n * @param time 当前时间\n * @param interpolator 插值函数\n * @returns 插值结果\n */\n static keyframe(keyframes, time, interpolator) {\n if (keyframes.length === 0) {\n throw new Error('至少需要一个关键帧');\n }\n if (keyframes.length === 1 || time <= keyframes[0].time) {\n return keyframes[0].value;\n }\n if (time >= keyframes[keyframes.length - 1].time) {\n return keyframes[keyframes.length - 1].value;\n }\n // 找到当前时间所在的区间\n for (let i = 0; i < keyframes.length - 1; i++) {\n const current = keyframes[i];\n const next = keyframes[i + 1];\n if (time >= current.time && time <= next.time) {\n const duration = next.time - current.time;\n const progress = duration > 0 ? (time - current.time) / duration : 0;\n // 应用缓动函数\n const easedProgress = current.easing ? current.easing(progress) : progress;\n return interpolator(current.value, next.value, easedProgress);\n }\n }\n return keyframes[keyframes.length - 1].value;\n }\n // 路径插值\n /**\n * 路径插值(沿着由点组成的路径)\n * @param path 路径点数组\n * @param t 插值参数 (0-1)\n * @param closed 是否为闭合路径\n * @returns 路径上的点\n */\n static pathInterpolation(path, t, closed = false) {\n if (path.length === 0)\n return new Vector2();\n if (path.length === 1)\n return path[0].clone();\n const totalLength = Interpolation.getPathLength(path, closed);\n const targetDistance = t * totalLength;\n let accumulatedDistance = 0;\n const segments = closed ? path.length : path.length - 1;\n for (let i = 0; i < segments; i++) {\n const start = path[i];\n const end = path[(i + 1) % path.length];\n const segmentLength = Vector2.distance(start, end);\n if (accumulatedDistance + segmentLength >= targetDistance) {\n const segmentT = (targetDistance - accumulatedDistance) / segmentLength;\n return Vector2.lerp(start, end, segmentT);\n }\n accumulatedDistance += segmentLength;\n }\n return path[path.length - 1].clone();\n }\n /**\n * 计算路径总长度\n * @param path 路径点数组\n * @param closed 是否为闭合路径\n * @returns 路径总长度\n */\n static getPathLength(path, closed = false) {\n if (path.length < 2)\n return 0;\n let totalLength = 0;\n const segments = closed ? path.length : path.length - 1;\n for (let i = 0; i < segments; i++) {\n const start = path[i];\n const end = path[(i + 1) % path.length];\n totalLength += Vector2.distance(start, end);\n }\n return totalLength;\n }\n // 实用工具\n /**\n * 创建数值插值器\n * @param from 起始值\n * @param to 目标值\n * @returns 插值器函数\n */\n static createNumberInterpolator(from, to) {\n return (t) => Interpolation.number(from, to, t);\n }\n /**\n * 创建向量插值器\n * @param from 起始向量\n * @param to 目标向量\n * @returns 插值器函数\n */\n static createVectorInterpolator(from, to) {\n return (t) => Interpolation.vector2(from, to, t);\n }\n /**\n * 创建组合插值器(插值多个值)\n * @param interpolators 插值器数组\n * @returns 组合插值器函数\n */\n static createCompositeInterpolator(interpolators) {\n return (from, to, t) => {\n const result = [];\n for (let i = 0; i < Math.min(interpolators.length, from.length, to.length); i++) {\n result[i] = interpolators[i](from[i], to[i], t);\n }\n return result;\n };\n }\n}\n//# sourceMappingURL=Interpolation.js.map","/**\n * @zh Vector2 蓝图节点\n * @en Vector2 Blueprint Nodes\n */\nimport { Vector2 } from '../Vector2';\n// Make Vector2\nexport const MakeVector2Template = {\n type: 'MakeVector2',\n title: 'Make Vector2',\n category: 'math',\n description: 'Creates a Vector2 from X and Y',\n keywords: ['make', 'create', 'vector', 'vector2'],\n menuPath: ['Math', 'Vector', 'Make Vector2'],\n isPure: true,\n inputs: [\n { name: 'x', displayName: 'X', type: 'float', defaultValue: 0 },\n { name: 'y', displayName: 'Y', type: 'float', defaultValue: 0 }\n ],\n outputs: [\n { name: 'vector', displayName: 'Vector', type: 'vector2' }\n ],\n color: '#2196F3'\n};\nexport class MakeVector2Executor {\n execute(node, context) {\n const ctx = context;\n const x = Number(ctx.evaluateInput(node.id, 'x', 0));\n const y = Number(ctx.evaluateInput(node.id, 'y', 0));\n return { outputs: { vector: new Vector2(x, y) } };\n }\n}\n// Break Vector2\nexport const BreakVector2Template = {\n type: 'BreakVector2',\n title: 'Break Vector2',\n category: 'math',\n description: 'Breaks a Vector2 into X and Y',\n keywords: ['break', 'split', 'vector', 'vector2'],\n menuPath: ['Math', 'Vector', 'Break Vector2'],\n isPure: true,\n inputs: [\n { name: 'vector', displayName: 'Vector', type: 'vector2' }\n ],\n outputs: [\n { name: 'x', displayName: 'X', type: 'float' },\n { name: 'y', displayName: 'Y', type: 'float' }\n ],\n color: '#2196F3'\n};\nexport class BreakVector2Executor {\n execute(node, context) {\n const ctx = context;\n const vector = ctx.evaluateInput(node.id, 'vector', Vector2.ZERO);\n return { outputs: { x: vector?.x ?? 0, y: vector?.y ?? 0 } };\n }\n}\n// Vector2 Add\nexport const Vector2AddTemplate = {\n type: 'Vector2Add',\n title: 'Vector2 +',\n category: 'math',\n description: 'Adds two vectors',\n keywords: ['add', 'plus', 'vector'],\n menuPath: ['Math', 'Vector', 'Add'],\n isPure: true,\n inputs: [\n { name: 'a', displayName: 'A', type: 'vector2' },\n { name: 'b', displayName: 'B', type: 'vector2' }\n ],\n outputs: [\n { name: 'result', displayName: 'Result', type: 'vector2' }\n ],\n color: '#2196F3'\n};\nexport class Vector2AddExecutor {\n execute(node, context) {\n const ctx = context;\n const a = ctx.evaluateInput(node.id, 'a', Vector2.ZERO);\n const b = ctx.evaluateInput(node.id, 'b', Vector2.ZERO);\n return { outputs: { result: Vector2.add(a ?? Vector2.ZERO, b ?? Vector2.ZERO) } };\n }\n}\n// Vector2 Subtract\nexport const Vector2SubtractTemplate = {\n type: 'Vector2Subtract',\n title: 'Vector2 -',\n category: 'math',\n description: 'Subtracts B from A',\n keywords: ['subtract', 'minus', 'vector'],\n menuPath: ['Math', 'Vector', 'Subtract'],\n isPure: true,\n inputs: [\n { name: 'a', displayName: 'A', type: 'vector2' },\n { name: 'b', displayName: 'B', type: 'vector2' }\n ],\n outputs: [\n { name: 'result', displayName: 'Result', type: 'vector2' }\n ],\n color: '#2196F3'\n};\nexport class Vector2SubtractExecutor {\n execute(node, context) {\n const ctx = context;\n const a = ctx.evaluateInput(node.id, 'a', Vector2.ZERO);\n const b = ctx.evaluateInput(node.id, 'b', Vector2.ZERO);\n return { outputs: { result: Vector2.subtract(a ?? Vector2.ZERO, b ?? Vector2.ZERO) } };\n }\n}\n// Vector2 Scale\nexport const Vector2ScaleTemplate = {\n type: 'Vector2Scale',\n title: 'Vector2 *',\n category: 'math',\n description: 'Scales a vector by a scalar',\n keywords: ['scale', 'multiply', 'vector'],\n menuPath: ['Math', 'Vector', 'Scale'],\n isPure: true,\n inputs: [\n { name: 'vector', displayName: 'Vector', type: 'vector2' },\n { name: 'scalar', displayName: 'Scalar', type: 'float', defaultValue: 1 }\n ],\n outputs: [\n { name: 'result', displayName: 'Result', type: 'vector2' }\n ],\n color: '#2196F3'\n};\nexport class Vector2ScaleExecutor {\n execute(node, context) {\n const ctx = context;\n const vector = ctx.evaluateInput(node.id, 'vector', Vector2.ZERO);\n const scalar = Number(ctx.evaluateInput(node.id, 'scalar', 1));\n return { outputs: { result: Vector2.multiply(vector ?? Vector2.ZERO, scalar) } };\n }\n}\n// Vector2 Length\nexport const Vector2LengthTemplate = {\n type: 'Vector2Length',\n title: 'Vector2 Length',\n category: 'math',\n description: 'Gets the length of a vector',\n keywords: ['length', 'magnitude', 'vector'],\n menuPath: ['Math', 'Vector', 'Length'],\n isPure: true,\n inputs: [\n { name: 'vector', displayName: 'Vector', type: 'vector2' }\n ],\n outputs: [\n { name: 'length', displayName: 'Length', type: 'float' }\n ],\n color: '#2196F3'\n};\nexport class Vector2LengthExecutor {\n execute(node, context) {\n const ctx = context;\n const vector = ctx.evaluateInput(node.id, 'vector', Vector2.ZERO);\n return { outputs: { length: (vector ?? Vector2.ZERO).length } };\n }\n}\n// Vector2 Normalize\nexport const Vector2NormalizeTemplate = {\n type: 'Vector2Normalize',\n title: 'Vector2 Normalize',\n category: 'math',\n description: 'Normalizes a vector to unit length',\n keywords: ['normalize', 'unit', 'vector'],\n menuPath: ['Math', 'Vector', 'Normalize'],\n isPure: true,\n inputs: [\n { name: 'vector', displayName: 'Vector', type: 'vector2' }\n ],\n outputs: [\n { name: 'result', displayName: 'Result', type: 'vector2' }\n ],\n color: '#2196F3'\n};\nexport class Vector2NormalizeExecutor {\n execute(node, context) {\n const ctx = context;\n const vector = ctx.evaluateInput(node.id, 'vector', Vector2.ZERO);\n return { outputs: { result: (vector ?? Vector2.ZERO).normalized() } };\n }\n}\n// Vector2 Dot\nexport const Vector2DotTemplate = {\n type: 'Vector2Dot',\n title: 'Vector2 Dot',\n category: 'math',\n description: 'Calculates dot product',\n keywords: ['dot', 'product', 'vector'],\n menuPath: ['Math', 'Vector', 'Dot Product'],\n isPure: true,\n inputs: [\n { name: 'a', displayName: 'A', type: 'vector2' },\n { name: 'b', displayName: 'B', type: 'vector2' }\n ],\n outputs: [\n { name: 'result', displayName: 'Result', type: 'float' }\n ],\n color: '#2196F3'\n};\nexport class Vector2DotExecutor {\n execute(node, context) {\n const ctx = context;\n const a = ctx.evaluateInput(node.id, 'a', Vector2.ZERO);\n const b = ctx.evaluateInput(node.id, 'b', Vector2.ZERO);\n return { outputs: { result: Vector2.dot(a ?? Vector2.ZERO, b ?? Vector2.ZERO) } };\n }\n}\n// Vector2 Cross\nexport const Vector2CrossTemplate = {\n type: 'Vector2Cross',\n title: 'Vector2 Cross',\n category: 'math',\n description: '2D cross product (returns scalar)',\n keywords: ['cross', 'product', 'vector'],\n menuPath: ['Math', 'Vector', 'Cross Product'],\n isPure: true,\n inputs: [\n { name: 'a', displayName: 'A', type: 'vector2' },\n { name: 'b', displayName: 'B', type: 'vector2' }\n ],\n outputs: [\n { name: 'result', displayName: 'Result', type: 'float' }\n ],\n color: '#2196F3'\n};\nexport class Vector2CrossExecutor {\n execute(node, context) {\n const ctx = context;\n const a = ctx.evaluateInput(node.id, 'a', Vector2.ZERO);\n const b = ctx.evaluateInput(node.id, 'b', Vector2.ZERO);\n return { outputs: { result: Vector2.cross(a ?? Vector2.ZERO, b ?? Vector2.ZERO) } };\n }\n}\n// Vector2 Distance\nexport const Vector2DistanceTemplate = {\n type: 'Vector2Distance',\n title: 'Vector2 Distance',\n category: 'math',\n description: 'Distance between two points',\n keywords: ['distance', 'length', 'vector'],\n menuPath: ['Math', 'Vector', 'Distance'],\n isPure: true,\n inputs: [\n { name: 'a', displayName: 'A', type: 'vector2' },\n { name: 'b', displayName: 'B', type: 'vector2' }\n ],\n outputs: [\n { name: 'distance', displayName: 'Distance', type: 'float' }\n ],\n color: '#2196F3'\n};\nexport class Vector2DistanceExecutor {\n execute(node, context) {\n const ctx = context;\n const a = ctx.evaluateInput(node.id, 'a', Vector2.ZERO);\n const b = ctx.evaluateInput(node.id, 'b', Vector2.ZERO);\n return { outputs: { distance: Vector2.distance(a ?? Vector2.ZERO, b ?? Vector2.ZERO) } };\n }\n}\n// Vector2 Lerp\nexport const Vector2LerpTemplate = {\n type: 'Vector2Lerp',\n title: 'Vector2 Lerp',\n category: 'math',\n description: 'Linear interpolation between two vectors',\n keywords: ['lerp', 'interpolate', 'vector'],\n menuPath: ['Math', 'Vector', 'Lerp'],\n isPure: true,\n inputs: [\n { name: 'a', displayName: 'A', type: 'vector2' },\n { name: 'b', displayName: 'B', type: 'vector2' },\n { name: 't', displayName: 'T', type: 'float', defaultValue: 0.5 }\n ],\n outputs: [\n { name: 'result', displayName: 'Result', type: 'vector2' }\n ],\n color: '#2196F3'\n};\nexport class Vector2LerpExecutor {\n execute(node, context) {\n const ctx = context;\n const a = ctx.evaluateInput(node.id, 'a', Vector2.ZERO);\n const b = ctx.evaluateInput(node.id, 'b', Vector2.ZERO);\n const t = Number(ctx.evaluateInput(node.id, 't', 0.5));\n return { outputs: { result: Vector2.lerp(a ?? Vector2.ZERO, b ?? Vector2.ZERO, t) } };\n }\n}\n// Vector2 Rotate\nexport const Vector2RotateTemplate = {\n type: 'Vector2Rotate',\n title: 'Vector2 Rotate',\n category: 'math',\n description: 'Rotates a vector by angle (radians)',\n keywords: ['rotate', 'turn', 'vector'],\n menuPath: ['Math', 'Vector', 'Rotate'],\n isPure: true,\n inputs: [\n { name: 'vector', displayName: 'Vector', type: 'vector2' },\n { name: 'angle', displayName: 'Angle (rad)', type: 'float', defaultValue: 0 }\n ],\n outputs: [\n { name: 'result', displayName: 'Result', type: 'vector2' }\n ],\n color: '#2196F3'\n};\nexport class Vector2RotateExecutor {\n execute(node, context) {\n const ctx = context;\n const vector = ctx.evaluateInput(node.id, 'vector', Vector2.ZERO);\n const angle = Number(ctx.evaluateInput(node.id, 'angle', 0));\n return { outputs: { result: (vector ?? Vector2.ZERO).rotated(angle) } };\n }\n}\n// Vector2 From Angle\nexport const Vector2FromAngleTemplate = {\n type: 'Vector2FromAngle',\n title: 'Vector2 From Angle',\n category: 'math',\n description: 'Creates unit vector from angle (radians)',\n keywords: ['from', 'angle', 'direction', 'vector'],\n menuPath: ['Math', 'Vector', 'From Angle'],\n isPure: true,\n inputs: [\n { name: 'angle', displayName: 'Angle (rad)', type: 'float', defaultValue: 0 }\n ],\n outputs: [\n { name: 'vector', displayName: 'Vector', type: 'vector2' }\n ],\n color: '#2196F3'\n};\nexport class Vector2FromAngleExecutor {\n execute(node, context) {\n const ctx = context;\n const angle = Number(ctx.evaluateInput(node.id, 'angle', 0));\n return { outputs: { vector: Vector2.fromAngle(angle) } };\n }\n}\n// Node definitions collection\nexport const VectorNodeDefinitions = [\n { template: MakeVector2Template, executor: new MakeVector2Executor() },\n { template: BreakVector2Template, executor: new BreakVector2Executor() },\n { template: Vector2AddTemplate, executor: new Vector2AddExecutor() },\n { template: Vector2SubtractTemplate, executor: new Vector2SubtractExecutor() },\n { template: Vector2ScaleTemplate, executor: new Vector2ScaleExecutor() },\n { template: Vector2LengthTemplate, executor: new Vector2LengthExecutor() },\n { template: Vector2NormalizeTemplate, executor: new Vector2NormalizeExecutor() },\n { template: Vector2DotTemplate, executor: new Vector2DotExecutor() },\n { template: Vector2CrossTemplate, executor: new Vector2CrossExecutor() },\n { template: Vector2DistanceTemplate, executor: new Vector2DistanceExecutor() },\n { template: Vector2LerpTemplate, executor: new Vector2LerpExecutor() },\n { template: Vector2RotateTemplate, executor: new Vector2RotateExecutor() },\n { template: Vector2FromAngleTemplate, executor: new Vector2FromAngleExecutor() }\n];\n//# sourceMappingURL=VectorNodes.js.map","/**\n * @zh Fixed32 定点数蓝图节点\n * @en Fixed32 Blueprint Nodes\n */\nimport { Fixed32 } from '../Fixed32';\n// Make Fixed32 from float\nexport const Fixed32FromTemplate = {\n type: 'Fixed32From',\n title: 'Fixed32 From Float',\n category: 'math',\n description: 'Creates Fixed32 from float',\n keywords: ['fixed', 'fixed32', 'from', 'create', 'deterministic'],\n menuPath: ['Math', 'Fixed', 'From Float'],\n isPure: true,\n inputs: [\n { name: 'value', displayName: 'Value', type: 'float', defaultValue: 0 }\n ],\n outputs: [\n { name: 'fixed', displayName: 'Fixed32', type: 'object' }\n ],\n color: '#9C27B0'\n};\nexport class Fixed32FromExecutor {\n execute(node, context) {\n const ctx = context;\n const value = Number(ctx.evaluateInput(node.id, 'value', 0));\n return { outputs: { fixed: Fixed32.from(value) } };\n }\n}\n// Make Fixed32 from int\nexport const Fixed32FromIntTemplate = {\n type: 'Fixed32FromInt',\n title: 'Fixed32 From Int',\n category: 'math',\n description: 'Creates Fixed32 from integer (no precision loss)',\n keywords: ['fixed', 'fixed32', 'from', 'int', 'integer'],\n menuPath: ['Math', 'Fixed', 'From Int'],\n isPure: true,\n inputs: [\n { name: 'value', displayName: 'Value', type: 'int', defaultValue: 0 }\n ],\n outputs: [\n { name: 'fixed', displayName: 'Fixed32', type: 'object' }\n ],\n color: '#9C27B0'\n};\nexport class Fixed32FromIntExecutor {\n execute(node, context) {\n const ctx = context;\n const value = Math.floor(Number(ctx.evaluateInput(node.id, 'value', 0)));\n return { outputs: { fixed: Fixed32.fromInt(value) } };\n }\n}\n// Fixed32 to float\nexport const Fixed32ToFloatTemplate = {\n type: 'Fixed32ToFloat',\n title: 'Fixed32 To Float',\n category: 'math',\n description: 'Converts Fixed32 to float',\n keywords: ['fixed', 'fixed32', 'to', 'float', 'convert'],\n menuPath: ['Math', 'Fixed', 'To Float'],\n isPure: true,\n inputs: [\n { name: 'fixed', displayName: 'Fixed32', type: 'object' }\n ],\n outputs: [\n { name: 'value', displayName: 'Value', type: 'float' }\n ],\n color: '#9C27B0'\n};\nexport class Fixed32ToFloatExecutor {\n execute(node, context) {\n const ctx = context;\n const fixed = ctx.evaluateInput(node.id, 'fixed', Fixed32.ZERO);\n return { outputs: { value: fixed?.toNumber() ?? 0 } };\n }\n}\n// Fixed32 to int\nexport const Fixed32ToIntTemplate = {\n type: 'Fixed32ToInt',\n title: 'Fixed32 To Int',\n category: 'math',\n description: 'Converts Fixed32 to integer (floor)',\n keywords: ['fixed', 'fixed32', 'to', 'int', 'integer'],\n menuPath: ['Math', 'Fixed', 'To Int'],\n isPure: true,\n inputs: [\n { name: 'fixed', displayName: 'Fixed32', type: 'object' }\n ],\n outputs: [\n { name: 'value', displayName: 'Value', type: 'int' }\n ],\n color: '#9C27B0'\n};\nexport class Fixed32ToIntExecutor {\n execute(node, context) {\n const ctx = context;\n const fixed = ctx.evaluateInput(node.id, 'fixed', Fixed32.ZERO);\n return { outputs: { value: fixed?.toInt() ?? 0 } };\n }\n}\n// Fixed32 Add\nexport const Fixed32AddTemplate = {\n type: 'Fixed32Add',\n title: 'Fixed32 +',\n category: 'math',\n description: 'Adds two Fixed32 values',\n keywords: ['fixed', 'add', 'plus', '+'],\n menuPath: ['Math', 'Fixed', 'Add'],\n isPure: true,\n inputs: [\n { name: 'a', displayName: 'A', type: 'object' },\n { name: 'b', displayName: 'B', type: 'object' }\n ],\n outputs: [\n { name: 'result', displayName: 'Result', type: 'object' }\n ],\n color: '#9C27B0'\n};\nexport class Fixed32AddExecutor {\n execute(node, context) {\n const ctx = context;\n const a = ctx.evaluateInput(node.id, 'a', Fixed32.ZERO);\n const b = ctx.evaluateInput(node.id, 'b', Fixed32.ZERO);\n return { outputs: { result: (a ?? Fixed32.ZERO).add(b ?? Fixed32.ZERO) } };\n }\n}\n// Fixed32 Subtract\nexport const Fixed32SubtractTemplate = {\n type: 'Fixed32Subtract',\n title: 'Fixed32 -',\n category: 'math',\n description: 'Subtracts B from A',\n keywords: ['fixed', 'subtract', 'minus', '-'],\n menuPath: ['Math', 'Fixed', 'Subtract'],\n isPure: true,\n inputs: [\n { name: 'a', displayName: 'A', type: 'object' },\n { name: 'b', displayName: 'B', type: 'object' }\n ],\n outputs: [\n { name: 'result', displayName: 'Result', type: 'object' }\n ],\n color: '#9C27B0'\n};\nexport class Fixed32SubtractExecutor {\n execute(node, context) {\n const ctx = context;\n const a = ctx.evaluateInput(node.id, 'a', Fixed32.ZERO);\n const b = ctx.evaluateInput(node.id, 'b', Fixed32.ZERO);\n return { outputs: { result: (a ?? Fixed32.ZERO).sub(b ?? Fixed32.ZERO) } };\n }\n}\n// Fixed32 Multiply\nexport const Fixed32MultiplyTemplate = {\n type: 'Fixed32Multiply',\n title: 'Fixed32 *',\n category: 'math',\n description: 'Multiplies two Fixed32 values',\n keywords: ['fixed', 'multiply', 'times', '*'],\n menuPath: ['Math', 'Fixed', 'Multiply'],\n isPure: true,\n inputs: [\n { name: 'a', displayName: 'A', type: 'object' },\n { name: 'b', displayName: 'B', type: 'object' }\n ],\n outputs: [\n { name: 'result', displayName: 'Result', type: 'object' }\n ],\n color: '#9C27B0'\n};\nexport class Fixed32MultiplyExecutor {\n execute(node, context) {\n const ctx = context;\n const a = ctx.evaluateInput(node.id, 'a', Fixed32.ONE);\n const b = ctx.evaluateInput(node.id, 'b', Fixed32.ONE);\n return { outputs: { result: (a ?? Fixed32.ONE).mul(b ?? Fixed32.ONE) } };\n }\n}\n// Fixed32 Divide\nexport const Fixed32DivideTemplate = {\n type: 'Fixed32Divide',\n title: 'Fixed32 /',\n category: 'math',\n description: 'Divides A by B',\n keywords: ['fixed', 'divide', '/'],\n menuPath: ['Math', 'Fixed', 'Divide'],\n isPure: true,\n inputs: [\n { name: 'a', displayName: 'A', type: 'object' },\n { name: 'b', displayName: 'B', type: 'object' }\n ],\n outputs: [\n { name: 'result', displayName: 'Result', type: 'object' }\n ],\n color: '#9C27B0'\n};\nexport class Fixed32DivideExecutor {\n execute(node, context) {\n const ctx = context;\n const a = ctx.evaluateInput(node.id, 'a', Fixed32.ZERO);\n const b = ctx.evaluateInput(node.id, 'b', Fixed32.ONE);\n const divisor = b ?? Fixed32.ONE;\n if (divisor.isZero()) {\n return { outputs: { result: Fixed32.ZERO } };\n }\n return { outputs: { result: (a ?? Fixed32.ZERO).div(divisor) } };\n }\n}\n// Fixed32 Negate\nexport const Fixed32NegateTemplate = {\n type: 'Fixed32Negate',\n title: 'Fixed32 Negate',\n category: 'math',\n description: 'Negates a Fixed32 value',\n keywords: ['fixed', 'negate', '-'],\n menuPath: ['Math', 'Fixed', 'Negate'],\n isPure: true,\n inputs: [\n { name: 'value', displayName: 'Value', type: 'object' }\n ],\n outputs: [\n { name: 'result', displayName: 'Result', type: 'object' }\n ],\n color: '#9C27B0'\n};\nexport class Fixed32NegateExecutor {\n execute(node, context) {\n const ctx = context;\n const value = ctx.evaluateInput(node.id, 'value', Fixed32.ZERO);\n return { outputs: { result: (value ?? Fixed32.ZERO).neg() } };\n }\n}\n// Fixed32 Abs\nexport const Fixed32AbsTemplate = {\n type: 'Fixed32Abs',\n title: 'Fixed32 Abs',\n category: 'math',\n description: 'Absolute value of Fixed32',\n keywords: ['fixed', 'abs', 'absolute'],\n menuPath: ['Math', 'Fixed', 'Abs'],\n isPure: true,\n inputs: [\n { name: 'value', displayName: 'Value', type: 'object' }\n ],\n outputs: [\n { name: 'result', displayName: 'Result', type: 'object' }\n ],\n color: '#9C27B0'\n};\nexport class Fixed32AbsExecutor {\n execute(node, context) {\n const ctx = context;\n const value = ctx.evaluateInput(node.id, 'value', Fixed32.ZERO);\n return { outputs: { result: (value ?? Fixed32.ZERO).abs() } };\n }\n}\n// Fixed32 Sqrt\nexport const Fixed32SqrtTemplate = {\n type: 'Fixed32Sqrt',\n title: 'Fixed32 Sqrt',\n category: 'math',\n description: 'Square root (deterministic)',\n keywords: ['fixed', 'sqrt', 'square', 'root'],\n menuPath: ['Math', 'Fixed', 'Sqrt'],\n isPure: true,\n inputs: [\n { name: 'value', displayName: 'Value', type: 'object' }\n ],\n outputs: [\n { name: 'result', displayName: 'Result', type: 'object' }\n ],\n color: '#9C27B0'\n};\nexport class Fixed32SqrtExecutor {\n execute(node, context) {\n const ctx = context;\n const value = ctx.evaluateInput(node.id, 'value', Fixed32.ZERO);\n return { outputs: { result: Fixed32.sqrt(value ?? Fixed32.ZERO) } };\n }\n}\n// Fixed32 Floor\nexport const Fixed32FloorTemplate = {\n type: 'Fixed32Floor',\n title: 'Fixed32 Floor',\n category: 'math',\n description: 'Floor of Fixed32',\n keywords: ['fixed', 'floor', 'round', 'down'],\n menuPath: ['Math', 'Fixed', 'Floor'],\n isPure: true,\n inputs: [\n { name: 'value', displayName: 'Value', type: 'object' }\n ],\n outputs: [\n { name: 'result', displayName: 'Result', type: 'object' }\n ],\n color: '#9C27B0'\n};\nexport class Fixed32FloorExecutor {\n execute(node, context) {\n const ctx = context;\n const value = ctx.evaluateInput(node.id, 'value', Fixed32.ZERO);\n return { outputs: { result: Fixed32.floor(value ?? Fixed32.ZERO) } };\n }\n}\n// Fixed32 Ceil\nexport const Fixed32CeilTemplate = {\n type: 'Fixed32Ceil',\n title: 'Fixed32 Ceil',\n category: 'math',\n description: 'Ceiling of Fixed32',\n keywords: ['fixed', 'ceil', 'ceiling', 'round', 'up'],\n menuPath: ['Math', 'Fixed', 'Ceil'],\n isPure: true,\n inputs: [\n { name: 'value', displayName: 'Value', type: 'object' }\n ],\n outputs: [\n { name: 'result', displayName: 'Result', type: 'object' }\n ],\n color: '#9C27B0'\n};\nexport class Fixed32CeilExecutor {\n execute(node, context) {\n const ctx = context;\n const value = ctx.evaluateInput(node.id, 'value', Fixed32.ZERO);\n return { outputs: { result: Fixed32.ceil(value ?? Fixed32.ZERO) } };\n }\n}\n// Fixed32 Round\nexport const Fixed32RoundTemplate = {\n type: 'Fixed32Round',\n title: 'Fixed32 Round',\n category: 'math',\n description: 'Rounds Fixed32 to nearest integer',\n keywords: ['fixed', 'round'],\n menuPath: ['Math', 'Fixed', 'Round'],\n isPure: true,\n inputs: [\n { name: 'value', displayName: 'Value', type: 'object' }\n ],\n outputs: [\n { name: 'result', displayName: 'Result', type: 'object' }\n ],\n color: '#9C27B0'\n};\nexport class Fixed32RoundExecutor {\n execute(node, context) {\n const ctx = context;\n const value = ctx.evaluateInput(node.id, 'value', Fixed32.ZERO);\n return { outputs: { result: Fixed32.round(value ?? Fixed32.ZERO) } };\n }\n}\n// Fixed32 Sign\nexport const Fixed32SignTemplate = {\n type: 'Fixed32Sign',\n title: 'Fixed32 Sign',\n category: 'math',\n description: 'Sign of Fixed32 (-1, 0, or 1)',\n keywords: ['fixed', 'sign'],\n menuPath: ['Math', 'Fixed', 'Sign'],\n isPure: true,\n inputs: [\n { name: 'value', displayName: 'Value', type: 'object' }\n ],\n outputs: [\n { name: 'result', displayName: 'Result', type: 'object' }\n ],\n color: '#9C27B0'\n};\nexport class Fixed32SignExecutor {\n execute(node, context) {\n const ctx = context;\n const value = ctx.evaluateInput(node.id, 'value', Fixed32.ZERO);\n return { outputs: { result: Fixed32.sign(value ?? Fixed32.ZERO) } };\n }\n}\n// Fixed32 Min\nexport const Fixed32MinTemplate = {\n type: 'Fixed32Min',\n title: 'Fixed32 Min',\n category: 'math',\n description: 'Minimum of two Fixed32 values',\n keywords: ['fixed', 'min', 'minimum'],\n menuPath: ['Math', 'Fixed', 'Min'],\n isPure: true,\n inputs: [\n { name: 'a', displayName: 'A', type: 'object' },\n { name: 'b', displayName: 'B', type: 'object' }\n ],\n outputs: [\n { name: 'result', displayName: 'Result', type: 'object' }\n ],\n color: '#9C27B0'\n};\nexport class Fixed32MinExecutor {\n execute(node, context) {\n const ctx = context;\n const a = ctx.evaluateInput(node.id, 'a', Fixed32.ZERO);\n const b = ctx.evaluateInput(node.id, 'b', Fixed32.ZERO);\n return { outputs: { result: Fixed32.min(a ?? Fixed32.ZERO, b ?? Fixed32.ZERO) } };\n }\n}\n// Fixed32 Max\nexport const Fixed32MaxTemplate = {\n type: 'Fixed32Max',\n title: 'Fixed32 Max',\n category: 'math',\n description: 'Maximum of two Fixed32 values',\n keywords: ['fixed', 'max', 'maximum'],\n menuPath: ['Math', 'Fixed', 'Max'],\n isPure: true,\n inputs: [\n { name: 'a', displayName: 'A', type: 'object' },\n { name: 'b', displayName: 'B', type: 'object' }\n ],\n outputs: [\n { name: 'result', displayName: 'Result', type: 'object' }\n ],\n color: '#9C27B0'\n};\nexport class Fixed32MaxExecutor {\n execute(node, context) {\n const ctx = context;\n const a = ctx.evaluateInput(node.id, 'a', Fixed32.ZERO);\n const b = ctx.evaluateInput(node.id, 'b', Fixed32.ZERO);\n return { outputs: { result: Fixed32.max(a ?? Fixed32.ZERO, b ?? Fixed32.ZERO) } };\n }\n}\n// Fixed32 Clamp\nexport const Fixed32ClampTemplate = {\n type: 'Fixed32Clamp',\n title: 'Fixed32 Clamp',\n category: 'math',\n description: 'Clamps Fixed32 to range',\n keywords: ['fixed', 'clamp', 'limit', 'range'],\n menuPath: ['Math', 'Fixed', 'Clamp'],\n isPure: true,\n inputs: [\n { name: 'value', displayName: 'Value', type: 'object' },\n { name: 'min', displayName: 'Min', type: 'object' },\n { name: 'max', displayName: 'Max', type: 'object' }\n ],\n outputs: [\n { name: 'result', displayName: 'Result', type: 'object' }\n ],\n color: '#9C27B0'\n};\nexport class Fixed32ClampExecutor {\n execute(node, context) {\n const ctx = context;\n const value = ctx.evaluateInput(node.id, 'value', Fixed32.ZERO);\n const min = ctx.evaluateInput(node.id, 'min', Fixed32.ZERO);\n const max = ctx.evaluateInput(node.id, 'max', Fixed32.ONE);\n return { outputs: { result: Fixed32.clamp(value ?? Fixed32.ZERO, min ?? Fixed32.ZERO, max ?? Fixed32.ONE) } };\n }\n}\n// Fixed32 Lerp\nexport const Fixed32LerpTemplate = {\n type: 'Fixed32Lerp',\n title: 'Fixed32 Lerp',\n category: 'math',\n description: 'Linear interpolation between A and B',\n keywords: ['fixed', 'lerp', 'interpolate', 'blend'],\n menuPath: ['Math', 'Fixed', 'Lerp'],\n isPure: true,\n inputs: [\n { name: 'a', displayName: 'A', type: 'object' },\n { name: 'b', displayName: 'B', type: 'object' },\n { name: 't', displayName: 'T', type: 'object' }\n ],\n outputs: [\n { name: 'result', displayName: 'Result', type: 'object' }\n ],\n color: '#9C27B0'\n};\nexport class Fixed32LerpExecutor {\n execute(node, context) {\n const ctx = context;\n const a = ctx.evaluateInput(node.id, 'a', Fixed32.ZERO);\n const b = ctx.evaluateInput(node.id, 'b', Fixed32.ONE);\n const t = ctx.evaluateInput(node.id, 't', Fixed32.HALF);\n return { outputs: { result: Fixed32.lerp(a ?? Fixed32.ZERO, b ?? Fixed32.ONE, t ?? Fixed32.HALF) } };\n }\n}\n// Fixed32 Compare\nexport const Fixed32CompareTemplate = {\n type: 'Fixed32Compare',\n title: 'Fixed32 Compare',\n category: 'math',\n description: 'Compares two Fixed32 values',\n keywords: ['fixed', 'compare', 'equal', 'less', 'greater'],\n menuPath: ['Math', 'Fixed', 'Compare'],\n isPure: true,\n inputs: [\n { name: 'a', displayName: 'A', type: 'object' },\n { name: 'b', displayName: 'B', type: 'object' }\n ],\n outputs: [\n { name: 'equal', displayName: 'A == B', type: 'bool' },\n { name: 'less', displayName: 'A < B', type: 'bool' },\n { name: 'greater', displayName: 'A > B', type: 'bool' }\n ],\n color: '#9C27B0'\n};\nexport class Fixed32CompareExecutor {\n execute(node, context) {\n const ctx = context;\n const a = ctx.evaluateInput(node.id, 'a', Fixed32.ZERO);\n const b = ctx.evaluateInput(node.id, 'b', Fixed32.ZERO);\n const aVal = a ?? Fixed32.ZERO;\n const bVal = b ?? Fixed32.ZERO;\n return {\n outputs: {\n equal: aVal.eq(bVal),\n less: aVal.lt(bVal),\n greater: aVal.gt(bVal)\n }\n };\n }\n}\n// Fixed32 IsZero\nexport const Fixed32IsZeroTemplate = {\n type: 'Fixed32IsZero',\n title: 'Fixed32 Is Zero',\n category: 'math',\n description: 'Checks if Fixed32 is zero, positive, or negative',\n keywords: ['fixed', 'zero', 'check'],\n menuPath: ['Math', 'Fixed', 'Is Zero'],\n isPure: true,\n inputs: [\n { name: 'value', displayName: 'Value', type: 'object' }\n ],\n outputs: [\n { name: 'isZero', displayName: 'Is Zero', type: 'bool' },\n { name: 'isPositive', displayName: 'Is Positive', type: 'bool' },\n { name: 'isNegative', displayName: 'Is Negative', type: 'bool' }\n ],\n color: '#9C27B0'\n};\nexport class Fixed32IsZeroExecutor {\n execute(node, context) {\n const ctx = context;\n const value = ctx.evaluateInput(node.id, 'value', Fixed32.ZERO);\n const val = value ?? Fixed32.ZERO;\n return {\n outputs: {\n isZero: val.isZero(),\n isPositive: val.isPositive(),\n isNegative: val.isNegative()\n }\n };\n }\n}\n// Fixed32 Constants\nexport const Fixed32ConstantsTemplate = {\n type: 'Fixed32Constants',\n title: 'Fixed32 Constants',\n category: 'math',\n description: 'Common Fixed32 constants',\n keywords: ['fixed', 'constant', 'pi', 'zero', 'one'],\n menuPath: ['Math', 'Fixed', 'Constants'],\n isPure: true,\n inputs: [],\n outputs: [\n { name: 'zero', displayName: '0', type: 'object' },\n { name: 'one', displayName: '1', type: 'object' },\n { name: 'half', displayName: '0.5', type: 'object' },\n { name: 'pi', displayName: 'PI', type: 'object' },\n { name: 'twoPi', displayName: '2PI', type: 'object' }\n ],\n color: '#9C27B0'\n};\nexport class Fixed32ConstantsExecutor {\n execute() {\n return {\n outputs: {\n zero: Fixed32.ZERO,\n one: Fixed32.ONE,\n half: Fixed32.HALF,\n pi: Fixed32.PI,\n twoPi: Fixed32.TWO_PI\n }\n };\n }\n}\n// Node definitions collection\nexport const FixedNodeDefinitions = [\n { template: Fixed32FromTemplate, executor: new Fixed32FromExecutor() },\n { template: Fixed32FromIntTemplate, executor: new Fixed32FromIntExecutor() },\n { template: Fixed32ToFloatTemplate, executor: new Fixed32ToFloatExecutor() },\n { template: Fixed32ToIntTemplate, executor: new Fixed32ToIntExecutor() },\n { template: Fixed32AddTemplate, executor: new Fixed32AddExecutor() },\n { template: Fixed32SubtractTemplate, executor: new Fixed32SubtractExecutor() },\n { template: Fixed32MultiplyTemplate, executor: new Fixed32MultiplyExecutor() },\n { template: Fixed32DivideTemplate, executor: new Fixed32DivideExecutor() },\n { template: Fixed32NegateTemplate, executor: new Fixed32NegateExecutor() },\n { template: Fixed32AbsTemplate, executor: new Fixed32AbsExecutor() },\n { template: Fixed32SqrtTemplate, executor: new Fixed32SqrtExecutor() },\n { template: Fixed32FloorTemplate, executor: new Fixed32FloorExecutor() },\n { template: Fixed32CeilTemplate, executor: new Fixed32CeilExecutor() },\n { template: Fixed32RoundTemplate, executor: new Fixed32RoundExecutor() },\n { template: Fixed32SignTemplate, executor: new Fixed32SignExecutor() },\n { template: Fixed32MinTemplate, executor: new Fixed32MinExecutor() },\n { template: Fixed32MaxTemplate, executor: new Fixed32MaxExecutor() },\n { template: Fixed32ClampTemplate, executor: new Fixed32ClampExecutor() },\n { template: Fixed32LerpTemplate, executor: new Fixed32LerpExecutor() },\n { template: Fixed32CompareTemplate, executor: new Fixed32CompareExecutor() },\n { template: Fixed32IsZeroTemplate, executor: new Fixed32IsZeroExecutor() },\n { template: Fixed32ConstantsTemplate, executor: new Fixed32ConstantsExecutor() }\n];\n//# sourceMappingURL=FixedNodes.js.map","/**\n * @zh FixedVector2 定点向量蓝图节点\n * @en FixedVector2 Blueprint Nodes\n */\nimport { FixedVector2 } from '../FixedVector2';\nimport { Fixed32 } from '../Fixed32';\n// Make FixedVector2\nexport const MakeFixedVector2Template = {\n type: 'MakeFixedVector2',\n title: 'Make FixedVector2',\n category: 'math',\n description: 'Creates FixedVector2 from floats',\n keywords: ['make', 'create', 'fixed', 'vector', 'deterministic'],\n menuPath: ['Math', 'Fixed Vector', 'Make FixedVector2'],\n isPure: true,\n inputs: [\n { name: 'x', displayName: 'X', type: 'float', defaultValue: 0 },\n { name: 'y', displayName: 'Y', type: 'float', defaultValue: 0 }\n ],\n outputs: [\n { name: 'vector', displayName: 'Vector', type: 'object' }\n ],\n color: '#673AB7'\n};\nexport class MakeFixedVector2Executor {\n execute(node, context) {\n const ctx = context;\n const x = Number(ctx.evaluateInput(node.id, 'x', 0));\n const y = Number(ctx.evaluateInput(node.id, 'y', 0));\n return { outputs: { vector: FixedVector2.from(x, y) } };\n }\n}\n// Break FixedVector2\nexport const BreakFixedVector2Template = {\n type: 'BreakFixedVector2',\n title: 'Break FixedVector2',\n category: 'math',\n description: 'Breaks FixedVector2 into X and Y floats',\n keywords: ['break', 'split', 'fixed', 'vector'],\n menuPath: ['Math', 'Fixed Vector', 'Break FixedVector2'],\n isPure: true,\n inputs: [\n { name: 'vector', displayName: 'Vector', type: 'object' }\n ],\n outputs: [\n { name: 'x', displayName: 'X', type: 'float' },\n { name: 'y', displayName: 'Y', type: 'float' }\n ],\n color: '#673AB7'\n};\nexport class BreakFixedVector2Executor {\n execute(node, context) {\n const ctx = context;\n const vector = ctx.evaluateInput(node.id, 'vector', FixedVector2.ZERO);\n const v = vector ?? FixedVector2.ZERO;\n return { outputs: { x: v.x.toNumber(), y: v.y.toNumber() } };\n }\n}\n// FixedVector2 Add\nexport const FixedVector2AddTemplate = {\n type: 'FixedVector2Add',\n title: 'FixedVector2 +',\n category: 'math',\n description: 'Adds two fixed vectors',\n keywords: ['fixed', 'vector', 'add', '+'],\n menuPath: ['Math', 'Fixed Vector', 'Add'],\n isPure: true,\n inputs: [\n { name: 'a', displayName: 'A', type: 'object' },\n { name: 'b', displayName: 'B', type: 'object' }\n ],\n outputs: [\n { name: 'result', displayName: 'Result', type: 'object' }\n ],\n color: '#673AB7'\n};\nexport class FixedVector2AddExecutor {\n execute(node, context) {\n const ctx = context;\n const a = ctx.evaluateInput(node.id, 'a', FixedVector2.ZERO);\n const b = ctx.evaluateInput(node.id, 'b', FixedVector2.ZERO);\n return { outputs: { result: (a ?? FixedVector2.ZERO).add(b ?? FixedVector2.ZERO) } };\n }\n}\n// FixedVector2 Subtract\nexport const FixedVector2SubtractTemplate = {\n type: 'FixedVector2Subtract',\n title: 'FixedVector2 -',\n category: 'math',\n description: 'Subtracts B from A',\n keywords: ['fixed', 'vector', 'subtract', '-'],\n menuPath: ['Math', 'Fixed Vector', 'Subtract'],\n isPure: true,\n inputs: [\n { name: 'a', displayName: 'A', type: 'object' },\n { name: 'b', displayName: 'B', type: 'object' }\n ],\n outputs: [\n { name: 'result', displayName: 'Result', type: 'object' }\n ],\n color: '#673AB7'\n};\nexport class FixedVector2SubtractExecutor {\n execute(node, context) {\n const ctx = context;\n const a = ctx.evaluateInput(node.id, 'a', FixedVector2.ZERO);\n const b = ctx.evaluateInput(node.id, 'b', FixedVector2.ZERO);\n return { outputs: { result: (a ?? FixedVector2.ZERO).sub(b ?? FixedVector2.ZERO) } };\n }\n}\n// FixedVector2 Scale\nexport const FixedVector2ScaleTemplate = {\n type: 'FixedVector2Scale',\n title: 'FixedVector2 *',\n category: 'math',\n description: 'Scales vector by Fixed32 scalar',\n keywords: ['fixed', 'vector', 'scale', '*'],\n menuPath: ['Math', 'Fixed Vector', 'Scale'],\n isPure: true,\n inputs: [\n { name: 'vector', displayName: 'Vector', type: 'object' },\n { name: 'scalar', displayName: 'Scalar', type: 'object' }\n ],\n outputs: [\n { name: 'result', displayName: 'Result', type: 'object' }\n ],\n color: '#673AB7'\n};\nexport class FixedVector2ScaleExecutor {\n execute(node, context) {\n const ctx = context;\n const vector = ctx.evaluateInput(node.id, 'vector', FixedVector2.ZERO);\n const scalar = ctx.evaluateInput(node.id, 'scalar', Fixed32.ONE);\n return { outputs: { result: (vector ?? FixedVector2.ZERO).mul(scalar ?? Fixed32.ONE) } };\n }\n}\n// FixedVector2 Negate\nexport const FixedVector2NegateTemplate = {\n type: 'FixedVector2Negate',\n title: 'FixedVector2 Negate',\n category: 'math',\n description: 'Negates a fixed vector',\n keywords: ['fixed', 'vector', 'negate', '-'],\n menuPath: ['Math', 'Fixed Vector', 'Negate'],\n isPure: true,\n inputs: [\n { name: 'vector', displayName: 'Vector', type: 'object' }\n ],\n outputs: [\n { name: 'result', displayName: 'Result', type: 'object' }\n ],\n color: '#673AB7'\n};\nexport class FixedVector2NegateExecutor {\n execute(node, context) {\n const ctx = context;\n const vector = ctx.evaluateInput(node.id, 'vector', FixedVector2.ZERO);\n return { outputs: { result: (vector ?? FixedVector2.ZERO).neg() } };\n }\n}\n// FixedVector2 Length\nexport const FixedVector2LengthTemplate = {\n type: 'FixedVector2Length',\n title: 'FixedVector2 Length',\n category: 'math',\n description: 'Gets the length of a fixed vector',\n keywords: ['fixed', 'vector', 'length', 'magnitude'],\n menuPath: ['Math', 'Fixed Vector', 'Length'],\n isPure: true,\n inputs: [\n { name: 'vector', displayName: 'Vector', type: 'object' }\n ],\n outputs: [\n { name: 'length', displayName: 'Length', type: 'object' }\n ],\n color: '#673AB7'\n};\nexport class FixedVector2LengthExecutor {\n execute(node, context) {\n const ctx = context;\n const vector = ctx.evaluateInput(node.id, 'vector', FixedVector2.ZERO);\n return { outputs: { length: (vector ?? FixedVector2.ZERO).length() } };\n }\n}\n// FixedVector2 Normalize\nexport const FixedVector2NormalizeTemplate = {\n type: 'FixedVector2Normalize',\n title: 'FixedVector2 Normalize',\n category: 'math',\n description: 'Normalizes a fixed vector',\n keywords: ['fixed', 'vector', 'normalize', 'unit'],\n menuPath: ['Math', 'Fixed Vector', 'Normalize'],\n isPure: true,\n inputs: [\n { name: 'vector', displayName: 'Vector', type: 'object' }\n ],\n outputs: [\n { name: 'result', displayName: 'Result', type: 'object' }\n ],\n color: '#673AB7'\n};\nexport class FixedVector2NormalizeExecutor {\n execute(node, context) {\n const ctx = context;\n const vector = ctx.evaluateInput(node.id, 'vector', FixedVector2.ZERO);\n return { outputs: { result: (vector ?? FixedVector2.ZERO).normalize() } };\n }\n}\n// FixedVector2 Dot\nexport const FixedVector2DotTemplate = {\n type: 'FixedVector2Dot',\n title: 'FixedVector2 Dot',\n category: 'math',\n description: 'Calculates dot product',\n keywords: ['fixed', 'vector', 'dot', 'product'],\n menuPath: ['Math', 'Fixed Vector', 'Dot Product'],\n isPure: true,\n inputs: [\n { name: 'a', displayName: 'A', type: 'object' },\n { name: 'b', displayName: 'B', type: 'object' }\n ],\n outputs: [\n { name: 'result', displayName: 'Result', type: 'object' }\n ],\n color: '#673AB7'\n};\nexport class FixedVector2DotExecutor {\n execute(node, context) {\n const ctx = context;\n const a = ctx.evaluateInput(node.id, 'a', FixedVector2.ZERO);\n const b = ctx.evaluateInput(node.id, 'b', FixedVector2.ZERO);\n return { outputs: { result: FixedVector2.dot(a ?? FixedVector2.ZERO, b ?? FixedVector2.ZERO) } };\n }\n}\n// FixedVector2 Cross\nexport const FixedVector2CrossTemplate = {\n type: 'FixedVector2Cross',\n title: 'FixedVector2 Cross',\n category: 'math',\n description: '2D cross product (returns Fixed32)',\n keywords: ['fixed', 'vector', 'cross', 'product'],\n menuPath: ['Math', 'Fixed Vector', 'Cross Product'],\n isPure: true,\n inputs: [\n { name: 'a', displayName: 'A', type: 'object' },\n { name: 'b', displayName: 'B', type: 'object' }\n ],\n outputs: [\n { name: 'result', displayName: 'Result', type: 'object' }\n ],\n color: '#673AB7'\n};\nexport class FixedVector2CrossExecutor {\n execute(node, context) {\n const ctx = context;\n const a = ctx.evaluateInput(node.id, 'a', FixedVector2.ZERO);\n const b = ctx.evaluateInput(node.id, 'b', FixedVector2.ZERO);\n return { outputs: { result: FixedVector2.cross(a ?? FixedVector2.ZERO, b ?? FixedVector2.ZERO) } };\n }\n}\n// FixedVector2 Distance\nexport const FixedVector2DistanceTemplate = {\n type: 'FixedVector2Distance',\n title: 'FixedVector2 Distance',\n category: 'math',\n description: 'Distance between two points',\n keywords: ['fixed', 'vector', 'distance'],\n menuPath: ['Math', 'Fixed Vector', 'Distance'],\n isPure: true,\n inputs: [\n { name: 'a', displayName: 'A', type: 'object' },\n { name: 'b', displayName: 'B', type: 'object' }\n ],\n outputs: [\n { name: 'distance', displayName: 'Distance', type: 'object' }\n ],\n color: '#673AB7'\n};\nexport class FixedVector2DistanceExecutor {\n execute(node, context) {\n const ctx = context;\n const a = ctx.evaluateInput(node.id, 'a', FixedVector2.ZERO);\n const b = ctx.evaluateInput(node.id, 'b', FixedVector2.ZERO);\n return { outputs: { distance: FixedVector2.distance(a ?? FixedVector2.ZERO, b ?? FixedVector2.ZERO) } };\n }\n}\n// FixedVector2 Lerp\nexport const FixedVector2LerpTemplate = {\n type: 'FixedVector2Lerp',\n title: 'FixedVector2 Lerp',\n category: 'math',\n description: 'Linear interpolation between two vectors',\n keywords: ['fixed', 'vector', 'lerp', 'interpolate'],\n menuPath: ['Math', 'Fixed Vector', 'Lerp'],\n isPure: true,\n inputs: [\n { name: 'a', displayName: 'A', type: 'object' },\n { name: 'b', displayName: 'B', type: 'object' },\n { name: 't', displayName: 'T', type: 'object' }\n ],\n outputs: [\n { name: 'result', displayName: 'Result', type: 'object' }\n ],\n color: '#673AB7'\n};\nexport class FixedVector2LerpExecutor {\n execute(node, context) {\n const ctx = context;\n const a = ctx.evaluateInput(node.id, 'a', FixedVector2.ZERO);\n const b = ctx.evaluateInput(node.id, 'b', FixedVector2.ZERO);\n const t = ctx.evaluateInput(node.id, 't', Fixed32.HALF);\n return { outputs: { result: FixedVector2.lerp(a ?? FixedVector2.ZERO, b ?? FixedVector2.ZERO, t ?? Fixed32.HALF) } };\n }\n}\n// Node definitions collection\nexport const FixedVectorNodeDefinitions = [\n { template: MakeFixedVector2Template, executor: new MakeFixedVector2Executor() },\n { template: BreakFixedVector2Template, executor: new BreakFixedVector2Executor() },\n { template: FixedVector2AddTemplate, executor: new FixedVector2AddExecutor() },\n { template: FixedVector2SubtractTemplate, executor: new FixedVector2SubtractExecutor() },\n { template: FixedVector2ScaleTemplate, executor: new FixedVector2ScaleExecutor() },\n { template: FixedVector2NegateTemplate, executor: new FixedVector2NegateExecutor() },\n { template: FixedVector2LengthTemplate, executor: new FixedVector2LengthExecutor() },\n { template: FixedVector2NormalizeTemplate, executor: new FixedVector2NormalizeExecutor() },\n { template: FixedVector2DotTemplate, executor: new FixedVector2DotExecutor() },\n { template: FixedVector2CrossTemplate, executor: new FixedVector2CrossExecutor() },\n { template: FixedVector2DistanceTemplate, executor: new FixedVector2DistanceExecutor() },\n { template: FixedVector2LerpTemplate, executor: new FixedVector2LerpExecutor() }\n];\n//# sourceMappingURL=FixedVectorNodes.js.map","/**\n * @zh 颜色蓝图节点\n * @en Color Blueprint Nodes\n */\nimport { Color } from '../Color';\n// Make Color from RGBA\nexport const MakeColorTemplate = {\n type: 'MakeColor',\n title: 'Make Color',\n category: 'math',\n description: 'Creates a Color from RGBA',\n keywords: ['make', 'create', 'color', 'rgba'],\n menuPath: ['Math', 'Color', 'Make Color'],\n isPure: true,\n inputs: [\n { name: 'r', displayName: 'R (0-255)', type: 'int', defaultValue: 255 },\n { name: 'g', displayName: 'G (0-255)', type: 'int', defaultValue: 255 },\n { name: 'b', displayName: 'B (0-255)', type: 'int', defaultValue: 255 },\n { name: 'a', displayName: 'A (0-1)', type: 'float', defaultValue: 1 }\n ],\n outputs: [\n { name: 'color', displayName: 'Color', type: 'color' }\n ],\n color: '#E91E63'\n};\nexport class MakeColorExecutor {\n execute(node, context) {\n const ctx = context;\n const r = Number(ctx.evaluateInput(node.id, 'r', 255));\n const g = Number(ctx.evaluateInput(node.id, 'g', 255));\n const b = Number(ctx.evaluateInput(node.id, 'b', 255));\n const a = Number(ctx.evaluateInput(node.id, 'a', 1));\n return { outputs: { color: new Color(r, g, b, a) } };\n }\n}\n// Break Color\nexport const BreakColorTemplate = {\n type: 'BreakColor',\n title: 'Break Color',\n category: 'math',\n description: 'Breaks a Color into RGBA',\n keywords: ['break', 'split', 'color', 'rgba'],\n menuPath: ['Math', 'Color', 'Break Color'],\n isPure: true,\n inputs: [\n { name: 'color', displayName: 'Color', type: 'color' }\n ],\n outputs: [\n { name: 'r', displayName: 'R', type: 'int' },\n { name: 'g', displayName: 'G', type: 'int' },\n { name: 'b', displayName: 'B', type: 'int' },\n { name: 'a', displayName: 'A', type: 'float' }\n ],\n color: '#E91E63'\n};\nexport class BreakColorExecutor {\n execute(node, context) {\n const ctx = context;\n const color = ctx.evaluateInput(node.id, 'color', Color.WHITE);\n const c = color ?? Color.WHITE;\n return { outputs: { r: c.r, g: c.g, b: c.b, a: c.a } };\n }\n}\n// Color from Hex\nexport const ColorFromHexTemplate = {\n type: 'ColorFromHex',\n title: 'Color From Hex',\n category: 'math',\n description: 'Creates a Color from hex string',\n keywords: ['color', 'hex', 'from', 'create'],\n menuPath: ['Math', 'Color', 'From Hex'],\n isPure: true,\n inputs: [\n { name: 'hex', displayName: 'Hex', type: 'string', defaultValue: '#FFFFFF' },\n { name: 'alpha', displayName: 'Alpha', type: 'float', defaultValue: 1 }\n ],\n outputs: [\n { name: 'color', displayName: 'Color', type: 'color' }\n ],\n color: '#E91E63'\n};\nexport class ColorFromHexExecutor {\n execute(node, context) {\n const ctx = context;\n const hex = String(ctx.evaluateInput(node.id, 'hex', '#FFFFFF'));\n const alpha = Number(ctx.evaluateInput(node.id, 'alpha', 1));\n return { outputs: { color: Color.fromHex(hex, alpha) } };\n }\n}\n// Color to Hex\nexport const ColorToHexTemplate = {\n type: 'ColorToHex',\n title: 'Color To Hex',\n category: 'math',\n description: 'Converts a Color to hex string',\n keywords: ['color', 'hex', 'to', 'convert'],\n menuPath: ['Math', 'Color', 'To Hex'],\n isPure: true,\n inputs: [\n { name: 'color', displayName: 'Color', type: 'color' }\n ],\n outputs: [\n { name: 'hex', displayName: 'Hex', type: 'string' }\n ],\n color: '#E91E63'\n};\nexport class ColorToHexExecutor {\n execute(node, context) {\n const ctx = context;\n const color = ctx.evaluateInput(node.id, 'color', Color.WHITE);\n return { outputs: { hex: (color ?? Color.WHITE).toHex() } };\n }\n}\n// Color from HSL\nexport const ColorFromHSLTemplate = {\n type: 'ColorFromHSL',\n title: 'Color From HSL',\n category: 'math',\n description: 'Creates a Color from HSL values',\n keywords: ['color', 'hsl', 'hue', 'saturation', 'lightness'],\n menuPath: ['Math', 'Color', 'From HSL'],\n isPure: true,\n inputs: [\n { name: 'h', displayName: 'H (0-360)', type: 'float', defaultValue: 0 },\n { name: 's', displayName: 'S (0-1)', type: 'float', defaultValue: 1 },\n { name: 'l', displayName: 'L (0-1)', type: 'float', defaultValue: 0.5 },\n { name: 'a', displayName: 'A (0-1)', type: 'float', defaultValue: 1 }\n ],\n outputs: [\n { name: 'color', displayName: 'Color', type: 'color' }\n ],\n color: '#E91E63'\n};\nexport class ColorFromHSLExecutor {\n execute(node, context) {\n const ctx = context;\n const h = Number(ctx.evaluateInput(node.id, 'h', 0));\n const s = Number(ctx.evaluateInput(node.id, 's', 1));\n const l = Number(ctx.evaluateInput(node.id, 'l', 0.5));\n const a = Number(ctx.evaluateInput(node.id, 'a', 1));\n return { outputs: { color: Color.fromHSL(h, s, l, a) } };\n }\n}\n// Color to HSL\nexport const ColorToHSLTemplate = {\n type: 'ColorToHSL',\n title: 'Color To HSL',\n category: 'math',\n description: 'Converts a Color to HSL values',\n keywords: ['color', 'hsl', 'convert'],\n menuPath: ['Math', 'Color', 'To HSL'],\n isPure: true,\n inputs: [\n { name: 'color', displayName: 'Color', type: 'color' }\n ],\n outputs: [\n { name: 'h', displayName: 'H', type: 'float' },\n { name: 's', displayName: 'S', type: 'float' },\n { name: 'l', displayName: 'L', type: 'float' }\n ],\n color: '#E91E63'\n};\nexport class ColorToHSLExecutor {\n execute(node, context) {\n const ctx = context;\n const color = ctx.evaluateInput(node.id, 'color', Color.WHITE);\n const hsl = (color ?? Color.WHITE).toHSL();\n return { outputs: { h: hsl.h, s: hsl.s, l: hsl.l } };\n }\n}\n// Color Lerp\nexport const ColorLerpTemplate = {\n type: 'ColorLerp',\n title: 'Color Lerp',\n category: 'math',\n description: 'Linear interpolation between two colors',\n keywords: ['color', 'lerp', 'interpolate', 'blend'],\n menuPath: ['Math', 'Color', 'Lerp'],\n isPure: true,\n inputs: [\n { name: 'from', displayName: 'From', type: 'color' },\n { name: 'to', displayName: 'To', type: 'color' },\n { name: 't', displayName: 'T', type: 'float', defaultValue: 0.5 }\n ],\n outputs: [\n { name: 'result', displayName: 'Result', type: 'color' }\n ],\n color: '#E91E63'\n};\nexport class ColorLerpExecutor {\n execute(node, context) {\n const ctx = context;\n const from = ctx.evaluateInput(node.id, 'from', Color.BLACK);\n const to = ctx.evaluateInput(node.id, 'to', Color.WHITE);\n const t = Number(ctx.evaluateInput(node.id, 't', 0.5));\n return { outputs: { result: Color.lerp(from ?? Color.BLACK, to ?? Color.WHITE, t) } };\n }\n}\n// Color Lighten\nexport const ColorLightenTemplate = {\n type: 'ColorLighten',\n title: 'Color Lighten',\n category: 'math',\n description: 'Lightens a color',\n keywords: ['color', 'lighten', 'bright'],\n menuPath: ['Math', 'Color', 'Lighten'],\n isPure: true,\n inputs: [\n { name: 'color', displayName: 'Color', type: 'color' },\n { name: 'amount', displayName: 'Amount', type: 'float', defaultValue: 0.1 }\n ],\n outputs: [\n { name: 'result', displayName: 'Result', type: 'color' }\n ],\n color: '#E91E63'\n};\nexport class ColorLightenExecutor {\n execute(node, context) {\n const ctx = context;\n const color = ctx.evaluateInput(node.id, 'color', Color.GRAY);\n const amount = Number(ctx.evaluateInput(node.id, 'amount', 0.1));\n return { outputs: { result: Color.lighten(color ?? Color.GRAY, amount) } };\n }\n}\n// Color Darken\nexport const ColorDarkenTemplate = {\n type: 'ColorDarken',\n title: 'Color Darken',\n category: 'math',\n description: 'Darkens a color',\n keywords: ['color', 'darken', 'dark'],\n menuPath: ['Math', 'Color', 'Darken'],\n isPure: true,\n inputs: [\n { name: 'color', displayName: 'Color', type: 'color' },\n { name: 'amount', displayName: 'Amount', type: 'float', defaultValue: 0.1 }\n ],\n outputs: [\n { name: 'result', displayName: 'Result', type: 'color' }\n ],\n color: '#E91E63'\n};\nexport class ColorDarkenExecutor {\n execute(node, context) {\n const ctx = context;\n const color = ctx.evaluateInput(node.id, 'color', Color.GRAY);\n const amount = Number(ctx.evaluateInput(node.id, 'amount', 0.1));\n return { outputs: { result: Color.darken(color ?? Color.GRAY, amount) } };\n }\n}\n// Color Saturate\nexport const ColorSaturateTemplate = {\n type: 'ColorSaturate',\n title: 'Color Saturate',\n category: 'math',\n description: 'Increases color saturation',\n keywords: ['color', 'saturate', 'saturation'],\n menuPath: ['Math', 'Color', 'Saturate'],\n isPure: true,\n inputs: [\n { name: 'color', displayName: 'Color', type: 'color' },\n { name: 'amount', displayName: 'Amount', type: 'float', defaultValue: 0.1 }\n ],\n outputs: [\n { name: 'result', displayName: 'Result', type: 'color' }\n ],\n color: '#E91E63'\n};\nexport class ColorSaturateExecutor {\n execute(node, context) {\n const ctx = context;\n const color = ctx.evaluateInput(node.id, 'color', Color.GRAY);\n const amount = Number(ctx.evaluateInput(node.id, 'amount', 0.1));\n return { outputs: { result: Color.saturate(color ?? Color.GRAY, amount) } };\n }\n}\n// Color Desaturate\nexport const ColorDesaturateTemplate = {\n type: 'ColorDesaturate',\n title: 'Color Desaturate',\n category: 'math',\n description: 'Decreases color saturation',\n keywords: ['color', 'desaturate', 'saturation'],\n menuPath: ['Math', 'Color', 'Desaturate'],\n isPure: true,\n inputs: [\n { name: 'color', displayName: 'Color', type: 'color' },\n { name: 'amount', displayName: 'Amount', type: 'float', defaultValue: 0.1 }\n ],\n outputs: [\n { name: 'result', displayName: 'Result', type: 'color' }\n ],\n color: '#E91E63'\n};\nexport class ColorDesaturateExecutor {\n execute(node, context) {\n const ctx = context;\n const color = ctx.evaluateInput(node.id, 'color', Color.GRAY);\n const amount = Number(ctx.evaluateInput(node.id, 'amount', 0.1));\n return { outputs: { result: Color.desaturate(color ?? Color.GRAY, amount) } };\n }\n}\n// Color Invert\nexport const ColorInvertTemplate = {\n type: 'ColorInvert',\n title: 'Color Invert',\n category: 'math',\n description: 'Inverts a color',\n keywords: ['color', 'invert', 'inverse'],\n menuPath: ['Math', 'Color', 'Invert'],\n isPure: true,\n inputs: [\n { name: 'color', displayName: 'Color', type: 'color' }\n ],\n outputs: [\n { name: 'result', displayName: 'Result', type: 'color' }\n ],\n color: '#E91E63'\n};\nexport class ColorInvertExecutor {\n execute(node, context) {\n const ctx = context;\n const color = ctx.evaluateInput(node.id, 'color', Color.WHITE);\n return { outputs: { result: Color.invert(color ?? Color.WHITE) } };\n }\n}\n// Color Grayscale\nexport const ColorGrayscaleTemplate = {\n type: 'ColorGrayscale',\n title: 'Color Grayscale',\n category: 'math',\n description: 'Converts color to grayscale',\n keywords: ['color', 'grayscale', 'gray', 'grey'],\n menuPath: ['Math', 'Color', 'Grayscale'],\n isPure: true,\n inputs: [\n { name: 'color', displayName: 'Color', type: 'color' }\n ],\n outputs: [\n { name: 'result', displayName: 'Result', type: 'color' }\n ],\n color: '#E91E63'\n};\nexport class ColorGrayscaleExecutor {\n execute(node, context) {\n const ctx = context;\n const color = ctx.evaluateInput(node.id, 'color', Color.WHITE);\n return { outputs: { result: Color.grayscale(color ?? Color.WHITE) } };\n }\n}\n// Color Luminance\nexport const ColorLuminanceTemplate = {\n type: 'ColorLuminance',\n title: 'Color Luminance',\n category: 'math',\n description: 'Gets perceived brightness (0-1)',\n keywords: ['color', 'luminance', 'brightness'],\n menuPath: ['Math', 'Color', 'Luminance'],\n isPure: true,\n inputs: [\n { name: 'color', displayName: 'Color', type: 'color' }\n ],\n outputs: [\n { name: 'luminance', displayName: 'Luminance', type: 'float' }\n ],\n color: '#E91E63'\n};\nexport class ColorLuminanceExecutor {\n execute(node, context) {\n const ctx = context;\n const color = ctx.evaluateInput(node.id, 'color', Color.WHITE);\n return { outputs: { luminance: Color.luminance(color ?? Color.WHITE) } };\n }\n}\n// Color Constants\nexport const ColorConstantsTemplate = {\n type: 'ColorConstants',\n title: 'Color Constants',\n category: 'math',\n description: 'Common color constants',\n keywords: ['color', 'constant', 'red', 'green', 'blue', 'white', 'black'],\n menuPath: ['Math', 'Color', 'Constants'],\n isPure: true,\n inputs: [],\n outputs: [\n { name: 'white', displayName: 'White', type: 'color' },\n { name: 'black', displayName: 'Black', type: 'color' },\n { name: 'red', displayName: 'Red', type: 'color' },\n { name: 'green', displayName: 'Green', type: 'color' },\n { name: 'blue', displayName: 'Blue', type: 'color' },\n { name: 'transparent', displayName: 'Transparent', type: 'color' }\n ],\n color: '#E91E63'\n};\nexport class ColorConstantsExecutor {\n execute() {\n return {\n outputs: {\n white: Color.WHITE,\n black: Color.BLACK,\n red: Color.RED,\n green: Color.GREEN,\n blue: Color.BLUE,\n transparent: Color.TRANSPARENT\n }\n };\n }\n}\n// Node definitions collection\nexport const ColorNodeDefinitions = [\n { template: MakeColorTemplate, executor: new MakeColorExecutor() },\n { template: BreakColorTemplate, executor: new BreakColorExecutor() },\n { template: ColorFromHexTemplate, executor: new ColorFromHexExecutor() },\n { template: ColorToHexTemplate, executor: new ColorToHexExecutor() },\n { template: ColorFromHSLTemplate, executor: new ColorFromHSLExecutor() },\n { template: ColorToHSLTemplate, executor: new ColorToHSLExecutor() },\n { template: ColorLerpTemplate, executor: new ColorLerpExecutor() },\n { template: ColorLightenTemplate, executor: new ColorLightenExecutor() },\n { template: ColorDarkenTemplate, executor: new ColorDarkenExecutor() },\n { template: ColorSaturateTemplate, executor: new ColorSaturateExecutor() },\n { template: ColorDesaturateTemplate, executor: new ColorDesaturateExecutor() },\n { template: ColorInvertTemplate, executor: new ColorInvertExecutor() },\n { template: ColorGrayscaleTemplate, executor: new ColorGrayscaleExecutor() },\n { template: ColorLuminanceTemplate, executor: new ColorLuminanceExecutor() },\n { template: ColorConstantsTemplate, executor: new ColorConstantsExecutor() }\n];\n//# sourceMappingURL=ColorNodes.js.map","/**\n * @zh 数学库蓝图节点\n * @en Math Library Blueprint Nodes\n *\n * @zh 导出所有数学相关的蓝图节点\n * @en Exports all math-related blueprint nodes\n */\nexport * from './VectorNodes';\nexport * from './FixedNodes';\nexport * from './FixedVectorNodes';\nexport * from './ColorNodes';\n// Re-export node definition collections\nimport { VectorNodeDefinitions } from './VectorNodes';\nimport { FixedNodeDefinitions } from './FixedNodes';\nimport { FixedVectorNodeDefinitions } from './FixedVectorNodes';\nimport { ColorNodeDefinitions } from './ColorNodes';\n/**\n * @zh 所有数学库蓝图节点定义\n * @en All math library blueprint node definitions\n */\nexport const MathNodeDefinitions = [\n ...VectorNodeDefinitions,\n ...FixedNodeDefinitions,\n ...FixedVectorNodeDefinitions,\n ...ColorNodeDefinitions\n];\n//# sourceMappingURL=index.js.map","import { Vector2 } from '../Vector2';\n/**\n * 碰撞检测器\n *\n * 提供各种几何体之间的碰撞检测功能\n */\nexport class CollisionDetector {\n // 点与几何体碰撞检测\n /**\n * 点与圆形碰撞检测\n * @param point 点\n * @param circle 圆形\n * @returns 碰撞信息\n */\n static pointCircle(point, circle) {\n const distance = Vector2.distance(point, circle.center);\n const collided = distance <= circle.radius;\n if (!collided) {\n return { collided: false };\n }\n const normal = distance > 0\n ? Vector2.subtract(point, circle.center).normalize()\n : new Vector2(1, 0); // 默认法线\n return {\n collided: true,\n normal,\n penetration: circle.radius - distance,\n contactPoint: point.clone()\n };\n }\n /**\n * 点与矩形碰撞检测\n * @param point 点\n * @param rect 矩形\n * @returns 碰撞信息\n */\n static pointRect(point, rect) {\n const collided = rect.containsPoint(point);\n if (!collided) {\n return { collided: false };\n }\n // 计算到各边的距离\n const distLeft = point.x - rect.left;\n const distRight = rect.right - point.x;\n const distTop = point.y - rect.top;\n const distBottom = rect.bottom - point.y;\n // 找到最小距离确定法线方向\n const minDist = Math.min(distLeft, distRight, distTop, distBottom);\n let normal;\n const penetration = minDist;\n if (minDist === distLeft) {\n normal = new Vector2(-1, 0);\n }\n else if (minDist === distRight) {\n normal = new Vector2(1, 0);\n }\n else if (minDist === distTop) {\n normal = new Vector2(0, -1);\n }\n else {\n normal = new Vector2(0, 1);\n }\n return {\n collided: true,\n normal,\n penetration,\n contactPoint: point.clone()\n };\n }\n // 圆形碰撞检测\n /**\n * 圆形与圆形碰撞检测\n * @param circle1 第一个圆形\n * @param circle2 第二个圆形\n * @returns 碰撞信息\n */\n static circleCircle(circle1, circle2) {\n const distance = Vector2.distance(circle1.center, circle2.center);\n const radiusSum = circle1.radius + circle2.radius;\n const collided = distance <= radiusSum;\n if (!collided) {\n return { collided: false };\n }\n const normal = distance > 0\n ? Vector2.subtract(circle2.center, circle1.center).normalize()\n : new Vector2(1, 0); // 默认法线\n const penetration = radiusSum - distance;\n const contactPoint = circle1.center.clone().add(normal.clone().multiply(circle1.radius - penetration * 0.5));\n return {\n collided: true,\n normal,\n penetration,\n contactPoint\n };\n }\n /**\n * 圆形与矩形碰撞检测\n * @param circle 圆形\n * @param rect 矩形\n * @returns 碰撞信息\n */\n static circleRect(circle, rect) {\n // 找到矩形上离圆心最近的点\n const closestPoint = rect.closestPointTo(circle.center);\n // 检查是否碰撞\n const distance = Vector2.distance(circle.center, closestPoint);\n const collided = distance <= circle.radius;\n if (!collided) {\n return { collided: false };\n }\n // 计算法线和穿透深度\n const normal = distance > 0\n ? Vector2.subtract(closestPoint, circle.center).normalize()\n : new Vector2(0, -1); // 默认法线(圆心在矩形内部时)\n const penetration = circle.radius - distance;\n return {\n collided: true,\n normal,\n penetration,\n contactPoint: closestPoint\n };\n }\n // 矩形碰撞检测\n /**\n * 矩形与矩形碰撞检测(AABB)\n * @param rect1 第一个矩形\n * @param rect2 第二个矩形\n * @returns 碰撞信息\n */\n static rectRect(rect1, rect2) {\n const collided = rect1.intersects(rect2);\n if (!collided) {\n return { collided: false };\n }\n // 计算重叠区域\n const overlapLeft = Math.max(rect1.left, rect2.left);\n const overlapRight = Math.min(rect1.right, rect2.right);\n const overlapTop = Math.max(rect1.top, rect2.top);\n const overlapBottom = Math.min(rect1.bottom, rect2.bottom);\n const overlapWidth = overlapRight - overlapLeft;\n const overlapHeight = overlapBottom - overlapTop;\n // 确定分离方向(最小重叠轴)\n let normal;\n let penetration;\n if (overlapWidth < overlapHeight) {\n // 水平分离\n penetration = overlapWidth;\n if (rect1.centerX < rect2.centerX) {\n normal = new Vector2(-1, 0);\n }\n else {\n normal = new Vector2(1, 0);\n }\n }\n else {\n // 垂直分离\n penetration = overlapHeight;\n if (rect1.centerY < rect2.centerY) {\n normal = new Vector2(0, -1);\n }\n else {\n normal = new Vector2(0, 1);\n }\n }\n const contactPoint = new Vector2((overlapLeft + overlapRight) * 0.5, (overlapTop + overlapBottom) * 0.5);\n return {\n collided: true,\n normal,\n penetration,\n contactPoint\n };\n }\n // 射线投射\n /**\n * 射线与圆形相交检测\n * @param rayOrigin 射线起点\n * @param rayDirection 射线方向(单位向量)\n * @param circle 圆形\n * @param maxDistance 最大检测距离,默认无限\n * @returns 碰撞信息,包含距离信息\n */\n static rayCircle(rayOrigin, rayDirection, circle, maxDistance = Infinity) {\n const oc = Vector2.subtract(rayOrigin, circle.center);\n const a = rayDirection.lengthSquared;\n const b = 2 * Vector2.dot(oc, rayDirection);\n const c = oc.lengthSquared - circle.radius * circle.radius;\n const discriminant = b * b - 4 * a * c;\n if (discriminant < 0) {\n return { collided: false };\n }\n const sqrt = Math.sqrt(discriminant);\n const t1 = (-b - sqrt) / (2 * a);\n const t2 = (-b + sqrt) / (2 * a);\n // 选择最近的正距离\n const t = t1 >= 0 ? t1 : t2;\n if (t < 0 || t > maxDistance) {\n return { collided: false };\n }\n const contactPoint = rayOrigin.clone().add(rayDirection.clone().multiply(t));\n const normal = Vector2.subtract(contactPoint, circle.center).normalize();\n return {\n collided: true,\n normal,\n contactPoint,\n distance: t,\n penetration: 0 // 射线检测不计算穿透\n };\n }\n /**\n * 射线与矩形相交检测\n * @param rayOrigin 射线起点\n * @param rayDirection 射线方向(单位向量)\n * @param rect 矩形\n * @param maxDistance 最大检测距离,默认无限\n * @returns 碰撞信息,包含距离信息\n */\n static rayRect(rayOrigin, rayDirection, rect, maxDistance = Infinity) {\n // 避免除零\n const invDirX = rayDirection.x !== 0 ? 1 / rayDirection.x : 1e10;\n const invDirY = rayDirection.y !== 0 ? 1 / rayDirection.y : 1e10;\n // 计算与各边的交点参数\n const t1 = (rect.left - rayOrigin.x) * invDirX;\n const t2 = (rect.right - rayOrigin.x) * invDirX;\n const t3 = (rect.top - rayOrigin.y) * invDirY;\n const t4 = (rect.bottom - rayOrigin.y) * invDirY;\n const tmin = Math.max(Math.min(t1, t2), Math.min(t3, t4));\n const tmax = Math.min(Math.max(t1, t2), Math.max(t3, t4));\n // 没有交点或交点在射线反方向\n if (tmax < 0 || tmin > tmax || tmin > maxDistance) {\n return { collided: false };\n }\n const t = tmin >= 0 ? tmin : tmax;\n const contactPoint = rayOrigin.clone().add(rayDirection.clone().multiply(t));\n // 确定法线方向\n let normal;\n const epsilon = 1e-6;\n if (Math.abs(contactPoint.x - rect.left) < epsilon) {\n normal = new Vector2(-1, 0);\n }\n else if (Math.abs(contactPoint.x - rect.right) < epsilon) {\n normal = new Vector2(1, 0);\n }\n else if (Math.abs(contactPoint.y - rect.top) < epsilon) {\n normal = new Vector2(0, -1);\n }\n else {\n normal = new Vector2(0, 1);\n }\n return {\n collided: true,\n normal,\n contactPoint,\n distance: t,\n penetration: 0 // 射线检测不计算穿透\n };\n }\n // 线段相交检测\n /**\n * 线段与线段相交检测\n * @param p1 第一条线段起点\n * @param p2 第一条线段终点\n * @param p3 第二条线段起点\n * @param p4 第二条线段终点\n * @returns 碰撞信息\n */\n static lineSegmentLineSegment(p1, p2, p3, p4) {\n const d1 = Vector2.subtract(p2, p1);\n const d2 = Vector2.subtract(p4, p3);\n const d3 = Vector2.subtract(p3, p1);\n const cross = Vector2.cross(d1, d2);\n if (Math.abs(cross) < Number.EPSILON) {\n // 平行或共线\n return { collided: false };\n }\n const t1 = Vector2.cross(d3, d2) / cross;\n const t2 = Vector2.cross(d3, d1) / cross;\n if (t1 >= 0 && t1 <= 1 && t2 >= 0 && t2 <= 1) {\n const contactPoint = p1.clone().add(d1.clone().multiply(t1));\n // 计算法线(垂直于第一条线段)\n const normal = d1.perpendicular().normalize();\n return {\n collided: true,\n normal,\n contactPoint,\n penetration: 0 // 线段相交不计算穿透\n };\n }\n return { collided: false };\n }\n /**\n * 线段与圆形相交检测\n * @param lineStart 线段起点\n * @param lineEnd 线段终点\n * @param circle 圆形\n * @returns 碰撞信息\n */\n static lineSegmentCircle(lineStart, lineEnd, circle) {\n const d = Vector2.subtract(lineEnd, lineStart);\n const f = Vector2.subtract(lineStart, circle.center);\n const a = Vector2.dot(d, d);\n const b = 2 * Vector2.dot(f, d);\n const c = Vector2.dot(f, f) - circle.radius * circle.radius;\n const discriminant = b * b - 4 * a * c;\n if (discriminant < 0) {\n return { collided: false };\n }\n const sqrt = Math.sqrt(discriminant);\n const t1 = (-b - sqrt) / (2 * a);\n const t2 = (-b + sqrt) / (2 * a);\n // 检查交点是否在线段上\n const validT = [];\n if (t1 >= 0 && t1 <= 1)\n validT.push(t1);\n if (t2 >= 0 && t2 <= 1)\n validT.push(t2);\n if (validT.length === 0) {\n return { collided: false };\n }\n // 使用最近的交点\n const t = validT[0];\n const contactPoint = lineStart.clone().add(d.clone().multiply(t));\n const normal = Vector2.subtract(contactPoint, circle.center).normalize();\n return {\n collided: true,\n normal,\n contactPoint,\n penetration: 0 // 线段相交不计算穿透\n };\n }\n // 快速排斥测试\n /**\n * AABB包围盒快速排斥测试\n * @param bounds1 第一个包围盒\n * @param bounds2 第二个包围盒\n * @returns 是否可能相交\n */\n static aabbTest(bounds1, bounds2) {\n return bounds1.intersects(bounds2);\n }\n /**\n * 圆形包围盒快速排斥测试\n * @param center1 第一个圆心\n * @param radius1 第一个半径\n * @param center2 第二个圆心\n * @param radius2 第二个半径\n * @returns 是否可能相交\n */\n static circleTest(center1, radius1, center2, radius2) {\n const distance = Vector2.distance(center1, center2);\n return distance <= radius1 + radius2;\n }\n}\n//# sourceMappingURL=CollisionDetector.js.map"],"names":["Vector2","constructor","x","y","this","length","Math","sqrt","lengthSquared","angle","atan2","isZero","isUnit","lenSq","abs","Number","EPSILON","set","copy","other","clone","add","subtract","multiply","scalar","divide","Error","negate","dot","cross","normalize","len","normalized","distanceTo","dx","dy","distanceToSquared","angleTo","lenProduct","acos","max","min","projectOnto","onto","projectOntoLength","perpendicular","rotate","cos","sin","rotated","rotateAround","center","reflect","normal","reflected","lerp","target","t","clampLength","maxLength","clamp","equals","epsilon","exactEquals","a","b","vector","det","lengthSq","v","distance","distanceSq","fromAngle","fromPolar","perpLeft","perpRight","toString","toFixed","toArray","toObject","ZERO","ONE","RIGHT","LEFT","UP","DOWN","Vector3","z","dz","FORWARD","BACK","Matrix3","elements","Float32Array","identity","get","row","col","value","m00","m01","m02","m10","m11","m12","m20","m21","m22","zero","fill","fromArray","i","multiplyScalar","result","premultiply","makeTranslation","makeRotation","makeScale","scaleX","scaleY","translate","scale","transpose","tmp","determinant","e","invert","console","warn","invDet","transformVector","w","transformDirection","transformVectors","vectors","map","getTranslation","getRotation","getScale","decompose","translation","rotation","isIdentity","IDENTITY","TRS","Array","from","toCSSTransform","Rectangle","width","height","left","right","top","bottom","centerX","centerY","topLeft","topRight","bottomLeft","bottomRight","area","perimeter","isEmpty","isSquare","setPosition","setSize","setCenter","inflate","amount","inflateXY","horizontal","vertical","containsPoint","point","contains","containsRect","intersects","intersection","EMPTY","union","intersectionArea","distanceToPoint","distanceToRect","closestPointTo","fromCenter","fromPoints","point1","point2","fromPointArray","points","minX","minY","maxX","maxY","square","size","getVertices","Circle","radius","diameter","PI","circumference","bounds","setRadius","translateBy","offset","containsCircle","distanceToCircle","pointOnBoundary","distanceSquared","radiusSum","intersectsRect","rect","closestX","closestY","d","smallerRadius","r1","r2","distanceToPointFromBoundary","distanceToCircleFromBoundary","direction","farthestPointFrom","getPointAtAngle","getAngleToPoint","getLineIntersections","lineStart","lineEnd","fx","fy","discriminant","t1","t2","fromDiameter","fromThreePoints","p1","p2","p3","ax","ay","bx","by","cx","cy","ux","uy","maxDistance","UNIT","Polygon","signedArea","vertices","n","j","vi","vj","isCCW","yAxisDown","isCW","reverse","reverseInPlace","ensureCCW","ensureCW","centroid","factor","inside","isConvex","sign","v0","v1","v2","dx1","dy1","dx2","Infinity","Fixed32","raw","round","SCALE","fromRaw","fromInt","FRACTION_BITS","toNumber","toRaw","toInt","sub","mul","aLow","aHigh","bLow","bHigh","lowLow","lowHigh","highLow","div","mod","neg","eq","ne","lt","le","gt","ge","isPositive","isNegative","guess","prev","floor","ceil","NEG_ONE","MAX_VALUE","MIN_VALUE","HALF","TWO_PI","HALF_PI","RAD_TO_DEG","DEG_TO_RAD","FixedMath","generateSinTable","table","Int32Array","SIN_TABLE_SIZE","halfPi","pi","tableAngle","negative","tableIndex","SIN_TABLE","tan","cosVal","yRaw","xRaw","absY","absX","atanApprox","num","den","ratio","x2","asin","one","normalizeAngle","angleDelta","to","lerpAngle","delta","radToDeg","rad","degToRad","deg","pow","base","exp","x3","x4","ln","two","expY","diff","sum","FixedVector2","rawX","rawY","fromObject","obj","toRawObject","mulComponents","divComponents","distanceSquaredTo","perpendicularCCW","maxLenSq","moveTowards","dist","MathUtils","degrees","radians","normalizeAngleSigned","angleDifference","clamp01","inverseLerp","remap","inMin","inMax","outMin","outMax","smoothStep","smootherStep","approximately","random","randomInt","randomChoice","array","randomBoolean","probability","randomInUnitCircle","randomOnUnitCircle","fastInverseSqrt","fastPow","exponent","factorial","NaN","gcd","temp","lcm","fibonacci","arithmeticSum","first","last","count","geometricSum","quadraticBezier","p0","u","tt","uu","cubicBezier","uuu","ttt","catmullRom","t3","noise","seed","smoothNoise","intX","intY","fracX","fracY","c","i1","i2","toPrecision","precision","inRange","values","average","reduce","val","median","sorted","sort","middle","QUARTER_PI","GOLDEN_RATIO","Color","r","g","fromHex","hex","alpha","hexToRgb","fromUint32","hasAlpha","fromHSL","h","s","l","hslToRgb","fromFloat","colorHex","replace","parseInt","substring","rgbToHex","toHex","padStart","hue2rgb","p","q","rgbToHsl","packRGB","packARGB","packABGR","packHexAlpha","unpackARGB","unpackABGR","lerpUint32","fromR","fromG","fromB","toR","toG","toB","mix","color1","color2","lighten","color","hsl","rgb","darken","saturate","desaturate","grayscale","gray","luminance","contrastRatio","l1","l2","toHexAlpha","slice","toRgba","toRgb","toHSL","toUint32","toUint32Alpha","toWebGL","toFloatArray","undefined","WHITE","BLACK","RED","GREEN","BLUE","YELLOW","CYAN","MAGENTA","TRANSPARENT","GRAY","Easing","linear","quadIn","quadOut","quadInOut","cubicIn","cubicOut","cubicInOut","quartIn","quartOut","quartInOut","quintIn","quintOut","quintInOut","sineIn","sineOut","sineInOut","expoIn","expoOut","expoInOut","circIn","circOut","circInOut","backIn","backOut","c1","backInOut","c2","elasticIn","amplitude","period","elasticOut","elasticInOut","bounceIn","bounceOut","n1","d1","bounceInOut","combine","easingFunctions","weights","piecewise","segments","totalDuration","seg","duration","normalizedSegments","accumulatedTime","segment","localT","easing","mirror","smoothIn","smoothOut","quickIn","quickOut","natural","emphasize","CachedInterpolator","interpolator","cache","Map","setRange","clear","has","clearCache","Interpolation","number","vector2","fromVal","toVal","cubicSpline","hermite","m0","m1","slerp","toVec","theta","sinTheta","createCachedInterpolator","spline","scaledT","vectorSpline","xPoints","yPoints","keyframe","keyframes","time","current","next","progress","easedProgress","pathInterpolation","path","closed","targetDistance","getPathLength","accumulatedDistance","start","end","segmentLength","segmentT","totalLength","createNumberInterpolator","createVectorInterpolator","createCompositeInterpolator","interpolators","MakeVector2Template","type","title","category","description","keywords","menuPath","isPure","inputs","name","displayName","defaultValue","outputs","MakeVector2Executor","execute","node","context","ctx","evaluateInput","id","BreakVector2Template","BreakVector2Executor","Vector2AddTemplate","Vector2AddExecutor","Vector2SubtractTemplate","Vector2SubtractExecutor","Vector2ScaleTemplate","Vector2ScaleExecutor","Vector2LengthTemplate","Vector2LengthExecutor","Vector2NormalizeTemplate","Vector2NormalizeExecutor","Vector2DotTemplate","Vector2DotExecutor","Vector2CrossTemplate","Vector2CrossExecutor","Vector2DistanceTemplate","Vector2DistanceExecutor","Vector2LerpTemplate","Vector2LerpExecutor","Vector2RotateTemplate","Vector2RotateExecutor","Vector2FromAngleTemplate","Vector2FromAngleExecutor","VectorNodeDefinitions","template","executor","Fixed32FromTemplate","Fixed32FromExecutor","fixed","Fixed32FromIntTemplate","Fixed32FromIntExecutor","Fixed32ToFloatTemplate","Fixed32ToFloatExecutor","Fixed32ToIntTemplate","Fixed32ToIntExecutor","Fixed32AddTemplate","Fixed32AddExecutor","Fixed32SubtractTemplate","Fixed32SubtractExecutor","Fixed32MultiplyTemplate","Fixed32MultiplyExecutor","Fixed32DivideTemplate","Fixed32DivideExecutor","divisor","Fixed32NegateTemplate","Fixed32NegateExecutor","Fixed32AbsTemplate","Fixed32AbsExecutor","Fixed32SqrtTemplate","Fixed32SqrtExecutor","Fixed32FloorTemplate","Fixed32FloorExecutor","Fixed32CeilTemplate","Fixed32CeilExecutor","Fixed32RoundTemplate","Fixed32RoundExecutor","Fixed32SignTemplate","Fixed32SignExecutor","Fixed32MinTemplate","Fixed32MinExecutor","Fixed32MaxTemplate","Fixed32MaxExecutor","Fixed32ClampTemplate","Fixed32ClampExecutor","Fixed32LerpTemplate","Fixed32LerpExecutor","Fixed32CompareTemplate","Fixed32CompareExecutor","aVal","bVal","equal","less","greater","Fixed32IsZeroTemplate","Fixed32IsZeroExecutor","Fixed32ConstantsTemplate","Fixed32ConstantsExecutor","half","twoPi","FixedNodeDefinitions","MakeFixedVector2Template","MakeFixedVector2Executor","BreakFixedVector2Template","BreakFixedVector2Executor","FixedVector2AddTemplate","FixedVector2AddExecutor","FixedVector2SubtractTemplate","FixedVector2SubtractExecutor","FixedVector2ScaleTemplate","FixedVector2ScaleExecutor","FixedVector2NegateTemplate","FixedVector2NegateExecutor","FixedVector2LengthTemplate","FixedVector2LengthExecutor","FixedVector2NormalizeTemplate","FixedVector2NormalizeExecutor","FixedVector2DotTemplate","FixedVector2DotExecutor","FixedVector2CrossTemplate","FixedVector2CrossExecutor","FixedVector2DistanceTemplate","FixedVector2DistanceExecutor","FixedVector2LerpTemplate","FixedVector2LerpExecutor","FixedVectorNodeDefinitions","MakeColorTemplate","MakeColorExecutor","BreakColorTemplate","BreakColorExecutor","ColorFromHexTemplate","ColorFromHexExecutor","String","ColorToHexTemplate","ColorToHexExecutor","ColorFromHSLTemplate","ColorFromHSLExecutor","ColorToHSLTemplate","ColorToHSLExecutor","ColorLerpTemplate","ColorLerpExecutor","ColorLightenTemplate","ColorLightenExecutor","ColorDarkenTemplate","ColorDarkenExecutor","ColorSaturateTemplate","ColorSaturateExecutor","ColorDesaturateTemplate","ColorDesaturateExecutor","ColorInvertTemplate","ColorInvertExecutor","ColorGrayscaleTemplate","ColorGrayscaleExecutor","ColorLuminanceTemplate","ColorLuminanceExecutor","ColorConstantsTemplate","ColorConstantsExecutor","white","black","red","green","blue","transparent","ColorNodeDefinitions","MathNodeDefinitions","pointCircle","circle","collided","penetration","contactPoint","pointRect","distLeft","distRight","distTop","distBottom","minDist","circleCircle","circle1","circle2","circleRect","closestPoint","rectRect","rect1","rect2","overlapLeft","overlapRight","overlapTop","overlapBottom","overlapWidth","overlapHeight","rayCircle","rayOrigin","rayDirection","oc","rayRect","invDirX","invDirY","t4","tmin","tmax","lineSegmentLineSegment","p4","d2","d3","lineSegmentCircle","f","validT","push","aabbTest","bounds1","bounds2","circleTest","center1","radius1","center2","radius2"],"mappings":"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"}
|