Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
x649585723
incubator-echarts
提交
d9c5d2fc
I
incubator-echarts
项目概览
x649585723
/
incubator-echarts
与 Fork 源项目一致
从无法访问的项目Fork
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
I
incubator-echarts
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
d9c5d2fc
编写于
6月 11, 2020
作者:
Z
zakwu
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
fix(tree): code rebuild follow the review suggest
上级
b2856b28
变更
8
隐藏空白更改
内联
并排
Showing
8 changed file
with
234 addition
and
155 deletion
+234
-155
src/chart/graph/GraphSeries.js
src/chart/graph/GraphSeries.js
+4
-1
src/chart/graph/circularLayoutHelper.js
src/chart/graph/circularLayoutHelper.js
+8
-2
src/chart/graph/forceLayout.js
src/chart/graph/forceLayout.js
+7
-1
src/chart/graph/simpleLayoutHelper.js
src/chart/graph/simpleLayoutHelper.js
+12
-5
src/chart/helper/createGraphFromNodeEdge.js
src/chart/helper/createGraphFromNodeEdge.js
+1
-5
src/chart/helper/multipleGraphEdgeHelper.js
src/chart/helper/multipleGraphEdgeHelper.js
+120
-110
src/data/Graph.js
src/data/Graph.js
+5
-1
test/graph-mulitple-edges.html
test/graph-mulitple-edges.html
+77
-30
未找到文件。
src/chart/graph/GraphSeries.js
浏览文件 @
d9c5d2fc
...
@@ -25,6 +25,7 @@ import Model from '../../model/Model';
...
@@ -25,6 +25,7 @@ import Model from '../../model/Model';
import
{
encodeHTML
}
from
'
../../util/format
'
;
import
{
encodeHTML
}
from
'
../../util/format
'
;
import
createGraphFromNodeEdge
from
'
../helper/createGraphFromNodeEdge
'
;
import
createGraphFromNodeEdge
from
'
../helper/createGraphFromNodeEdge
'
;
import
LegendVisualProvider
from
'
../../visual/LegendVisualProvider
'
;
import
LegendVisualProvider
from
'
../../visual/LegendVisualProvider
'
;
import
{
initCurvenessList
}
from
'
../helper/multipleGraphEdgeHelper
'
;
var
GraphSeries
=
echarts
.
extendSeriesModel
({
var
GraphSeries
=
echarts
.
extendSeriesModel
({
...
@@ -66,6 +67,8 @@ var GraphSeries = echarts.extendSeriesModel({
...
@@ -66,6 +67,8 @@ var GraphSeries = echarts.extendSeriesModel({
var
self
=
this
;
var
self
=
this
;
if
(
nodes
&&
edges
)
{
if
(
nodes
&&
edges
)
{
// auto curveness
initCurvenessList
(
edges
,
this
);
return
createGraphFromNodeEdge
(
nodes
,
edges
,
this
,
true
,
beforeLink
).
data
;
return
createGraphFromNodeEdge
(
nodes
,
edges
,
this
,
true
,
beforeLink
).
data
;
}
}
...
@@ -289,4 +292,4 @@ var GraphSeries = echarts.extendSeriesModel({
...
@@ -289,4 +292,4 @@ var GraphSeries = echarts.extendSeriesModel({
}
}
});
});
export
default
GraphSeries
;
export
default
GraphSeries
;
\ No newline at end of file
src/chart/graph/circularLayoutHelper.js
浏览文件 @
d9c5d2fc
...
@@ -19,6 +19,8 @@
...
@@ -19,6 +19,8 @@
import
*
as
vec2
from
'
zrender/src/core/vector
'
;
import
*
as
vec2
from
'
zrender/src/core/vector
'
;
import
{
getSymbolSize
,
getNodeGlobalScale
}
from
'
./graphHelper
'
;
import
{
getSymbolSize
,
getNodeGlobalScale
}
from
'
./graphHelper
'
;
import
*
as
zrUtil
from
'
zrender/src/core/util
'
;
import
{
getCurvenessForEdge
}
from
'
../helper/multipleGraphEdgeHelper
'
;
var
PI
=
Math
.
PI
;
var
PI
=
Math
.
PI
;
...
@@ -73,8 +75,12 @@ export function circularLayout(seriesModel, basedOn) {
...
@@ -73,8 +75,12 @@ export function circularLayout(seriesModel, basedOn) {
_layoutNodesBasedOn
[
basedOn
](
seriesModel
,
coordSys
,
graph
,
nodeData
,
r
,
cx
,
cy
,
count
);
_layoutNodesBasedOn
[
basedOn
](
seriesModel
,
coordSys
,
graph
,
nodeData
,
r
,
cx
,
cy
,
count
);
graph
.
eachEdge
(
function
(
edge
)
{
graph
.
eachEdge
(
function
(
edge
,
index
)
{
var
curveness
=
edge
.
getModel
().
get
(
'
lineStyle.curveness
'
)
||
0
;
var
curveness
=
zrUtil
.
retrieve3
(
getCurvenessForEdge
(
edge
,
seriesModel
,
index
),
edge
.
getModel
().
get
(
'
lineStyle.curveness
'
),
0
);
var
p1
=
vec2
.
clone
(
edge
.
node1
.
getLayout
());
var
p1
=
vec2
.
clone
(
edge
.
node1
.
getLayout
());
var
p2
=
vec2
.
clone
(
edge
.
node2
.
getLayout
());
var
p2
=
vec2
.
clone
(
edge
.
node2
.
getLayout
());
var
cp1
;
var
cp1
;
...
...
src/chart/graph/forceLayout.js
浏览文件 @
d9c5d2fc
...
@@ -23,6 +23,7 @@ import {circularLayout} from './circularLayoutHelper';
...
@@ -23,6 +23,7 @@ import {circularLayout} from './circularLayoutHelper';
import
{
linearMap
}
from
'
../../util/number
'
;
import
{
linearMap
}
from
'
../../util/number
'
;
import
*
as
vec2
from
'
zrender/src/core/vector
'
;
import
*
as
vec2
from
'
zrender/src/core/vector
'
;
import
*
as
zrUtil
from
'
zrender/src/core/util
'
;
import
*
as
zrUtil
from
'
zrender/src/core/util
'
;
import
{
getCurvenessForEdge
}
from
'
../helper/multipleGraphEdgeHelper
'
;
export
default
function
(
ecModel
)
{
export
default
function
(
ecModel
)
{
ecModel
.
eachSeriesByType
(
'
graph
'
,
function
(
graphSeries
)
{
ecModel
.
eachSeriesByType
(
'
graph
'
,
function
(
graphSeries
)
{
...
@@ -84,11 +85,16 @@ export default function (ecModel) {
...
@@ -84,11 +85,16 @@ export default function (ecModel) {
d
=
(
edgeLength
[
0
]
+
edgeLength
[
1
])
/
2
;
d
=
(
edgeLength
[
0
]
+
edgeLength
[
1
])
/
2
;
}
}
var
edgeModel
=
edge
.
getModel
();
var
edgeModel
=
edge
.
getModel
();
var
curveness
=
zrUtil
.
retrieve3
(
-
getCurvenessForEdge
(
edge
,
graphSeries
,
idx
,
true
),
edge
.
getModel
().
get
(
'
lineStyle.curveness
'
),
0
);
return
{
return
{
n1
:
nodes
[
edge
.
node1
.
dataIndex
],
n1
:
nodes
[
edge
.
node1
.
dataIndex
],
n2
:
nodes
[
edge
.
node2
.
dataIndex
],
n2
:
nodes
[
edge
.
node2
.
dataIndex
],
d
:
d
,
d
:
d
,
curveness
:
edgeModel
.
get
(
'
lineStyle.curveness
'
)
||
0
,
curveness
:
curveness
,
ignoreForceLayout
:
edgeModel
.
get
(
'
ignoreForceLayout
'
)
ignoreForceLayout
:
edgeModel
.
get
(
'
ignoreForceLayout
'
)
};
};
});
});
...
...
src/chart/graph/simpleLayoutHelper.js
浏览文件 @
d9c5d2fc
...
@@ -18,6 +18,9 @@
...
@@ -18,6 +18,9 @@
*/
*/
import
*
as
vec2
from
'
zrender/src/core/vector
'
;
import
*
as
vec2
from
'
zrender/src/core/vector
'
;
import
*
as
zrUtil
from
'
zrender/src/core/util
'
;
import
{
getCurvenessForEdge
}
from
'
../helper/multipleGraphEdgeHelper
'
;
export
function
simpleLayout
(
seriesModel
)
{
export
function
simpleLayout
(
seriesModel
)
{
var
coordSys
=
seriesModel
.
coordinateSystem
;
var
coordSys
=
seriesModel
.
coordinateSystem
;
...
@@ -31,12 +34,16 @@ export function simpleLayout(seriesModel) {
...
@@ -31,12 +34,16 @@ export function simpleLayout(seriesModel) {
node
.
setLayout
([
+
model
.
get
(
'
x
'
),
+
model
.
get
(
'
y
'
)]);
node
.
setLayout
([
+
model
.
get
(
'
x
'
),
+
model
.
get
(
'
y
'
)]);
});
});
simpleLayoutEdge
(
graph
);
simpleLayoutEdge
(
graph
,
seriesModel
);
}
}
export
function
simpleLayoutEdge
(
graph
)
{
export
function
simpleLayoutEdge
(
graph
,
seriesModel
)
{
graph
.
eachEdge
(
function
(
edge
)
{
graph
.
eachEdge
(
function
(
edge
,
index
)
{
var
curveness
=
edge
.
getModel
().
get
(
'
lineStyle.curveness
'
)
||
0
;
var
curveness
=
zrUtil
.
retrieve3
(
edge
.
getModel
().
get
(
'
lineStyle.curveness
'
)
||
null
,
-
getCurvenessForEdge
(
edge
,
seriesModel
,
index
,
true
),
0
);
var
p1
=
vec2
.
clone
(
edge
.
node1
.
getLayout
());
var
p1
=
vec2
.
clone
(
edge
.
node1
.
getLayout
());
var
p2
=
vec2
.
clone
(
edge
.
node2
.
getLayout
());
var
p2
=
vec2
.
clone
(
edge
.
node2
.
getLayout
());
var
points
=
[
p1
,
p2
];
var
points
=
[
p1
,
p2
];
...
@@ -48,4 +55,4 @@ export function simpleLayoutEdge(graph) {
...
@@ -48,4 +55,4 @@ export function simpleLayoutEdge(graph) {
}
}
edge
.
setLayout
(
points
);
edge
.
setLayout
(
points
);
});
});
}
}
\ No newline at end of file
src/chart/helper/createGraphFromNodeEdge.js
浏览文件 @
d9c5d2fc
...
@@ -24,7 +24,6 @@ import linkList from '../../data/helper/linkList';
...
@@ -24,7 +24,6 @@ import linkList from '../../data/helper/linkList';
import
createDimensions
from
'
../../data/helper/createDimensions
'
;
import
createDimensions
from
'
../../data/helper/createDimensions
'
;
import
CoordinateSystem
from
'
../../CoordinateSystem
'
;
import
CoordinateSystem
from
'
../../CoordinateSystem
'
;
import
createListFromArray
from
'
./createListFromArray
'
;
import
createListFromArray
from
'
./createListFromArray
'
;
import
{
calculateMutilEdges
,
setCurvenessForLink
}
from
'
./multipleGraphEdgeHelper
'
;
export
default
function
(
nodes
,
edges
,
seriesModel
,
directed
,
beforeLink
)
{
export
default
function
(
nodes
,
edges
,
seriesModel
,
directed
,
beforeLink
)
{
// ??? TODO
// ??? TODO
...
@@ -41,16 +40,13 @@ export default function (nodes, edges, seriesModel, directed, beforeLink) {
...
@@ -41,16 +40,13 @@ export default function (nodes, edges, seriesModel, directed, beforeLink) {
var
validEdges
=
[];
var
validEdges
=
[];
var
linkCount
=
0
;
var
linkCount
=
0
;
// auto curveness
calculateMutilEdges
(
edges
,
seriesModel
,
graph
);
for
(
var
i
=
0
;
i
<
edges
.
length
;
i
++
)
{
for
(
var
i
=
0
;
i
<
edges
.
length
;
i
++
)
{
var
link
=
edges
[
i
];
var
link
=
edges
[
i
];
var
source
=
link
.
source
;
var
source
=
link
.
source
;
var
target
=
link
.
target
;
var
target
=
link
.
target
;
setCurvenessForLink
(
link
,
seriesModel
,
i
,
graph
);
// addEdge may fail when source or target not exists
// addEdge may fail when source or target not exists
if
(
graph
.
addEdge
(
source
,
target
,
linkCount
))
{
if
(
graph
.
addEdge
(
source
,
target
,
linkCount
,
seriesModel
))
{
validEdges
.
push
(
link
);
validEdges
.
push
(
link
);
linkNameList
.
push
(
zrUtil
.
retrieve
(
link
.
id
,
source
+
'
>
'
+
target
));
linkNameList
.
push
(
zrUtil
.
retrieve
(
link
.
id
,
source
+
'
>
'
+
target
));
linkCount
++
;
linkCount
++
;
...
...
src/chart/helper/multipleGraphEdgeHelper.js
浏览文件 @
d9c5d2fc
...
@@ -17,122 +17,117 @@
...
@@ -17,122 +17,117 @@
* under the License.
* under the License.
*/
*/
var
linkMap
=
{};
var
KEY_DELIMITER
=
'
-->
'
;
var
curvenessList
=
[];
/**
/**
* params handler
* params handler
* @param seriesModel
* @param
{module:echarts/model/SeriesModel}
seriesModel
* @returns {*}
* @returns {*}
*/
*/
var
getAutoCurvenessParams
=
function
(
seriesModel
)
{
var
getAutoCurvenessParams
=
function
(
seriesModel
)
{
var
autoCurveness
=
seriesModel
.
getModel
(
'
autoCurveness
'
);
return
seriesModel
.
get
(
'
autoCurveness
'
)
||
null
;
if
(
!
autoCurveness
||
!
autoCurveness
.
option
)
{
return
null
;
}
return
autoCurveness
.
option
;
};
};
/**
/**
* Generate a list of edge curvatures, 20 is the default
* Generate a list of edge curvatures, 20 is the default
* @param seriesModel
* @param
{module:echarts/model/SeriesModel}
seriesModel
* @param
addLength append l
ength
* @param
{number} appendL
ength
* @return 20 => [0, -0.2, 0.2, -0.4, 0.4, -0.6, 0.6, -0.8, 0.8, -1, 1, -1.2, 1.2, -1.4, 1.4, -1.6, 1.6, -1.8, 1.8, -2]
* @return 20 => [0, -0.2, 0.2, -0.4, 0.4, -0.6, 0.6, -0.8, 0.8, -1, 1, -1.2, 1.2, -1.4, 1.4, -1.6, 1.6, -1.8, 1.8, -2]
*/
*/
var
createCurveness
=
function
(
seriesModel
,
a
d
dLength
)
{
var
createCurveness
=
function
(
seriesModel
,
a
ppen
dLength
)
{
var
autoCurvenssParmas
=
getAutoCurvenessParams
(
seriesModel
);
var
autoCurven
e
ssParmas
=
getAutoCurvenessParams
(
seriesModel
);
var
length
=
20
;
var
length
=
20
;
var
curvenessList
=
[];
// handler the function set
// handler the function set
if
(
typeof
autoCurvenssParmas
===
'
number
'
)
{
if
(
typeof
autoCurven
e
ssParmas
===
'
number
'
)
{
length
=
autoCurvenssParmas
;
length
=
autoCurven
e
ssParmas
;
}
}
else
if
(
typeof
autoCurvenssParmas
===
'
function
'
)
{
else
if
(
Object
.
prototype
.
toString
.
call
(
autoCurvenessParmas
)
===
'
[object Array]
'
)
{
curvenessList
=
autoCurvenssParmas
()
;
seriesModel
.
_curvenessList
=
autoCurvenessParmas
;
return
;
return
;
}
}
// addLength
// append length
if
(
addLength
)
{
if
(
appendLength
>
length
)
{
length
=
addLength
;
length
=
appendLength
;
}
// if already calculated return
if
(
length
<
curvenessList
.
length
)
{
return
;
}
}
//
保证长度为偶数
//
make sure the length is even
var
len
=
length
%
2
?
length
+
2
:
length
+
3
;
var
len
=
length
%
2
?
length
+
2
:
length
+
3
;
curvenessList
=
[];
curvenessList
=
[];
for
(
var
i
=
0
;
i
<
len
;
i
++
)
{
for
(
var
i
=
0
;
i
<
len
;
i
++
)
{
curvenessList
.
push
((
i
%
2
?
i
+
1
:
i
)
/
10
*
(
i
%
2
?
-
1
:
1
));
curvenessList
.
push
((
i
%
2
?
i
+
1
:
i
)
/
10
*
(
i
%
2
?
-
1
:
1
));
}
}
seriesModel
.
_curvenessList
=
curvenessList
;
};
};
/**
/**
* Create different cache key data in the positive and negative directions, in order to set the curvature later
* Create different cache key data in the positive and negative directions, in order to set the curvature later
* @param link
* @param {number|string|module:echarts/data/Graph.Node} n1
* @param seriesModel
* @param {number|string|module:echarts/data/Graph.Node} n2
* @returns {string}
* @param {module:echarts/model/SeriesModel} seriesModel
* @returns {string} key
*/
*/
var
getKeyOfLinks
=
function
(
link
,
seriesModel
)
{
var
getKeyOfEdges
=
function
(
n1
,
n2
,
seriesModel
)
{
return
[
seriesModel
.
uid
,
link
.
source
,
link
.
target
].
join
(
'
>
'
);
var
source
=
[
n1
.
id
,
n1
.
dataIndex
].
join
(
'
.
'
);
var
target
=
[
n2
.
id
,
n2
.
dataIndex
].
join
(
'
.
'
);
return
[
seriesModel
.
uid
,
source
,
target
].
join
(
KEY_DELIMITER
);
};
};
/**
/**
* get opposite key
* get opposite key
* 获取反向的key
* @param {string} key
* @param key
* @returns {string}
* @returns {string}
*/
*/
var
getOppositeKey
=
function
(
key
)
{
var
getOppositeKey
=
function
(
key
)
{
var
keys
=
key
.
split
(
'
>
'
);
var
keys
=
key
.
split
(
KEY_DELIMITER
);
return
[
keys
[
0
],
keys
[
2
],
keys
[
1
]].
join
(
KEY_DELIMITER
);
return
[
keys
[
0
],
keys
[
2
],
keys
[
1
]].
join
(
'
>
'
);
};
};
/**
/**
* set linkMap with key
* set edgeMap with key
* @param link
* @param {number|string|module:echarts/data/Graph.Node} n1
* @param seriesModel
* @param {number|string|module:echarts/data/Graph.Node} n2
* @param index
* @param {module:echarts/model/SeriesModel} seriesModel
* @param {number} index
*/
*/
var
setLinkToMap
=
function
(
link
,
seriesModel
,
index
)
{
var
setEdgeToMap
=
function
(
n1
,
n2
,
seriesModel
,
index
)
{
var
key
=
getKeyOfLinks
(
link
,
seriesModel
);
var
key
=
getKeyOfEdges
(
n1
,
n2
,
seriesModel
);
var
hasOppositeLinks
=
linkMap
[
getOppositeKey
(
key
)];
var
edgeMap
=
seriesModel
.
_edgeMap
;
var
oppositeEdges
=
edgeMap
[
getOppositeKey
(
key
)];
// set direction
// set direction
if
(
hasOppositeLinks
&&
linkMap
[
key
]
&&
!
linkMap
[
key
].
isForward
)
{
if
(
edgeMap
[
key
]
&&
!
oppositeEdges
)
{
linkMap
[
getOppositeKey
(
key
)].
isForward
=
true
;
edgeMap
[
key
].
isForward
=
true
;
}
else
if
(
oppositeEdges
&&
edgeMap
[
key
])
{
oppositeEdges
.
isForward
=
true
;
edgeMap
[
key
].
isForward
=
false
;
}
}
linkMap
[
key
]
=
link
Map
[
key
]
||
[];
edgeMap
[
key
]
=
edge
Map
[
key
]
||
[];
link
Map
[
key
].
push
(
index
);
edge
Map
[
key
].
push
(
index
);
};
};
/**
/**
* get linkMap with key
* get edgeMap with key
* @param link
* @param edge
* @param seriesModel
* @param {module:echarts/model/SeriesModel} seriesModel
* @param index
*/
*/
var
get
LinkFromMap
=
function
(
link
,
seriesModel
)
{
var
get
EdgeFromMap
=
function
(
edge
,
seriesModel
)
{
var
key
=
getKeyOf
Links
(
link
,
seriesModel
);
var
key
=
getKeyOf
Edges
(
edge
.
node1
,
edge
.
node2
,
seriesModel
);
return
link
Map
[
key
];
return
seriesModel
.
_edge
Map
[
key
];
};
};
/**
/**
* calculate all cases total length
* calculate all cases total length
* @param
link
* @param
edge
* @param seriesModel
* @param seriesModel
* @returns {number}
* @returns {number}
*/
*/
var
getTotalLengthBetweenNodes
=
function
(
link
,
seriesModel
)
{
var
getTotalLengthBetweenNodes
=
function
(
edge
,
seriesModel
)
{
var
len
=
get
LinkMapLengthWithKey
([
seriesModel
.
uid
,
link
.
source
,
link
.
target
].
join
(
'
>
'
)
);
var
len
=
get
EdgeMapLengthWithKey
(
getKeyOfEdges
(
edge
.
node1
,
edge
.
node2
,
seriesModel
),
seriesModel
);
var
lenV
=
get
LinkMapLengthWithKey
([
seriesModel
.
uid
,
link
.
target
,
link
.
source
].
join
(
'
>
'
)
);
var
lenV
=
get
EdgeMapLengthWithKey
(
getKeyOfEdges
(
edge
.
node2
,
edge
.
node1
,
seriesModel
),
seriesModel
);
return
len
+
lenV
;
return
len
+
lenV
;
};
};
...
@@ -141,81 +136,96 @@ var getTotalLengthBetweenNodes = function (link, seriesModel) {
...
@@ -141,81 +136,96 @@ var getTotalLengthBetweenNodes = function (link, seriesModel) {
*
*
* @param key
* @param key
*/
*/
var
getLinkMapLengthWithKey
=
function
(
key
)
{
var
getEdgeMapLengthWithKey
=
function
(
key
,
seriesModel
)
{
return
linkMap
[
key
]
?
linkMap
[
key
].
length
:
0
;
var
edgeMap
=
seriesModel
.
_edgeMap
;
return
edgeMap
[
key
]
?
edgeMap
[
key
].
length
:
0
;
};
};
/**
/**
* Count the number of edges between the same two points, used to obtain the curvature table and the parity of the edge
* Count the number of edges between the same two points, used to obtain the curvature table and the parity of the edge
* @see /graph/GraphSeries.js@getInitialData
* @param edges
* @param edges
* @param seriesModel
* @param {module:echarts/model/SeriesModel} seriesModel
* @param graph
*/
*/
export
function
calculateMutilEdges
(
edges
,
seriesModel
,
graph
)
{
export
function
initCurvenessList
(
edges
,
seriesModel
)
{
if
(
!
getAutoCurvenessParams
(
seriesModel
))
{
if
(
!
getAutoCurvenessParams
(
seriesModel
))
{
return
;
return
;
}
}
// Hang on this object 4 dispose
// Hang on this object 4 dispose
curvenessList
=
graph
.
curvenessList
||
[];
seriesModel
.
_curvenessList
=
seriesModel
.
_curvenessList
||
[];
linkMap
=
graph
.
linkMap
=
graph
.
linkMap
||
{};
// calc the array of curveness List
for
(
var
i
=
0
;
i
<
edges
.
length
;
i
++
)
{
var
link
=
edges
[
i
];
var
source
=
link
.
source
;
var
target
=
link
.
target
;
if
(
!
source
||
!
target
)
{
continue
;
}
setLinkToMap
(
link
,
seriesModel
,
i
);
}
// calc the array of curvenessList
createCurveness
(
seriesModel
);
createCurveness
(
seriesModel
);
}
}
/**
/**
* Set curvature for link
* create the edgeMap after addEdges
* @param link
* @see chart/helper/createGraphFromNodeEdge.js#L52
* @param seriesModel
* @param {number|string|module:echarts/data/Graph.Node} n1
* @param {number|string|module:echarts/data/Graph.Node} n2
* @param {module:echarts/model/SeriesModel} seriesModel
* @param {number} dataIndex
*/
export
function
createEdgeMapForCurveness
(
n1
,
n2
,
seriesModel
,
dataIndex
)
{
seriesModel
.
_edgeMap
=
seriesModel
.
_edgeMap
||
{};
setEdgeToMap
(
n1
,
n2
,
seriesModel
,
dataIndex
);
}
/**
* get curvature for edge
* @param edge
* @param {module:echarts/model/SeriesModel} seriesModel
* @param index
* @param index
*/
*/
export
function
setCurvenessForLink
(
link
,
seriesModel
,
index
)
{
export
function
getCurvenessForEdge
(
edge
,
seriesModel
,
index
,
needReverse
)
{
if
(
!
getAutoCurvenessParams
(
seriesModel
))
{
const
autoCurvenessParams
=
getAutoCurvenessParams
(
seriesModel
);
return
;
const
isArrayParam
=
Object
.
prototype
.
toString
.
call
(
autoCurvenessParams
)
===
'
[object Array]
'
;
if
(
!
autoCurvenessParams
)
{
return
null
;
}
}
var
linkArray
=
getLinkFromMap
(
link
,
seriesModel
);
var
edgeArray
=
getEdgeFromMap
(
edge
,
seriesModel
);
if
(
!
link
Array
)
{
if
(
!
edge
Array
)
{
return
;
return
null
;
}
}
var
linkIndex
=
linkArray
.
findIndex
(
function
(
it
)
{
var
edgeIndex
=
-
1
;
return
it
===
index
;
for
(
var
i
=
0
;
i
<
edgeArray
.
length
;
i
++
)
{
});
if
(
edgeArray
[
i
]
===
index
)
{
var
totalLen
=
getTotalLengthBetweenNodes
(
link
,
seriesModel
);
edgeIndex
=
i
;
// if totalLen bigger than curvenessList, recreate curvenessList
break
;
if
(
totalLen
>
curvenessList
.
length
)
{
}
createCurveness
(
seriesModel
,
totalLen
);
}
}
// if totalLen is Longer createCurveness
link
.
lineStyle
=
link
.
lineStyle
||
{};
var
totalLen
=
getTotalLengthBetweenNodes
(
edge
,
seriesModel
);
// if is opposite link, must set curvenss to opposite number
createCurveness
(
seriesModel
,
totalLen
);
var
curKey
=
getKeyOfLinks
(
link
,
seriesModel
);
if
(
!
linkArray
.
isForward
)
{
edge
.
lineStyle
=
edge
.
lineStyle
||
{};
// the opposite link show outside
// if is opposite edge, must set curvenss to opposite number
var
curKey
=
getKeyOfEdges
(
edge
.
node1
,
edge
.
node2
,
seriesModel
);
var
curvenessList
=
seriesModel
.
_curvenessList
;
// if pass array no need parity
var
parityCorrection
=
isArrayParam
?
0
:
totalLen
%
2
?
0
:
1
;
if
(
!
edgeArray
.
isForward
)
{
// the opposite edge show outside
var
oppositeKey
=
getOppositeKey
(
curKey
);
var
oppositeKey
=
getOppositeKey
(
curKey
);
var
len
=
getLinkMapLengthWithKey
(
oppositeKey
);
var
len
=
getEdgeMapLengthWithKey
(
oppositeKey
,
seriesModel
);
var
layout
=
seriesModel
.
getModel
(
'
layout
'
).
option
;
var
resValue
=
curvenessList
[
edgeIndex
+
len
+
parityCorrection
];
// Because the curvature algorithm of each layout is different, the reverse needs to be adapted here
// isNeedReverse, simple, force type need reverse the curveness in the junction of the forword and the opposite
if
(
layout
===
'
none
'
||
layout
===
'
force
'
)
{
if
(
needReverse
)
{
link
.
lineStyle
.
curveness
=
-
1
*
curvenessList
[
linkIndex
+
len
+
(
totalLen
%
2
?
0
:
1
)];
// set as array may make the parity by add 1
if
(
isArrayParam
)
{
return
(
len
+
parityCorrection
+
1
)
%
2
?
resValue
:
-
resValue
;
}
else
{
return
(
len
+
parityCorrection
)
%
2
?
resValue
:
-
resValue
;
}
}
}
else
if
(
layout
===
'
circular
'
)
{
else
{
link
.
lineStyle
.
curveness
=
curvenessList
[
linkIndex
+
len
+
(
totalLen
%
2
?
0
:
1
)
];
return
curvenessList
[
edgeIndex
+
len
+
parityCorrection
];
}
}
}
}
else
{
else
{
link
.
lineStyle
.
curveness
=
curvenessList
[
linkIndex
+
(
totalLen
%
2
?
0
:
1
)
];
return
curvenessList
[
edgeIndex
];
}
}
}
}
src/data/Graph.js
浏览文件 @
d9c5d2fc
...
@@ -20,6 +20,7 @@
...
@@ -20,6 +20,7 @@
import
{
__DEV__
}
from
'
../config
'
;
import
{
__DEV__
}
from
'
../config
'
;
import
*
as
zrUtil
from
'
zrender/src/core/util
'
;
import
*
as
zrUtil
from
'
zrender/src/core/util
'
;
import
{
enableClassCheck
}
from
'
../util/clazz
'
;
import
{
enableClassCheck
}
from
'
../util/clazz
'
;
import
{
createEdgeMapForCurveness
}
from
'
../chart/helper/multipleGraphEdgeHelper
'
;
// id may be function name of Object, add a prefix to avoid this problem.
// id may be function name of Object, add a prefix to avoid this problem.
function
generateNodeKey
(
id
)
{
function
generateNodeKey
(
id
)
{
...
@@ -137,9 +138,10 @@ graphProto.getNodeById = function (id) {
...
@@ -137,9 +138,10 @@ graphProto.getNodeById = function (id) {
* @param {number|string|module:echarts/data/Graph.Node} n1
* @param {number|string|module:echarts/data/Graph.Node} n1
* @param {number|string|module:echarts/data/Graph.Node} n2
* @param {number|string|module:echarts/data/Graph.Node} n2
* @param {number} [dataIndex=-1]
* @param {number} [dataIndex=-1]
* @param {module:echarts/model/SeriesModel} seriesModel
* @return {module:echarts/data/Graph.Edge}
* @return {module:echarts/data/Graph.Edge}
*/
*/
graphProto
.
addEdge
=
function
(
n1
,
n2
,
dataIndex
)
{
graphProto
.
addEdge
=
function
(
n1
,
n2
,
dataIndex
,
seriesModel
)
{
var
nodesMap
=
this
.
_nodesMap
;
var
nodesMap
=
this
.
_nodesMap
;
var
edgesMap
=
this
.
_edgesMap
;
var
edgesMap
=
this
.
_edgesMap
;
...
@@ -177,6 +179,8 @@ graphProto.addEdge = function (n1, n2, dataIndex) {
...
@@ -177,6 +179,8 @@ graphProto.addEdge = function (n1, n2, dataIndex) {
this
.
edges
.
push
(
edge
);
this
.
edges
.
push
(
edge
);
edgesMap
[
key
]
=
edge
;
edgesMap
[
key
]
=
edge
;
createEdgeMapForCurveness
(
n1
,
n2
,
seriesModel
,
dataIndex
);
return
edge
;
return
edge
;
};
};
...
...
test/graph-mulitple-edges.html
浏览文件 @
d9c5d2fc
...
@@ -34,6 +34,7 @@ under the License.
...
@@ -34,6 +34,7 @@ under the License.
}
}
</style>
</style>
<div
id=
"main0"
class=
"main"
></div>
<div
id=
"main0"
class=
"main"
></div>
<div
id=
"main7"
class=
"main"
></div>
<div
id=
"main1"
class=
"main"
></div>
<div
id=
"main1"
class=
"main"
></div>
<div
id=
"main2"
class=
"main"
></div>
<div
id=
"main2"
class=
"main"
></div>
<div
id=
"main3"
class=
"main"
></div>
<div
id=
"main3"
class=
"main"
></div>
...
@@ -41,37 +42,74 @@ under the License.
...
@@ -41,37 +42,74 @@ under the License.
<div
id=
"main5"
class=
"main"
></div>
<div
id=
"main5"
class=
"main"
></div>
<div
id=
"main6"
class=
"main"
></div>
<div
id=
"main6"
class=
"main"
></div>
<script>
<script>
window
.
createLinks
=
function
(
length
)
{
require
([
var
res
=
[]
'
echarts
'
for
(
var
i
=
0
;
i
<
length
;
i
++
)
{
],
function
(
echarts
)
{
var
x
=
Math
.
round
((
Math
.
random
()
*
10
))
%
2
var
container
=
document
.
getElementById
(
'
main6
'
);
res
.
push
({
var
data
=
[{
"
source
"
:
"
node3
"
,
"
target
"
:
"
node1
"
,
"
label
"
:{
"
show
"
:
true
}},{
"
source
"
:
"
node3
"
,
"
target
"
:
"
node1
"
,
"
label
"
:{
"
show
"
:
true
}},{
"
source
"
:
"
node3
"
,
"
target
"
:
"
node1
"
,
"
label
"
:{
"
show
"
:
true
}},{
"
source
"
:
"
node1
"
,
"
target
"
:
"
node3
"
,
"
label
"
:{
"
show
"
:
true
}},{
"
source
"
:
"
node1
"
,
"
target
"
:
"
node3
"
,
"
label
"
:{
"
show
"
:
true
}},{
"
source
"
:
"
node1
"
,
"
target
"
:
"
node3
"
,
"
label
"
:{
"
show
"
:
true
}},{
"
source
"
:
"
node1
"
,
"
target
"
:
"
node3
"
,
"
label
"
:{
"
show
"
:
true
}},{
"
source
"
:
"
node1
"
,
"
target
"
:
"
node3
"
,
"
label
"
:{
"
show
"
:
true
}},{
"
source
"
:
"
node3
"
,
"
target
"
:
"
node1
"
,
"
label
"
:{
"
show
"
:
true
}},{
"
source
"
:
"
node3
"
,
"
target
"
:
"
node1
"
,
"
label
"
:{
"
show
"
:
true
}},{
"
source
"
:
"
node3
"
,
"
target
"
:
"
node1
"
,
"
label
"
:{
"
show
"
:
true
}},{
"
source
"
:
"
node3
"
,
"
target
"
:
"
node1
"
,
"
label
"
:{
"
show
"
:
true
}},{
"
source
"
:
"
node3
"
,
"
target
"
:
"
node1
"
,
"
label
"
:{
"
show
"
:
true
}},{
"
source
"
:
"
node3
"
,
"
target
"
:
"
node1
"
,
"
label
"
:{
"
show
"
:
true
}},{
"
source
"
:
"
node1
"
,
"
target
"
:
"
node2
"
}];
source
:
x
?
'
node1
'
:
'
node3
'
,
target
:
x
?
'
node3
'
:
'
node1
'
,
label
:
{
show
:
true
},
})
}
res
.
push
({
var
option
=
{
source
:
'
node1
'
,
title
:
{
target
:
'
node2
'
text
:
'
autoCurveness array test
'
})
},
tooltip
:
{},
animationDurationUpdate
:
1500
,
animationEasingUpdate
:
'
quinticInOut
'
,
series
:
[
{
type
:
'
graph
'
,
layout
:
'
none
'
,
symbolSize
:
50
,
roam
:
true
,
label
:
{
show
:
true
},
edgeSymbol
:
[
'
circle
'
,
'
arrow
'
],
edgeSymbolSize
:
[
4
,
10
],
edgeLabel
:
{
fontSize
:
12
},
data
:
[{
name
:
'
node1
'
,
x
:
300
,
y
:
300
},
{
name
:
'
node2
'
,
x
:
800
,
y
:
300
},
{
name
:
'
node3
'
,
x
:
550
,
y
:
100
}],
links
:
data
,
autoCurveness
:
[
0.2
,
-
0.2
,
0.4
,
-
0.4
,
0.6
,
-
0.6
,
0.8
,
-
0.8
,
1
,
-
1
,
0.1
,
-
0.1
,
0.3
,
-
0.3
,
0.5
,
-
0.5
,
0.7
,
-
0.7
,
0.9
,
-
0.9
],
lineStyle
:
{
opacity
:
0.9
,
width
:
2
,
curveness
:
0
}
}
]
}
return
res
;
var
chart
=
echarts
.
init
(
container
,
''
,
{
renderer
:
'
svg
'
});
}
chart
.
setOption
(
option
)
})
</script>
</script>
<script>
<script>
require
([
require
([
'
echarts
'
'
echarts
'
],
function
(
echarts
)
{
],
function
(
echarts
)
{
var
container
=
document
.
getElementById
(
'
main6
'
);
var
container
=
document
.
getElementById
(
'
main5
'
);
var
data
=
[{
"
source
"
:
"
node3
"
,
"
target
"
:
"
node1
"
,
"
label
"
:{
"
show
"
:
true
}},{
"
source
"
:
"
node3
"
,
"
target
"
:
"
node1
"
,
"
label
"
:{
"
show
"
:
true
}},{
"
source
"
:
"
node3
"
,
"
target
"
:
"
node1
"
,
"
label
"
:{
"
show
"
:
true
}},{
"
source
"
:
"
node1
"
,
"
target
"
:
"
node3
"
,
"
label
"
:{
"
show
"
:
true
}},{
"
source
"
:
"
node1
"
,
"
target
"
:
"
node3
"
,
"
label
"
:{
"
show
"
:
true
}},{
"
source
"
:
"
node3
"
,
"
target
"
:
"
node1
"
,
"
label
"
:{
"
show
"
:
true
}},{
"
source
"
:
"
node1
"
,
"
target
"
:
"
node3
"
,
"
label
"
:{
"
show
"
:
true
}},{
"
source
"
:
"
node3
"
,
"
target
"
:
"
node1
"
,
"
label
"
:{
"
show
"
:
true
}},{
"
source
"
:
"
node3
"
,
"
target
"
:
"
node1
"
,
"
label
"
:{
"
show
"
:
true
}},{
"
source
"
:
"
node3
"
,
"
target
"
:
"
node1
"
,
"
label
"
:{
"
show
"
:
true
}},{
"
source
"
:
"
node1
"
,
"
target
"
:
"
node3
"
,
"
label
"
:{
"
show
"
:
true
}},{
"
source
"
:
"
node1
"
,
"
target
"
:
"
node3
"
,
"
label
"
:{
"
show
"
:
true
}},{
"
source
"
:
"
node1
"
,
"
target
"
:
"
node3
"
,
"
label
"
:{
"
show
"
:
true
}},{
"
source
"
:
"
node3
"
,
"
target
"
:
"
node1
"
,
"
label
"
:{
"
show
"
:
true
}},{
"
source
"
:
"
node1
"
,
"
target
"
:
"
node2
"
}];
var
option
=
{
var
option
=
{
title
:
{
title
:
{
text
:
'
autoCurveness函数测试
'
text
:
'
no set autoCurveness
'
},
},
tooltip
:
{},
tooltip
:
{},
animationDurationUpdate
:
1500
,
animationDurationUpdate
:
1500
,
...
@@ -103,10 +141,7 @@ under the License.
...
@@ -103,10 +141,7 @@ under the License.
x
:
550
,
x
:
550
,
y
:
100
y
:
100
}],
}],
links
:
createLinks
(
14
),
links
:
data
,
autoCurveness
:
function
()
{
return
[
0.2
,
-
0.2
,
0.4
,
-
0.4
,
0.6
,
-
0.6
,
0.8
,
-
0.8
,
1
,
-
1
,
0.1
,
-
0.1
,
0.3
,
-
0.3
,
0.5
,
-
0.5
,
0.7
,
-
0.7
,
0.9
,
-
0.9
];
},
lineStyle
:
{
lineStyle
:
{
opacity
:
0.9
,
opacity
:
0.9
,
width
:
2
,
width
:
2
,
...
@@ -125,11 +160,16 @@ under the License.
...
@@ -125,11 +160,16 @@ under the License.
require
([
require
([
'
echarts
'
'
echarts
'
],
function
(
echarts
)
{
],
function
(
echarts
)
{
var
container
=
document
.
getElementById
(
'
main5
'
);
var
container
=
document
.
getElementById
(
'
main7
'
);
var
data
=
[
{
source
:
'
node1
'
,
target
:
'
node3
'
,
label
:
{
show
:
true
}},
{
source
:
'
node1
'
,
target
:
'
node3
'
,
label
:
{
show
:
true
}},
{
source
:
'
node3
'
,
target
:
'
node1
'
,
label
:
{
show
:
true
}},
]
var
option
=
{
var
option
=
{
title
:
{
title
:
{
text
:
'
autoCurveness
不传入测试
'
text
:
'
autoCurveness
3 test case
'
},
},
tooltip
:
{},
tooltip
:
{},
animationDurationUpdate
:
1500
,
animationDurationUpdate
:
1500
,
...
@@ -161,7 +201,8 @@ under the License.
...
@@ -161,7 +201,8 @@ under the License.
x
:
550
,
x
:
550
,
y
:
100
y
:
100
}],
}],
links
:
createLinks
(
14
),
links
:
data
,
autoCurveness
:
3
,
lineStyle
:
{
lineStyle
:
{
opacity
:
0.9
,
opacity
:
0.9
,
width
:
2
,
width
:
2
,
...
@@ -181,7 +222,6 @@ under the License.
...
@@ -181,7 +222,6 @@ under the License.
if
(
i
%
3
===
0
)
return
'
none
'
;
if
(
i
%
3
===
0
)
return
'
none
'
;
if
(
i
%
3
==
1
)
return
'
circular
'
;
if
(
i
%
3
==
1
)
return
'
circular
'
;
if
(
i
%
3
==
2
)
return
'
force
'
;
if
(
i
%
3
==
2
)
return
'
force
'
;
// return 'force'
}
}
require
([
require
([
'
echarts
'
'
echarts
'
...
@@ -189,10 +229,17 @@ under the License.
...
@@ -189,10 +229,17 @@ under the License.
for
(
var
i
=
0
;
i
<
5
;
i
++
)
{
for
(
var
i
=
0
;
i
<
5
;
i
++
)
{
var
container
=
document
.
getElementById
(
'
main
'
+
i
);
var
container
=
document
.
getElementById
(
'
main
'
+
i
);
var
times
=
8
;
var
times
=
8
;
var
datas
=
{
'
1
'
:
[{
"
source
"
:
"
node3
"
,
"
target
"
:
"
node1
"
,
"
label
"
:{
"
show
"
:
true
}},{
"
source
"
:
"
node1
"
,
"
target
"
:
"
node2
"
}],
'
9
'
:
[{
"
source
"
:
"
node1
"
,
"
target
"
:
"
node3
"
,
"
label
"
:{
"
show
"
:
true
}},{
"
source
"
:
"
node1
"
,
"
target
"
:
"
node3
"
,
"
label
"
:{
"
show
"
:
true
}},{
"
source
"
:
"
node3
"
,
"
target
"
:
"
node1
"
,
"
label
"
:{
"
show
"
:
true
}},{
"
source
"
:
"
node3
"
,
"
target
"
:
"
node1
"
,
"
label
"
:{
"
show
"
:
true
}},{
"
source
"
:
"
node3
"
,
"
target
"
:
"
node1
"
,
"
label
"
:{
"
show
"
:
true
}},{
"
source
"
:
"
node3
"
,
"
target
"
:
"
node1
"
,
"
label
"
:{
"
show
"
:
true
}},{
"
source
"
:
"
node1
"
,
"
target
"
:
"
node3
"
,
"
label
"
:{
"
show
"
:
true
}},{
"
source
"
:
"
node1
"
,
"
target
"
:
"
node3
"
,
"
label
"
:{
"
show
"
:
true
}},{
"
source
"
:
"
node1
"
,
"
target
"
:
"
node3
"
,
"
label
"
:{
"
show
"
:
true
}},{
"
source
"
:
"
node1
"
,
"
target
"
:
"
node2
"
}],
'
17
'
:
[{
"
source
"
:
"
node3
"
,
"
target
"
:
"
node1
"
,
"
label
"
:{
"
show
"
:
true
}},{
"
source
"
:
"
node3
"
,
"
target
"
:
"
node1
"
,
"
label
"
:{
"
show
"
:
true
}},{
"
source
"
:
"
node3
"
,
"
target
"
:
"
node1
"
,
"
label
"
:{
"
show
"
:
true
}},{
"
source
"
:
"
node3
"
,
"
target
"
:
"
node1
"
,
"
label
"
:{
"
show
"
:
true
}},{
"
source
"
:
"
node3
"
,
"
target
"
:
"
node1
"
,
"
label
"
:{
"
show
"
:
true
}},{
"
source
"
:
"
node1
"
,
"
target
"
:
"
node3
"
,
"
label
"
:{
"
show
"
:
true
}},{
"
source
"
:
"
node3
"
,
"
target
"
:
"
node1
"
,
"
label
"
:{
"
show
"
:
true
}},{
"
source
"
:
"
node3
"
,
"
target
"
:
"
node1
"
,
"
label
"
:{
"
show
"
:
true
}},{
"
source
"
:
"
node1
"
,
"
target
"
:
"
node3
"
,
"
label
"
:{
"
show
"
:
true
}},{
"
source
"
:
"
node3
"
,
"
target
"
:
"
node1
"
,
"
label
"
:{
"
show
"
:
true
}},{
"
source
"
:
"
node3
"
,
"
target
"
:
"
node1
"
,
"
label
"
:{
"
show
"
:
true
}},{
"
source
"
:
"
node3
"
,
"
target
"
:
"
node1
"
,
"
label
"
:{
"
show
"
:
true
}},{
"
source
"
:
"
node3
"
,
"
target
"
:
"
node1
"
,
"
label
"
:{
"
show
"
:
true
}},{
"
source
"
:
"
node1
"
,
"
target
"
:
"
node3
"
,
"
label
"
:{
"
show
"
:
true
}},{
"
source
"
:
"
node3
"
,
"
target
"
:
"
node1
"
,
"
label
"
:{
"
show
"
:
true
}},{
"
source
"
:
"
node3
"
,
"
target
"
:
"
node1
"
,
"
label
"
:{
"
show
"
:
true
}},{
"
source
"
:
"
node1
"
,
"
target
"
:
"
node3
"
,
"
label
"
:{
"
show
"
:
true
}},{
"
source
"
:
"
node1
"
,
"
target
"
:
"
node2
"
}],
'
25
'
:
[{
"
source
"
:
"
node1
"
,
"
target
"
:
"
node3
"
,
"
label
"
:{
"
show
"
:
true
}},{
"
source
"
:
"
node1
"
,
"
target
"
:
"
node3
"
,
"
label
"
:{
"
show
"
:
true
}},{
"
source
"
:
"
node3
"
,
"
target
"
:
"
node1
"
,
"
label
"
:{
"
show
"
:
true
}},{
"
source
"
:
"
node1
"
,
"
target
"
:
"
node3
"
,
"
label
"
:{
"
show
"
:
true
}},{
"
source
"
:
"
node1
"
,
"
target
"
:
"
node3
"
,
"
label
"
:{
"
show
"
:
true
}},{
"
source
"
:
"
node1
"
,
"
target
"
:
"
node3
"
,
"
label
"
:{
"
show
"
:
true
}},{
"
source
"
:
"
node3
"
,
"
target
"
:
"
node1
"
,
"
label
"
:{
"
show
"
:
true
}},{
"
source
"
:
"
node3
"
,
"
target
"
:
"
node1
"
,
"
label
"
:{
"
show
"
:
true
}},{
"
source
"
:
"
node1
"
,
"
target
"
:
"
node3
"
,
"
label
"
:{
"
show
"
:
true
}},{
"
source
"
:
"
node1
"
,
"
target
"
:
"
node3
"
,
"
label
"
:{
"
show
"
:
true
}},{
"
source
"
:
"
node1
"
,
"
target
"
:
"
node3
"
,
"
label
"
:{
"
show
"
:
true
}},{
"
source
"
:
"
node1
"
,
"
target
"
:
"
node3
"
,
"
label
"
:{
"
show
"
:
true
}},{
"
source
"
:
"
node1
"
,
"
target
"
:
"
node3
"
,
"
label
"
:{
"
show
"
:
true
}},{
"
source
"
:
"
node3
"
,
"
target
"
:
"
node1
"
,
"
label
"
:{
"
show
"
:
true
}},{
"
source
"
:
"
node1
"
,
"
target
"
:
"
node3
"
,
"
label
"
:{
"
show
"
:
true
}},{
"
source
"
:
"
node3
"
,
"
target
"
:
"
node1
"
,
"
label
"
:{
"
show
"
:
true
}},{
"
source
"
:
"
node3
"
,
"
target
"
:
"
node1
"
,
"
label
"
:{
"
show
"
:
true
}},{
"
source
"
:
"
node1
"
,
"
target
"
:
"
node3
"
,
"
label
"
:{
"
show
"
:
true
}},{
"
source
"
:
"
node3
"
,
"
target
"
:
"
node1
"
,
"
label
"
:{
"
show
"
:
true
}},{
"
source
"
:
"
node3
"
,
"
target
"
:
"
node1
"
,
"
label
"
:{
"
show
"
:
true
}},{
"
source
"
:
"
node3
"
,
"
target
"
:
"
node1
"
,
"
label
"
:{
"
show
"
:
true
}},{
"
source
"
:
"
node1
"
,
"
target
"
:
"
node3
"
,
"
label
"
:{
"
show
"
:
true
}},{
"
source
"
:
"
node1
"
,
"
target
"
:
"
node3
"
,
"
label
"
:{
"
show
"
:
true
}},{
"
source
"
:
"
node3
"
,
"
target
"
:
"
node1
"
,
"
label
"
:{
"
show
"
:
true
}},{
"
source
"
:
"
node1
"
,
"
target
"
:
"
node3
"
,
"
label
"
:{
"
show
"
:
true
}},{
"
source
"
:
"
node1
"
,
"
target
"
:
"
node2
"
}],
'
33
'
:
[{
"
source
"
:
"
node3
"
,
"
target
"
:
"
node1
"
,
"
label
"
:{
"
show
"
:
true
}},{
"
source
"
:
"
node3
"
,
"
target
"
:
"
node1
"
,
"
label
"
:{
"
show
"
:
true
}},{
"
source
"
:
"
node3
"
,
"
target
"
:
"
node1
"
,
"
label
"
:{
"
show
"
:
true
}},{
"
source
"
:
"
node1
"
,
"
target
"
:
"
node3
"
,
"
label
"
:{
"
show
"
:
true
}},{
"
source
"
:
"
node1
"
,
"
target
"
:
"
node3
"
,
"
label
"
:{
"
show
"
:
true
}},{
"
source
"
:
"
node1
"
,
"
target
"
:
"
node3
"
,
"
label
"
:{
"
show
"
:
true
}},{
"
source
"
:
"
node3
"
,
"
target
"
:
"
node1
"
,
"
label
"
:{
"
show
"
:
true
}},{
"
source
"
:
"
node1
"
,
"
target
"
:
"
node3
"
,
"
label
"
:{
"
show
"
:
true
}},{
"
source
"
:
"
node1
"
,
"
target
"
:
"
node3
"
,
"
label
"
:{
"
show
"
:
true
}},{
"
source
"
:
"
node1
"
,
"
target
"
:
"
node3
"
,
"
label
"
:{
"
show
"
:
true
}},{
"
source
"
:
"
node3
"
,
"
target
"
:
"
node1
"
,
"
label
"
:{
"
show
"
:
true
}},{
"
source
"
:
"
node1
"
,
"
target
"
:
"
node3
"
,
"
label
"
:{
"
show
"
:
true
}},{
"
source
"
:
"
node3
"
,
"
target
"
:
"
node1
"
,
"
label
"
:{
"
show
"
:
true
}},{
"
source
"
:
"
node1
"
,
"
target
"
:
"
node3
"
,
"
label
"
:{
"
show
"
:
true
}},{
"
source
"
:
"
node3
"
,
"
target
"
:
"
node1
"
,
"
label
"
:{
"
show
"
:
true
}},{
"
source
"
:
"
node3
"
,
"
target
"
:
"
node1
"
,
"
label
"
:{
"
show
"
:
true
}},{
"
source
"
:
"
node1
"
,
"
target
"
:
"
node3
"
,
"
label
"
:{
"
show
"
:
true
}},{
"
source
"
:
"
node3
"
,
"
target
"
:
"
node1
"
,
"
label
"
:{
"
show
"
:
true
}},{
"
source
"
:
"
node3
"
,
"
target
"
:
"
node1
"
,
"
label
"
:{
"
show
"
:
true
}},{
"
source
"
:
"
node3
"
,
"
target
"
:
"
node1
"
,
"
label
"
:{
"
show
"
:
true
}},{
"
source
"
:
"
node3
"
,
"
target
"
:
"
node1
"
,
"
label
"
:{
"
show
"
:
true
}},{
"
source
"
:
"
node1
"
,
"
target
"
:
"
node3
"
,
"
label
"
:{
"
show
"
:
true
}},{
"
source
"
:
"
node3
"
,
"
target
"
:
"
node1
"
,
"
label
"
:{
"
show
"
:
true
}},{
"
source
"
:
"
node3
"
,
"
target
"
:
"
node1
"
,
"
label
"
:{
"
show
"
:
true
}},{
"
source
"
:
"
node3
"
,
"
target
"
:
"
node1
"
,
"
label
"
:{
"
show
"
:
true
}},{
"
source
"
:
"
node3
"
,
"
target
"
:
"
node1
"
,
"
label
"
:{
"
show
"
:
true
}},{
"
source
"
:
"
node1
"
,
"
target
"
:
"
node3
"
,
"
label
"
:{
"
show
"
:
true
}},{
"
source
"
:
"
node1
"
,
"
target
"
:
"
node3
"
,
"
label
"
:{
"
show
"
:
true
}},{
"
source
"
:
"
node1
"
,
"
target
"
:
"
node3
"
,
"
label
"
:{
"
show
"
:
true
}},{
"
source
"
:
"
node3
"
,
"
target
"
:
"
node1
"
,
"
label
"
:{
"
show
"
:
true
}},{
"
source
"
:
"
node1
"
,
"
target
"
:
"
node3
"
,
"
label
"
:{
"
show
"
:
true
}},{
"
source
"
:
"
node1
"
,
"
target
"
:
"
node3
"
,
"
label
"
:{
"
show
"
:
true
}},{
"
source
"
:
"
node3
"
,
"
target
"
:
"
node1
"
,
"
label
"
:{
"
show
"
:
true
}},{
"
source
"
:
"
node1
"
,
"
target
"
:
"
node2
"
}]
}
var
option
=
{
var
option
=
{
title
:
{
title
:
{
text
:
'
Graph
简单示例, 边数:
'
+
(
i
*
times
+
1
)
+
'
布局
:
'
+
getLayout
(
i
)
text
:
'
Graph
, edges numbers:
'
+
(
i
*
times
+
1
)
+
'
layout
:
'
+
getLayout
(
i
)
},
},
tooltip
:
{},
tooltip
:
{},
animationDurationUpdate
:
1500
,
animationDurationUpdate
:
1500
,
...
@@ -224,7 +271,7 @@ under the License.
...
@@ -224,7 +271,7 @@ under the License.
x
:
550
,
x
:
550
,
y
:
100
y
:
100
}],
}],
links
:
createLinks
(
i
*
times
+
1
)
,
links
:
datas
[(
i
*
times
+
1
)
+
''
]
,
autoCurveness
:
i
*
times
+
1
,
autoCurveness
:
i
*
times
+
1
,
lineStyle
:
{
lineStyle
:
{
opacity
:
0.9
,
opacity
:
0.9
,
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录