mirror of
https://gitee.com/antv/g6.git
synced 2024-12-15 18:11:08 +08:00
136 lines
4.0 KiB
JavaScript
136 lines
4.0 KiB
JavaScript
import { Graph, Extensions, extend } from '@antv/g6';
|
||
// import by this way in your project. 在您的项目中请这样引入
|
||
// import { supportsThreads, initThreads, ForceLayout } from '@antv/layout-wasm';
|
||
|
||
const { supportsThreads, initThreads, ForceLayout, FruchtermanLayout, ForceAtlas2Layout } = window.layoutWASM; // WASM layout is not built-in G6 stbLib, you need to exend G6 with it.
|
||
|
||
const ExtGraph = extend(Graph, {
|
||
layouts: {
|
||
'force-wasm': ForceLayout,
|
||
'forceAtlas2-wasm': ForceAtlas2Layout,
|
||
'fruchterman-wasm': FruchtermanLayout,
|
||
},
|
||
});
|
||
const container = document.getElementById('container');
|
||
const width = container.scrollWidth;
|
||
const height = container.scrollHeight || 500;
|
||
|
||
const descriptionDiv = document.createElement('div');
|
||
container.appendChild(descriptionDiv);
|
||
|
||
let timer;
|
||
const beginTimer = () => {
|
||
const begin = performance.now();
|
||
timer = setInterval(() => {
|
||
descriptionDiv.innerHTML = `节点数量:1589, 边数量:2742 <br /> ⏰ Computing Time: ${Math.floor(
|
||
performance.now() - begin,
|
||
)}ms`;
|
||
}, 10);
|
||
};
|
||
beginTimer();
|
||
|
||
fetch('https://gw.alipayobjects.com/os/basement_prod/da5a1b47-37d6-44d7-8d10-f3e046dabf82.json') //'https://gw.alipayobjects.com/os/antvdemo/assets/data/relations.json'
|
||
.then((res) => res.json())
|
||
.then(async (data) => {
|
||
const supported = await supportsThreads();
|
||
const threads = await initThreads(supported);
|
||
|
||
const layoutConfigs = {
|
||
'force-wasm': {
|
||
type: 'force-wasm',
|
||
threads,
|
||
dimensions: 2,
|
||
maxIteration: 130,
|
||
minMovement: 0.4,
|
||
distanceThresholdMode: 'mean',
|
||
height,
|
||
width,
|
||
center: [width / 2, height / 2],
|
||
factor: 1,
|
||
gravity: 10,
|
||
linkDistance: 200,
|
||
edgeStrength: 200,
|
||
nodeStrength: 1000,
|
||
coulombDisScale: 0.005,
|
||
damping: 0.9,
|
||
maxSpeed: 1000,
|
||
interval: 0.02,
|
||
},
|
||
'forceAtals2-wasm': {
|
||
type: 'forceAtlas2-wasm',
|
||
threads,
|
||
dimensions: 2,
|
||
maxIteration: 100,
|
||
minMovement: 0.4,
|
||
distanceThresholdMode: 'mean',
|
||
height,
|
||
width,
|
||
center: [width / 2, height / 2],
|
||
kg: 5,
|
||
kr: 10,
|
||
ks: 0.1,
|
||
},
|
||
'fruchterman-wasm': {
|
||
type: 'fruchterman-wasm',
|
||
threads,
|
||
dimensions: 2,
|
||
maxIteration: 1000,
|
||
minMovement: 0.4,
|
||
distanceThresholdMode: 'mean',
|
||
height,
|
||
width,
|
||
gravity: 1,
|
||
speed: 5,
|
||
},
|
||
};
|
||
|
||
// remove positions in data to avoid the affecting
|
||
data.nodes.forEach((node) => {
|
||
delete node.x;
|
||
delete node.y;
|
||
});
|
||
|
||
const graph = new ExtGraph({
|
||
container: 'container',
|
||
width,
|
||
height,
|
||
transform: ['transform-v4-data'],
|
||
layout: layoutConfigs['force-wasm'],
|
||
autoFit: 'view',
|
||
modes: {
|
||
default: ['zoom-canvas', 'drag-canvas', 'drag-node', 'brush-select', 'click-select', 'hover-activate'],
|
||
},
|
||
data,
|
||
});
|
||
graph.on('afterlayout', (e) => {
|
||
clearTimeout(timer);
|
||
});
|
||
|
||
const btnContainer = document.createElement('div');
|
||
btnContainer.style.position = 'absolute';
|
||
container.appendChild(btnContainer);
|
||
const tip = document.createElement('span');
|
||
tip.innerHTML = '👉 Change Layout:';
|
||
btnContainer.appendChild(tip);
|
||
|
||
Object.keys(layoutConfigs).forEach((name, i) => {
|
||
const btn = document.createElement('a');
|
||
btn.innerHTML = name;
|
||
btn.style.backgroundColor = 'rgba(255, 255, 255, 0.8)';
|
||
btn.style.padding = '4px';
|
||
btn.style.marginLeft = i > 0 ? '24px' : '8px';
|
||
btnContainer.appendChild(btn);
|
||
btn.addEventListener('click', () => {
|
||
beginTimer();
|
||
graph.layout(layoutConfigs[name]);
|
||
});
|
||
});
|
||
});
|
||
|
||
if (typeof window !== 'undefined')
|
||
window.onresize = () => {
|
||
if (!graph || graph.destroyed) return;
|
||
if (!container || !container.scrollWidth || !container.scrollHeight) return;
|
||
graph.setSize([container.scrollWidth, container.scrollHeight - 160]);
|
||
};
|