基本重构完成

底层渲染库舍弃 zrender,换为 antvG6
This commit is contained in:
Phenom
2021-04-06 21:45:11 +08:00
parent b886f33d9e
commit 72fcf5394a
36 changed files with 1860 additions and 1401 deletions
+44 -53
View File
@@ -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
View File
@@ -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();