| /* global Float32Array */ |
| var ArrayCtor = typeof Float32Array === 'undefined' ? Array : Float32Array; |
| /** |
| * 创建一个向量 |
| * @param {number} [x=0] |
| * @param {number} [y=0] |
| * @return {Vector2} |
| */ |
| |
| export function create(x, y) { |
| var out = new ArrayCtor(2); |
| |
| if (x == null) { |
| x = 0; |
| } |
| |
| if (y == null) { |
| y = 0; |
| } |
| |
| out[0] = x; |
| out[1] = y; |
| return out; |
| } |
| /** |
| * 复制向量数据 |
| * @param {Vector2} out |
| * @param {Vector2} v |
| * @return {Vector2} |
| */ |
| |
| export function copy(out, v) { |
| out[0] = v[0]; |
| out[1] = v[1]; |
| return out; |
| } |
| /** |
| * 克隆一个向量 |
| * @param {Vector2} v |
| * @return {Vector2} |
| */ |
| |
| export function clone(v) { |
| var out = new ArrayCtor(2); |
| out[0] = v[0]; |
| out[1] = v[1]; |
| return out; |
| } |
| /** |
| * 设置向量的两个项 |
| * @param {Vector2} out |
| * @param {number} a |
| * @param {number} b |
| * @return {Vector2} 结果 |
| */ |
| |
| export function set(out, a, b) { |
| out[0] = a; |
| out[1] = b; |
| return out; |
| } |
| /** |
| * 向量相加 |
| * @param {Vector2} out |
| * @param {Vector2} v1 |
| * @param {Vector2} v2 |
| */ |
| |
| export function add(out, v1, v2) { |
| out[0] = v1[0] + v2[0]; |
| out[1] = v1[1] + v2[1]; |
| return out; |
| } |
| /** |
| * 向量缩放后相加 |
| * @param {Vector2} out |
| * @param {Vector2} v1 |
| * @param {Vector2} v2 |
| * @param {number} a |
| */ |
| |
| export function scaleAndAdd(out, v1, v2, a) { |
| out[0] = v1[0] + v2[0] * a; |
| out[1] = v1[1] + v2[1] * a; |
| return out; |
| } |
| /** |
| * 向量相减 |
| * @param {Vector2} out |
| * @param {Vector2} v1 |
| * @param {Vector2} v2 |
| */ |
| |
| export function sub(out, v1, v2) { |
| out[0] = v1[0] - v2[0]; |
| out[1] = v1[1] - v2[1]; |
| return out; |
| } |
| /** |
| * 向量长度 |
| * @param {Vector2} v |
| * @return {number} |
| */ |
| |
| export function len(v) { |
| return Math.sqrt(lenSquare(v)); |
| } |
| export var length = len; // jshint ignore:line |
| |
| /** |
| * 向量长度平方 |
| * @param {Vector2} v |
| * @return {number} |
| */ |
| |
| export function lenSquare(v) { |
| return v[0] * v[0] + v[1] * v[1]; |
| } |
| export var lengthSquare = lenSquare; |
| /** |
| * 向量乘法 |
| * @param {Vector2} out |
| * @param {Vector2} v1 |
| * @param {Vector2} v2 |
| */ |
| |
| export function mul(out, v1, v2) { |
| out[0] = v1[0] * v2[0]; |
| out[1] = v1[1] * v2[1]; |
| return out; |
| } |
| /** |
| * 向量除法 |
| * @param {Vector2} out |
| * @param {Vector2} v1 |
| * @param {Vector2} v2 |
| */ |
| |
| export function div(out, v1, v2) { |
| out[0] = v1[0] / v2[0]; |
| out[1] = v1[1] / v2[1]; |
| return out; |
| } |
| /** |
| * 向量点乘 |
| * @param {Vector2} v1 |
| * @param {Vector2} v2 |
| * @return {number} |
| */ |
| |
| export function dot(v1, v2) { |
| return v1[0] * v2[0] + v1[1] * v2[1]; |
| } |
| /** |
| * 向量缩放 |
| * @param {Vector2} out |
| * @param {Vector2} v |
| * @param {number} s |
| */ |
| |
| export function scale(out, v, s) { |
| out[0] = v[0] * s; |
| out[1] = v[1] * s; |
| return out; |
| } |
| /** |
| * 向量归一化 |
| * @param {Vector2} out |
| * @param {Vector2} v |
| */ |
| |
| export function normalize(out, v) { |
| var d = len(v); |
| |
| if (d === 0) { |
| out[0] = 0; |
| out[1] = 0; |
| } else { |
| out[0] = v[0] / d; |
| out[1] = v[1] / d; |
| } |
| |
| return out; |
| } |
| /** |
| * 计算向量间距离 |
| * @param {Vector2} v1 |
| * @param {Vector2} v2 |
| * @return {number} |
| */ |
| |
| export function distance(v1, v2) { |
| return Math.sqrt((v1[0] - v2[0]) * (v1[0] - v2[0]) + (v1[1] - v2[1]) * (v1[1] - v2[1])); |
| } |
| export var dist = distance; |
| /** |
| * 向量距离平方 |
| * @param {Vector2} v1 |
| * @param {Vector2} v2 |
| * @return {number} |
| */ |
| |
| export function distanceSquare(v1, v2) { |
| return (v1[0] - v2[0]) * (v1[0] - v2[0]) + (v1[1] - v2[1]) * (v1[1] - v2[1]); |
| } |
| export var distSquare = distanceSquare; |
| /** |
| * 求负向量 |
| * @param {Vector2} out |
| * @param {Vector2} v |
| */ |
| |
| export function negate(out, v) { |
| out[0] = -v[0]; |
| out[1] = -v[1]; |
| return out; |
| } |
| /** |
| * 插值两个点 |
| * @param {Vector2} out |
| * @param {Vector2} v1 |
| * @param {Vector2} v2 |
| * @param {number} t |
| */ |
| |
| export function lerp(out, v1, v2, t) { |
| out[0] = v1[0] + t * (v2[0] - v1[0]); |
| out[1] = v1[1] + t * (v2[1] - v1[1]); |
| return out; |
| } |
| /** |
| * 矩阵左乘向量 |
| * @param {Vector2} out |
| * @param {Vector2} v |
| * @param {Vector2} m |
| */ |
| |
| export function applyTransform(out, v, m) { |
| var x = v[0]; |
| var y = v[1]; |
| out[0] = m[0] * x + m[2] * y + m[4]; |
| out[1] = m[1] * x + m[3] * y + m[5]; |
| return out; |
| } |
| /** |
| * 求两个向量最小值 |
| * @param {Vector2} out |
| * @param {Vector2} v1 |
| * @param {Vector2} v2 |
| */ |
| |
| export function min(out, v1, v2) { |
| out[0] = Math.min(v1[0], v2[0]); |
| out[1] = Math.min(v1[1], v2[1]); |
| return out; |
| } |
| /** |
| * 求两个向量最大值 |
| * @param {Vector2} out |
| * @param {Vector2} v1 |
| * @param {Vector2} v2 |
| */ |
| |
| export function max(out, v1, v2) { |
| out[0] = Math.max(v1[0], v2[0]); |
| out[1] = Math.max(v1[1], v2[1]); |
| return out; |
| } |