基本重构完成
底层渲染库舍弃 zrender,换为 antvG6
This commit is contained in:
+44
-53
@@ -1,6 +1,7 @@
|
||||
import * as zrender from "zrender";
|
||||
|
||||
|
||||
import { Engine } from "../engine";
|
||||
import { ConstructedData } from "../Model/modelConstructor";
|
||||
import { SV } from "../StructV";
|
||||
import { G6Data, Renderer } from "../View/renderer";
|
||||
|
||||
|
||||
/**
|
||||
@@ -8,6 +9,7 @@ import * as zrender from "zrender";
|
||||
*/
|
||||
export const Util = {
|
||||
|
||||
|
||||
/**
|
||||
* 生成唯一id
|
||||
*/
|
||||
@@ -19,29 +21,11 @@ export const Util = {
|
||||
},
|
||||
|
||||
/**
|
||||
* 扩展对象
|
||||
* @param origin 原对象
|
||||
* @param ext 扩展的对象
|
||||
* 乞丐版对象克隆
|
||||
* @param obj
|
||||
*/
|
||||
extends(origin, ext) {
|
||||
zrender.util.extend(origin, ext);
|
||||
},
|
||||
|
||||
/**
|
||||
* 合并对象
|
||||
* @param origin
|
||||
* @param dest
|
||||
*/
|
||||
merge(origin, dest) {
|
||||
zrender.util.merge(origin, dest, true);
|
||||
},
|
||||
|
||||
/**
|
||||
* 拷贝对象
|
||||
* @param object
|
||||
*/
|
||||
clone(object) {
|
||||
return zrender.util.clone(object);
|
||||
objectClone<T extends Object>(obj: T): T {
|
||||
return obj? JSON.parse(JSON.stringify(obj)): { };
|
||||
},
|
||||
|
||||
/**
|
||||
@@ -55,26 +39,6 @@ export const Util = {
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* 从一个由数组组成的路径中获取几何中心
|
||||
* @param path
|
||||
*/
|
||||
getPathCenter(path: Array<[number, number]>): [number, number] {
|
||||
let maxX = -Infinity,
|
||||
minX = Infinity,
|
||||
maxY = -Infinity,
|
||||
minY = Infinity;
|
||||
|
||||
path.map(item => {
|
||||
if(item[0] > maxX) maxX = item[0];
|
||||
if(item[0] < minX) minX = item[0];
|
||||
if(item[1] > maxY) maxY = item[1];
|
||||
if(item[1] < minY) minY = item[1];
|
||||
});
|
||||
|
||||
return [(maxX + minX) / 2, (maxY + minY) / 2];
|
||||
},
|
||||
|
||||
/**
|
||||
* 断言函数
|
||||
* @param assertFn
|
||||
@@ -86,14 +50,6 @@ export const Util = {
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* 获取类的名称
|
||||
* @param classConstructor
|
||||
*/
|
||||
getClassName(classConstructor): string {
|
||||
return classConstructor.prototype.constructor.toString().split(' ')[1];
|
||||
},
|
||||
|
||||
/**
|
||||
* 文本解析
|
||||
* @param text
|
||||
@@ -119,6 +75,41 @@ export const Util = {
|
||||
if(value <= max && value >= min) return value;
|
||||
if(value > max) return max;
|
||||
if(value < min) return min;
|
||||
},
|
||||
|
||||
/**
|
||||
*
|
||||
* @param constructedDataType
|
||||
* @returns
|
||||
*/
|
||||
converterList(constructedDataType: ConstructedData[keyof ConstructedData]) {
|
||||
return [].concat(...Object.keys(constructedDataType).map(item => constructedDataType[item]));
|
||||
},
|
||||
|
||||
/**
|
||||
* G6 data 转换器
|
||||
* @param constructedData
|
||||
* @returns
|
||||
*/
|
||||
convertG6Data(constructedData: ConstructedData): G6Data {
|
||||
let nodes = [...Util.converterList(constructedData.element), ...Util.converterList(constructedData.pointer)],
|
||||
edges = Util.converterList(constructedData.link);
|
||||
|
||||
return {
|
||||
nodes: nodes.map(item => item.props),
|
||||
edges: edges.map(item => item.props)
|
||||
};
|
||||
},
|
||||
|
||||
/**
|
||||
* 计算旋转矩阵
|
||||
* @param matrix
|
||||
* @param rotation
|
||||
*/
|
||||
calcRotateMatrix(matrix: number[], rotation: number): number[] {
|
||||
const Mat3 = SV.G6.Util.mat3;
|
||||
Mat3.rotate(matrix, matrix, rotation);
|
||||
return matrix;
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
+86
-188
@@ -1,219 +1,117 @@
|
||||
|
||||
|
||||
// 二维向量 {x, y}
|
||||
export class Vector {
|
||||
public x: number;
|
||||
public y: number;
|
||||
|
||||
constructor(x?: number, y?: number) {
|
||||
this.x = 0;
|
||||
this.y = 0;
|
||||
|
||||
if(x !== undefined && y !== undefined) {
|
||||
this.set(x, y);
|
||||
}
|
||||
}
|
||||
|
||||
//-------------操作----------------
|
||||
export const Vector = {
|
||||
|
||||
/**
|
||||
* 设置值
|
||||
* @param x
|
||||
* @param y
|
||||
* 向量相加
|
||||
* @param v1
|
||||
* @param v2
|
||||
*/
|
||||
set(x: number, y: number) {
|
||||
this.x = x;
|
||||
this.y = y;
|
||||
}
|
||||
add(v1: [number, number], v2: [number, number]): [number, number] {
|
||||
return [v1[0] + v2[0], v1[1] + v2[1]];
|
||||
},
|
||||
|
||||
/**
|
||||
* 相加
|
||||
* 向量相减
|
||||
* @param v1
|
||||
* @param v2
|
||||
*/
|
||||
subtract(v1: [number, number], v2: [number, number]): [number, number] {
|
||||
return [v1[0] - v2[0], v1[1] - v2[1]];
|
||||
},
|
||||
|
||||
/**
|
||||
* 向量点积
|
||||
* @param v1
|
||||
* @param v2
|
||||
*/
|
||||
dot(v1: [number, number], v2: [number, number]): number {
|
||||
return v1[0] * v2[0] + v1[1] * v2[1];
|
||||
},
|
||||
|
||||
/**
|
||||
* 向量缩放
|
||||
* @param v
|
||||
* @param n
|
||||
*/
|
||||
scale(v: [number, number], n: number): [number, number] {
|
||||
return [v[0] * n, v[1] * n];
|
||||
},
|
||||
|
||||
/**
|
||||
* 向量求模长
|
||||
* @param v
|
||||
*/
|
||||
add(v: Vector, out?: Vector): Vector {
|
||||
out = out || new Vector();
|
||||
|
||||
out.x = this.x + v.x;
|
||||
out.y = this.y + v.y;
|
||||
|
||||
return out;
|
||||
}
|
||||
|
||||
/**
|
||||
* 相减
|
||||
* @param v
|
||||
*/
|
||||
sub(v: Vector, out?: Vector): Vector {
|
||||
out = out || new Vector();
|
||||
|
||||
out.x = this.x - v.x;
|
||||
out.y = this.y - v.y;
|
||||
|
||||
return out;
|
||||
}
|
||||
|
||||
/**
|
||||
* 点积
|
||||
* @param v
|
||||
*/
|
||||
dot(v: Vector): number {
|
||||
return this.x * v.x + this.y * v.y;
|
||||
}
|
||||
|
||||
/**
|
||||
* 叉积
|
||||
* @param v
|
||||
*/
|
||||
cro(v: Vector): number {
|
||||
return this.x * v.y - v.x * this.y;
|
||||
}
|
||||
|
||||
/**
|
||||
* 与标量进行叉积
|
||||
* @param n
|
||||
*/
|
||||
croNum(n: number, out?: Vector): Vector {
|
||||
out = out || new Vector();
|
||||
|
||||
out.x = -n * this.y;
|
||||
out.y = n * this.x;
|
||||
|
||||
return out;
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* 投影
|
||||
* @param v
|
||||
*/
|
||||
pro(v: Vector): number {
|
||||
return this.dot(v) / v.len();
|
||||
}
|
||||
|
||||
/**
|
||||
* 法向
|
||||
*/
|
||||
nor(out?: Vector): Vector {
|
||||
out = out || new Vector();
|
||||
|
||||
out.x = this.y;
|
||||
out.y = -this.x;
|
||||
|
||||
return out;
|
||||
}
|
||||
|
||||
/**
|
||||
* 求模
|
||||
*/
|
||||
len(): number {
|
||||
return Math.hypot(this.x, this.y);
|
||||
}
|
||||
|
||||
/**
|
||||
* 平方模(节省求平方根操作)
|
||||
*/
|
||||
len_s(): number {
|
||||
return this.x * this.x + this.y * this.y;
|
||||
}
|
||||
|
||||
/**
|
||||
* 单位化
|
||||
*/
|
||||
nol(): Vector {
|
||||
let len = this.len();
|
||||
|
||||
if(len === 0) {
|
||||
return new Vector();
|
||||
}
|
||||
|
||||
this.x = this.x / len;
|
||||
this.y = this.y / len;
|
||||
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* 缩放
|
||||
* @param n
|
||||
*/
|
||||
scl(n: number, out?: Vector): Vector {
|
||||
out = out || new Vector();
|
||||
out.x = n * this.x;
|
||||
out.y = n * this.y;
|
||||
return out;
|
||||
}
|
||||
|
||||
/**
|
||||
* 反向
|
||||
*/
|
||||
inv(out?: Vector): Vector {
|
||||
out = out || new Vector();
|
||||
out.x = -this.x;
|
||||
out.y = -this.y;
|
||||
return out;
|
||||
}
|
||||
|
||||
/**
|
||||
* 判断两向量是否相等
|
||||
* @param v
|
||||
*/
|
||||
eql(v: Vector): boolean {
|
||||
return this.x === v.x && this.y === v.y;
|
||||
}
|
||||
|
||||
/**
|
||||
* 求两向量夹角(弧度制)
|
||||
* @param v
|
||||
*/
|
||||
ang(v: Vector): number {
|
||||
return Math.acos(this.dot(v) / (this.len() * v.len()));
|
||||
}
|
||||
|
||||
/**
|
||||
* 克隆向量
|
||||
*/
|
||||
col(): Vector {
|
||||
return new Vector(this.x, this.y);
|
||||
}
|
||||
length(v: [number, number]): number {
|
||||
return Math.sqrt(v[0]**2 + v[1]**2);
|
||||
},
|
||||
|
||||
/**
|
||||
* 绕某点旋转向量
|
||||
* @param radian 角度(弧度制)
|
||||
* @param point 绕的点
|
||||
* @param point 旋转的点
|
||||
* @param center 绕的点
|
||||
*/
|
||||
rot(radian: number, point: Vector, out?: Vector): Vector {
|
||||
out = out || new Vector();
|
||||
rotation(radian: number, point: [number, number], center: [number, number] = [0, 0]): [number, number] {
|
||||
if(radian === 0) return point;
|
||||
|
||||
radian = -radian;
|
||||
|
||||
let cos = Math.cos(radian),
|
||||
sin = Math.sin(radian),
|
||||
dx = this.x - point.x,
|
||||
dy = this.y - point.y;
|
||||
|
||||
out.x = point.x + (dx * cos - dy * sin);
|
||||
out.y = point.y + (dx * sin + dy * cos);
|
||||
dv = [point[0] - center[0], point[1] - center[1]],
|
||||
v = [0, 0];
|
||||
|
||||
v[0] = center[0] + (dv[0] * cos - dv[1] * sin);
|
||||
v[1] = center[1] + (dv[0] * sin + dv[1] * cos);
|
||||
|
||||
return out;
|
||||
}
|
||||
return v as [number, number];
|
||||
},
|
||||
|
||||
/**
|
||||
* 求向量法向
|
||||
*/
|
||||
tangent(v: [number, number]): [number, number] {
|
||||
return [-v[1], v[0]];
|
||||
},
|
||||
|
||||
/**
|
||||
* 向量单位化
|
||||
*/
|
||||
normalize(v: [number, number]): [number, number] {
|
||||
let len = Vector.length(v);
|
||||
|
||||
if(len === 0) {
|
||||
return [0, 0];
|
||||
}
|
||||
else if(len === 1) {
|
||||
return v;
|
||||
}
|
||||
else {
|
||||
return [v[0] / len, v[1] / len];
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* 求一个向量(点)按照direction方向,延长len长度后的坐标
|
||||
* @param v
|
||||
* @param direction
|
||||
* @param len
|
||||
*/
|
||||
loc(direction: Vector, len: number, out?: Vector): Vector {
|
||||
out = out || new Vector();
|
||||
location(v: [number, number], direction: [number, number], len: number): [number, number] {
|
||||
return Vector.add(v, Vector.scale(Vector.normalize(direction), len));
|
||||
},
|
||||
|
||||
direction = direction.nol();
|
||||
out.x = this.x + direction.x * len;
|
||||
out.y = this.y + direction.y * len;
|
||||
|
||||
return out;
|
||||
/**
|
||||
* 向量取反
|
||||
*/
|
||||
negative(v: [number, number]): [number, number] {
|
||||
return Vector.scale(v, -1);
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
export const _tempVector1 = new Vector();
|
||||
export const _tempVector2 = new Vector();
|
||||
export const _tempVector3 = new Vector();
|
||||
export const _tempVector4 = new Vector();
|
||||
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user