1
+ function UndirectedGraphTracer ( module ) {
2
+ if ( DirectedGraphTracer . call ( this , module || UndirectedGraphTracer ) ) {
3
+ UndirectedGraphTracer . prototype . init . call ( this ) ;
4
+ return true ;
5
+ }
6
+ return false ;
7
+ }
8
+
9
+ UndirectedGraphTracer . prototype = $ . extend ( true , Object . create ( DirectedGraphTracer . prototype ) , {
10
+ constructor : UndirectedGraphTracer ,
11
+ init : function ( ) {
12
+ var tracer = this ;
13
+
14
+ s . settings ( {
15
+ defaultEdgeType : 'def'
16
+ } ) ;
17
+ sigma . canvas . edges . def = function ( edge , source , target , context , settings ) {
18
+ var color = tracer . getColor ( edge , source , target , settings ) ;
19
+ tracer . drawEdge ( edge , source , target , color , context , settings ) ;
20
+ } ;
21
+ } ,
22
+ _setData : function ( G ) {
23
+ if ( Tracer . prototype . _setData . call ( this , arguments ) ) return true ;
24
+
25
+ graph . clear ( ) ;
26
+ var nodes = [ ] ;
27
+ var edges = [ ] ;
28
+ var unitAngle = 2 * Math . PI / G . length ;
29
+ var currentAngle = 0 ;
30
+ for ( var i = 0 ; i < G . length ; i ++ ) {
31
+ currentAngle += unitAngle ;
32
+ nodes . push ( {
33
+ id : this . n ( i ) ,
34
+ label : '' + i ,
35
+ x : .5 + Math . sin ( currentAngle ) / 2 ,
36
+ y : .5 + Math . cos ( currentAngle ) / 2 ,
37
+ size : 1 ,
38
+ color : this . color . default
39
+ } ) ;
40
+ }
41
+ for ( var i = 0 ; i < G . length ; i ++ ) {
42
+ for ( var j = 0 ; j <= i ; j ++ ) {
43
+ if ( G [ i ] [ j ] || G [ j ] [ i ] ) {
44
+ edges . push ( {
45
+ id : this . e ( i , j ) ,
46
+ source : this . n ( i ) ,
47
+ target : this . n ( j ) ,
48
+ color : this . color . default ,
49
+ size : 1
50
+ } ) ;
51
+ }
52
+ }
53
+ }
54
+
55
+ graph . read ( {
56
+ nodes : nodes ,
57
+ edges : edges
58
+ } ) ;
59
+ s . camera . goTo ( {
60
+ x : 0 ,
61
+ y : 0 ,
62
+ angle : 0 ,
63
+ ratio : 1
64
+ } ) ;
65
+ this . refresh ( ) ;
66
+
67
+ return false ;
68
+ } ,
69
+ e : function ( v1 , v2 ) {
70
+ if ( v1 > v2 ) {
71
+ var temp = v1 ;
72
+ v1 = v2 ;
73
+ v2 = temp ;
74
+ }
75
+ return 'e' + v1 + '_' + v2 ;
76
+ } ,
77
+ drawOnHover : function ( node , context , settings , next ) {
78
+ var tracer = this ;
79
+
80
+ context . setLineDash ( [ 5 , 5 ] ) ;
81
+ var nodeIdx = node . id . substring ( 1 ) ;
82
+ graph . edges ( ) . forEach ( function ( edge ) {
83
+ var ends = edge . id . substring ( 1 ) . split ( "_" ) ;
84
+ if ( ends [ 0 ] == nodeIdx ) {
85
+ var color = '#0ff' ;
86
+ var source = node ;
87
+ var target = graph . nodes ( 'n' + ends [ 1 ] ) ;
88
+ tracer . drawEdge ( edge , source , target , color , context , settings ) ;
89
+ if ( next ) next ( edge , source , target , color , context , settings ) ;
90
+ } else if ( ends [ 1 ] == nodeIdx ) {
91
+ var color = '#0ff' ;
92
+ var source = graph . nodes ( 'n' + ends [ 0 ] ) ;
93
+ var target = node ;
94
+ tracer . drawEdge ( edge , source , target , color , context , settings ) ;
95
+ if ( next ) next ( edge , source , target , color , context , settings ) ;
96
+ }
97
+ } ) ;
98
+ } ,
99
+ drawEdge : function ( edge , source , target , color , context , settings ) {
100
+ var prefix = settings ( 'prefix' ) || '' ,
101
+ size = edge [ prefix + 'size' ] || 1 ;
102
+
103
+ context . strokeStyle = color ;
104
+ context . lineWidth = size ;
105
+ context . beginPath ( ) ;
106
+ context . moveTo (
107
+ source [ prefix + 'x' ] ,
108
+ source [ prefix + 'y' ]
109
+ ) ;
110
+ context . lineTo (
111
+ target [ prefix + 'x' ] ,
112
+ target [ prefix + 'y' ]
113
+ ) ;
114
+ context . stroke ( ) ;
115
+ }
116
+ } ) ;
117
+
118
+ var UndirectedGraph = {
119
+ random : function ( N , ratio ) {
120
+ if ( ! N ) N = 5 ;
121
+ if ( ! ratio ) ratio = .3 ;
122
+ var G = new Array ( N ) ;
123
+ for ( var i = 0 ; i < N ; i ++ ) G [ i ] = new Array ( N ) ;
124
+ for ( var i = 0 ; i < N ; i ++ ) {
125
+ for ( var j = 0 ; j < N ; j ++ ) {
126
+ if ( i > j ) {
127
+ G [ i ] [ j ] = G [ j ] [ i ] = ( Math . random ( ) * ( 1 / ratio ) | 0 ) == 0 ? 1 : 0 ;
128
+ }
129
+ }
130
+ }
131
+ return G ;
132
+ }
133
+ } ;
0 commit comments