@@ -78,6 +78,12 @@ export class ProcessParallelEdges extends BaseTransform<ProcessParallelEdgesOpti
78
78
super ( context , Object . assign ( { } , ProcessParallelEdges . defaultOptions , options ) ) ;
79
79
}
80
80
81
+ /**
82
+ * <zh/> 在每次绘制前处理平行边
83
+ *
84
+ * <en/> Process parallel edges before each drawing
85
+ * @param input
86
+ */
81
87
public beforeDraw ( input : DrawData ) : DrawData {
82
88
const edges = this . getAffectedParallelEdges ( input ) ;
83
89
@@ -90,6 +96,12 @@ export class ProcessParallelEdges extends BaseTransform<ProcessParallelEdgesOpti
90
96
return input ;
91
97
}
92
98
99
+ /**
100
+ * <zh/> 获取受影响的平行边
101
+ *
102
+ * <en/> Get affected parallel edges
103
+ * @param input
104
+ */
93
105
private getAffectedParallelEdges = ( input : DrawData ) : Map < ID , EdgeData > => {
94
106
const {
95
107
add : { edges : edgesToAdd } ,
@@ -240,35 +252,54 @@ export class ProcessParallelEdges extends BaseTransform<ProcessParallelEdgesOpti
240
252
}
241
253
242
254
/**
243
- * <zh/> 按照端点分组
255
+ * <zh/> 优化的按照端点分组方法,时间复杂度O(n)
244
256
*
245
- * <en/> Group by endpoints
257
+ * <en/> Optimized method to group by endpoints, time complexity O(n)
246
258
* @param edges - <zh/> 边集合 | <en/> Edges
247
259
* @returns <zh/> 端点分组后的边集合 | <en/> Edges grouped by endpoints
248
260
*/
249
261
export const groupByEndpoints = ( edges : Map < ID , EdgeData > ) => {
250
262
const edgeMap = new Map < string , EdgeData [ ] > ( ) ;
251
263
const processedEdgesSet = new Set < ID > ( ) ;
252
264
const reverses : Record < string , boolean > = { } ;
265
+ const includedEdgesInGroup = new Map < string , Set < ID > > ( ) ;
253
266
254
267
for ( const [ id , edge ] of edges ) {
255
268
if ( processedEdgesSet . has ( id ) ) continue ;
256
269
257
270
const { source, target } = edge ;
258
271
const sourceTarget = `${ source } -${ target } ` ;
259
272
260
- if ( ! edgeMap . has ( sourceTarget ) ) edgeMap . set ( sourceTarget , [ ] ) ;
261
- edgeMap . get ( sourceTarget ) ! . push ( edge ) ;
262
- processedEdgesSet . add ( id ) ;
273
+ if ( ! edgeMap . has ( sourceTarget ) ) {
274
+ edgeMap . set ( sourceTarget , [ ] ) ;
275
+ includedEdgesInGroup . set ( sourceTarget , new Set < ID > ( ) ) ;
276
+ }
277
+
278
+ const sourceTargetEdges = edgeMap . get ( sourceTarget ) ;
279
+ const includedEdges = includedEdgesInGroup . get ( sourceTarget ) ;
280
+
281
+ if ( sourceTargetEdges && includedEdges && ! includedEdges . has ( id ) ) {
282
+ sourceTargetEdges . push ( edge ) ;
283
+ includedEdges . add ( id ) ;
284
+ processedEdgesSet . add ( id ) ;
285
+ }
263
286
264
287
for ( const [ otherId , sedge ] of edges ) {
265
- if ( processedEdgesSet . has ( otherId ) ) continue ;
288
+ if ( processedEdgesSet . has ( otherId ) || otherId === id ) continue ;
266
289
267
290
if ( isParallelEdges ( edge , sedge ) ) {
268
- edgeMap . get ( sourceTarget ) ! . push ( sedge ) ;
269
- processedEdgesSet . add ( otherId ) ;
270
- if ( source === sedge . target && target === sedge . source ) {
271
- reverses [ `${ sedge . source } |${ sedge . target } |${ edgeMap . get ( sourceTarget ) ! . length - 1 } ` ] = true ;
291
+ const groupEdges = edgeMap . get ( sourceTarget ) ;
292
+ const includedGroupEdges = includedEdgesInGroup . get ( sourceTarget ) ;
293
+
294
+ if ( groupEdges && includedGroupEdges && ! includedGroupEdges . has ( otherId ) ) {
295
+ groupEdges . push ( sedge ) ;
296
+ includedGroupEdges . add ( otherId ) ;
297
+
298
+ if ( source === sedge . target && target === sedge . source ) {
299
+ reverses [ `${ sedge . source } |${ sedge . target } |${ groupEdges . length - 1 } ` ] = true ;
300
+ }
301
+
302
+ processedEdgesSet . add ( otherId ) ;
272
303
}
273
304
}
274
305
}
0 commit comments