UNPKG

6.3 kBTypeScriptView Raw
1/**
2 * @fileOverview Combo force layout
3 * @author shiwu.wyy@antfin.com
4 */
5import { Edge, OutNode, PointTuple, ComboConfig } from './types';
6import { Base } from './base';
7declare type Combo = ComboConfig & {
8 x?: number;
9 y?: number;
10 name?: string | number;
11 cx: number;
12 cy: number;
13 count?: number;
14 depth?: number;
15 children?: any[];
16 empty?: boolean;
17 minX?: number;
18 maxX?: number;
19 minY?: number;
20 maxY?: number;
21 size?: number;
22 r?: number;
23 itemType?: string;
24};
25declare type Node = OutNode & {
26 depth: number;
27 itemType?: string;
28 comboId?: string;
29};
30/**
31 * force layout for graph with combos
32 */
33export declare class ComboForceLayout extends Base {
34 /** 布局中心 */
35 center: PointTuple;
36 /** 停止迭代的最大迭代数 */
37 maxIteration: number;
38 /** 重力大小,影响图的紧凑程度 */
39 gravity: number;
40 /** 群组中心力大小 */
41 comboGravity: number;
42 /** 默认边长度 */
43 linkDistance: number | ((d?: unknown) => number);
44 /** 每次迭代位移的衰减相关参数 */
45 alpha: number;
46 alphaMin: number;
47 alphaDecay: number;
48 alphaTarget: number;
49 /** 节点运动速度衰减参数 */
50 velocityDecay: number;
51 /** 边引力大小 */
52 edgeStrength: number | ((d?: unknown) => number);
53 /** 节点引力大小 */
54 nodeStrength: number | ((d?: unknown) => number);
55 /** 是否开启防止重叠 */
56 preventOverlap: boolean;
57 /** 是否开启节点之间的防止重叠 */
58 preventNodeOverlap: boolean;
59 /** 是否开启 Combo 之间的防止重叠 */
60 preventComboOverlap: boolean;
61 /** 防止重叠的碰撞力大小 */
62 collideStrength: number | undefined;
63 /** 防止重叠的碰撞力大小 */
64 nodeCollideStrength: number | undefined;
65 /** 防止重叠的碰撞力大小 */
66 comboCollideStrength: number | undefined;
67 /** 节点大小,用于防止重叠 */
68 nodeSize: number | number[] | ((d?: unknown) => number) | undefined;
69 /** 节点最小间距,防止重叠时的间隙 */
70 nodeSpacing: ((d?: unknown) => number) | number | undefined;
71 /** Combo 最小间距,防止重叠时的间隙 */
72 comboSpacing: ((d?: unknown) => number) | number | undefined;
73 /** Combo 内部的 padding */
74 comboPadding: ((d?: unknown) => number) | number | number[] | undefined;
75 /** 优化计算斥力的速度,两节点间距超过 optimizeRangeFactor * width 则不再计算斥力和重叠斥力 */
76 optimizeRangeFactor: number;
77 /** 每次迭代的回调函数 */
78 onTick: () => void;
79 /** 每次迭代的回调函数 */
80 onLayoutEnd: () => void;
81 /** 根据边两端节点层级差距的调整引力系数的因子,取值范围 [0, 1]。层级差距越大,引力越小 */
82 depthAttractiveForceScale: number;
83 /** 根据边两端节点层级差距的调整斥力系数的因子,取值范围 [1, Infinity]。层级差距越大,斥力越大 */
84 depthRepulsiveForceScale: number;
85 /** 内部计算参数 */
86 nodes: Node[];
87 edges: Edge[];
88 combos: Combo[];
89 private comboTrees;
90 private comboTree;
91 private width;
92 private height;
93 private bias;
94 private nodeMap;
95 private oriComboMap;
96 private indexMap;
97 private comboMap;
98 private previousLayouted;
99 constructor(options?: ComboForceLayout.ComboForceLayoutOptions);
100 getDefaultCfg(): {
101 maxIteration: number;
102 center: number[];
103 gravity: number;
104 speed: number;
105 comboGravity: number;
106 preventOverlap: boolean;
107 preventComboOverlap: boolean;
108 preventNodeOverlap: boolean;
109 nodeSpacing: undefined;
110 collideStrength: undefined;
111 nodeCollideStrength: number;
112 comboCollideStrength: number;
113 comboSpacing: number;
114 comboPadding: number;
115 edgeStrength: number;
116 nodeStrength: number;
117 linkDistance: number;
118 };
119 /**
120 * 执行布局
121 */
122 execute(): void;
123 run(): void;
124 private initVals;
125 private initPos;
126 private getComboMap;
127 private applyComboCenterForce;
128 private applyCalculate;
129 /**
130 * Update the sizes of the combos according to their children
131 * Used for combos nonoverlap, but not re-render the combo shapes
132 */
133 private updateComboSizes;
134 /**
135 * prevent the overlappings among combos
136 */
137 private comboNonOverlapping;
138 /**
139 * Calculate the repulsive force between each node pair
140 * @param displacements The array stores the displacements for nodes
141 * @param vecMap The map stores vector between each node pair
142 */
143 private calRepulsive;
144 /**
145 * Calculate the attractive force between the node pair with edge
146 * @param displacements The array stores the displacements for nodes
147 * @param vecMap The map stores vector between each node pair
148 */
149 private calAttractive;
150 getType(): string;
151}
152export declare namespace ComboForceLayout {
153 interface ComboForceLayoutOptions {
154 type: 'comboForce';
155 center?: PointTuple;
156 maxIteration?: number;
157 linkDistance?: number | ((d?: unknown) => number);
158 nodeStrength?: number | ((d?: unknown) => number);
159 edgeStrength?: number | ((d?: unknown) => number);
160 preventOverlap?: boolean;
161 preventNodeOverlap?: boolean;
162 preventComboOverlap?: boolean;
163 collideStrength?: number | undefined;
164 nodeCollideStrength?: number | undefined;
165 comboCollideStrength?: number | undefined;
166 nodeSize?: number | number[] | ((d?: unknown) => number) | undefined;
167 nodeSpacing?: ((d?: unknown) => number) | number | undefined;
168 comboSpacing?: ((d?: unknown) => number) | number | undefined;
169 comboPadding?: ((d?: unknown) => number) | number | number[] | undefined;
170 alpha?: number;
171 alphaDecay?: number;
172 alphaMin?: number;
173 onTick?: () => void;
174 onLayoutEnd?: () => void;
175 gravity?: number;
176 comboGravity?: number;
177 optimizeRangeFactor?: number;
178 depthAttractiveForceScale?: number;
179 depthRepulsiveForceScale?: number;
180 velocityDecay?: number;
181 workerEnabled?: boolean;
182 }
183}
184export {};