@mapgis/webclient-es6-mapboxgl
Version:
364 lines (333 loc) • 10.1 kB
JavaScript
import { Common } from '@mapgis/webclient-es6-service';
const { Zondy } = Common;
/**
* @private
* @class Zondy.LevelRenderer.Tool.Vector
* @classdesc LevelRenderer 二维向量类
*
*/
class Vector {
/**
* @function Zondy.LevelRenderer.Tool.Vector.constructor
* @description 构造函数
*/
constructor() {
this.ArrayCtor = typeof Float32Array === 'undefined'
? Array
: Float32Array;
this.CLASS_NAME = "Zondy.LevelRenderer.Tool.Vector";
}
/**
* @function Zondy.LevelRenderer.Tool.Vector.prototype.create
* @description 创建一个向量。
*
* @param {number} x - x坐标
* @param {number} y - Y坐标
* @return {Vector2} 向量。
*/
create(x, y) {
var ArrayCtor = this.ArrayCtor;
var out = new ArrayCtor(2);
out[0] = x || 0;
out[1] = y || 0;
return out;
}
/**
* @function Zondy.LevelRenderer.Tool.Vector.prototype.copy
* @description 复制一个向量。
*
* @param {Vector2} out - 基础向量。
* @param {Vector2} v - 向量。
* @return {Vector2} 克隆向量。
*/
copy(out, v) {
out[0] = v[0];
out[1] = v[1];
return out;
}
/**
* @function Zondy.LevelRenderer.Tool.Vector.prototype.set
* @description 设置向量的两个项。
*
* @param {Vector2} out - 基础向量。
* @param {number} a - 项 a。
* @param {number} b - 项 b。
* @return {Vector2} 结果。
*/
set(out, a, b) {
out[0] = a;
out[1] = b;
return out;
}
/**
* @function Zondy.LevelRenderer.Tool.Vector.prototype.add
* @description 向量相加。
*
* @param {Vector2} out - 基础向量。
* @param {Vector2} v1 - 向量 v1。
* @param {Vector2} v2 - 向量 v2。
* @return {Vector2} 结果。
*/
add(out, v1, v2) {
out[0] = v1[0] + v2[0];
out[1] = v1[1] + v2[1];
return out;
}
/**
* @function Zondy.LevelRenderer.Tool.Vector.prototype.scaleAndAdd
* @description 向量缩放后相加。
* @param {Vector2} out - 基础向量。
* @param {Vector2} v1 - 向量 v1。
* @param {Vector2} v2 - 向量 v2(缩放向量)。
* @param {number} a - 缩放参数。
* @return {Vector2} 结果。
*/
scaleAndAdd(out, v1, v2, a) {
out[0] = v1[0] + v2[0] * a;
out[1] = v1[1] + v2[1] * a;
return out;
}
/**
* @function Zondy.LevelRenderer.Tool.Vector.prototype.sub
* @description 向量相减。
* @param {Vector2} out - 基础向量。
* @param {Vector2} v1 - 向量 v1。
* @param {Vector2} v2 - 向量 v2。
* @return {Vector2} 结果。
*/
sub(out, v1, v2) {
out[0] = v1[0] - v2[0];
out[1] = v1[1] - v2[1];
return out;
}
/**
* @function Zondy.LevelRenderer.Tool.Vector.prototype.len
* @description 向量长度。
* @param {Vector2} v - 向量。
* @return {number} 向量长度。
*/
len(v) {
return Math.sqrt(this.lenSquare(v));
}
/**
* @function Zondy.LevelRenderer.Tool.Vector.prototype.lenSquare
* @description 向量长度平方。
* @param {Vector2} v - 向量。
* @return {number} 向量长度平方。
*/
lenSquare(v) {
return v[0] * v[0] + v[1] * v[1];
}
/**
* @function Zondy.LevelRenderer.Tool.Vector.prototype.mul
* @description 向量乘法。
* @param {Vector2} out - 基础向量。
* @param {Vector2} v1 - 向量 v1。
* @param {Vector2} v2 - 向量 v2。
* @return {Vector2} 结果。
*/
mul(out, v1, v2) {
out[0] = v1[0] * v2[0];
out[1] = v1[1] * v2[1];
return out;
}
/**
* @function Zondy.LevelRenderer.Tool.Vector.prototype.div
* @description 向量除法。
*
* @param {Vector2} out - 基础向量。
* @param {Vector2} v1 - 向量 v1。
* @param {Vector2} v2 - 向量 v2。
* @return {Vector2} 结果。
*/
div(out, v1, v2) {
out[0] = v1[0] / v2[0];
out[1] = v1[1] / v2[1];
return out;
}
/**
* @function Zondy.LevelRenderer.Tool.Vector.prototype.dot
* @description 向量点乘。
*
* @param {Vector2} v1 - 向量 v1。
* @param {Vector2} v2 - 向量 v2。
* @return {number} 向量点乘。
*/
dot(v1, v2) {
return v1[0] * v2[0] + v1[1] * v2[1];
}
/**
* @function Zondy.LevelRenderer.Tool.Vector.prototype.scale
* @description 向量缩放。
*
* @param {Vector2} out - 基础向量。
* @param {Vector2} v - 向量v。
* @param {number} s -缩放参数。
* @return {Vector2} 结果。
*/
scale(out, v, s) {
out[0] = v[0] * s;
out[1] = v[1] * s;
return out;
}
/**
* @function Zondy.LevelRenderer.Tool.Vector.prototype.normalize
* @description 向量归一化。
*
* @param {Vector2} out - 基础向量。
* @param {Vector2} v - 向量 v。
* @return {Vector2} 结果。
*/
normalize(out, v) {
var d = this.len(v);
if (d === 0) {
out[0] = 0;
out[1] = 0;
} else {
out[0] = v[0] / d;
out[1] = v[1] / d;
}
return out;
}
/**
* @function Zondy.LevelRenderer.Tool.Vector.prototype.distance
* @description 计算向量间距离。
*
* @param {Vector2} v1 - 向量 v1。
* @param {Vector2} v2 - 向量 v2。
* @return {number} 向量间距离。
*/
distance(v1, v2) {
return Math.sqrt(
(v1[0] - v2[0]) * (v1[0] - v2[0])
+ (v1[1] - v2[1]) * (v1[1] - v2[1])
);
}
/**
* @function Zondy.LevelRenderer.Tool.Vector.prototype.distanceSquare
* @description 向量距离平方。
*
* @param {Vector2} v1 - 向量 v1。
* @param {Vector2} v2 - 向量 v2。
* @return {number} 向量距离平方。
*/
distanceSquare(v1, v2) {
return (v1[0] - v2[0]) * (v1[0] - v2[0])
+ (v1[1] - v2[1]) * (v1[1] - v2[1]);
}
/**
* @function Zondy.LevelRenderer.Tool.Vector.prototype.negate
* @description 求负向量。
*
* @param {Vector2} out - 基础向量。
* @param {Vector2} v - 向量 v。
* @return {Vector2} 负向量。
*/
negate(out, v) {
out[0] = -v[0];
out[1] = -v[1];
return out;
}
/**
* @function Zondy.LevelRenderer.Tool.Vector.prototype.lerp
* @description 两点之间线性插值。
*
* @param {Vector2} out - 基础向量。
* @param {Vector2} v1 - 向量 v1。
* @param {Vector2} v2 - 向量 v2。
* @param {number} t
* @return {Vector2} 结果。
*/
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;
}
/**
* @function Zondy.LevelRenderer.Tool.Vector.prototype.applyTransform
* @description 矩阵左乘向量。
*
* @param {Vector2} out - 基础向量。
* @param {Vector2} v1 - 向量 v1。
* @param {Vector2} v2 - 向量 v2。
* @return {Vector2} 结果。
*/
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;
}
/**
* @function Zondy.LevelRenderer.Tool.Vector.prototype.min
* @description 求两个向量最小值。
* @param {Vector2} out - 基础向量。
* @param {Vector2} v1 - 向量 v1。
* @param {Vector2} v2 - 向量 v2。
* @return {Vector2} 结果。
*/
min(out, v1, v2) {
out[0] = Math.min(v1[0], v2[0]);
out[1] = Math.min(v1[1], v2[1]);
return out;
}
/**
* @function Zondy.LevelRenderer.Tool.Vector.prototype.max
* @description 求两个向量最大值。
*
* @param {Vector2} out - 基础向量。
* @param {Vector2} v1 - 向量 v1。
* @param {Vector2} v2 - 向量 v2。
* @return {Vector2} 结果。
*/
max(out, v1, v2) {
out[0] = Math.max(v1[0], v2[0]);
out[1] = Math.max(v1[1], v2[1]);
return out;
}
/**
* @function Zondy.LevelRenderer.Tool.Vector.prototype.length
* @description 向量长度。
*
* @param {Vector2} v - 向量。
* @return {number} 向量长度。
*/
length(v) {
return this.len(v);
}
/**
* @function Zondy.LevelRenderer.Tool.Vector.prototype.lengthSquare
* @description 向量长度平方。
*
* @param {Vector2} v - 向量。
* @return {number} 向量长度平方。
*/
lengthSquare(v) {
return this.lenSquare(v);
}
/**
* @function Zondy.LevelRenderer.Tool.Vector.prototype.dist
* @description 计算向量间距离。
*
* @param {Vector2} v1 - 向量 v1。
* @param {Vector2} v2 - 向量 v2。
* @return {number} 向量间距离。
*/
dist(v1, v2) {
return this.distance(v1, v2);
}
/**
* @function Zondy.LevelRenderer.Tool.Vector.prototype.distSquare
* @description 向量距离平方。
*
* @param {Vector2} v1 - 向量 v1。
* @param {Vector2} v2 - 向量 v2。
* @return {number} 向量距离平方
*/
distSquare(v1, v2) {
return this.distanceSquare(v1, v2);
}
}
export {Vector};
Zondy.LevelRenderer.Tool.Vector = Vector;