1 tr
.graphing
.Radar = function (size
, radar
, toolTipDescription
) {
2 var self
, fib
, svg
, texts
;
5 fib
= new tr
.util
.Fib();
8 self
.svg = function () {
13 return Math
.round(size
/2);
16 function plotLines() {
22 .attr('stroke-width', 14);
29 .attr('stroke-width', 14);
32 function getRadius(cycles
, i
) {
33 var sequence
= fib
.sequence(cycles
.length
);
34 var total
= fib
.sum(cycles
.length
);
37 return center() - (center() * sum
/ total
);
40 function plotCircles(cycles
) {
43 cycles
.forEach(function (cycle
, i
) {
47 .attr('r', getRadius(cycles
, i
));
51 function plotTexts(cycles
) {
54 increment
= Math
.round(center() / cycles
.length
);
56 cycles
.forEach(function (cycle
, i
) {
58 .attr('class', 'line-text')
59 .attr('y', center() + 4)
60 .attr('x', center() - getRadius(cycles
, i
) + 10)
64 .attr('class', 'line-text')
65 .attr('y', center() + 4)
66 .attr('x', center() + getRadius(cycles
, i
) - 10)
67 .attr('text-anchor', 'end')
72 function triangle(x
, y
, cssClass
, group
) {
73 var tsize
, top
, left
, right
, bottom
, points
;
77 left
= (x
- tsize
+ 1);
78 right
= (x
+ tsize
+ 1);
79 bottom
= (y
+ tsize
- tsize
/ 2.5);
81 points
= x
+ 1 + ',' + top
+ ' ' + left
+ ',' + bottom
+ ' ' + right
+ ',' + bottom
;
83 return (group
|| svg
).append('polygon')
84 .attr('points', points
)
85 .attr('class', cssClass
)
86 .attr('stroke-width', 1.5);
89 function circle(x
, y
, cssClass
, group
) {
90 return (group
|| svg
).append('circle')
93 .attr('class', cssClass
)
94 .attr('stroke-width', 1.5)
98 function plotBlips(cycles
, quadrant
, adjustX
, adjustY
, cssClass
) {
100 blips
= quadrant
.blips();
101 cycles
.forEach(function (cycle
, i
) {
102 var maxRadius
, minRadius
, cycleBlips
;
104 maxRadius
= getRadius(cycles
, i
);
105 minRadius
= (i
== cycles
.length
- 1) ? 0: getRadius(cycles
, i
+ 1);
107 var cycleBlips
= blips
.filter(function (blip
) {
108 return blip
.cycle() == cycle
;
111 cycleBlips
.forEach(function (blip
) {
112 var angleInRad
, radius
;
114 var split
= blip
.name().split('');
115 var sum
= split
.reduce(function (p
, c
) { return p
+ c
.charCodeAt(0); }, 0);
116 chance
= new Chance(sum
* cycle
.name().length
* blip
.number());
118 angleInRad
= Math
.PI
* chance
.integer({ min
: 13, max
: 85 }) / 180;
119 radius
= chance
.floating({ min
: minRadius
+ 25, max
: maxRadius
- 10 });
121 var x
= center() + radius
* Math
.cos(angleInRad
) * adjustX
;
122 var y
= center() + radius
* Math
.sin(angleInRad
) * adjustY
;
124 var group
= svg
.append('g').attr('class', 'blip-group');
127 triangle(x
, y
, cssClass
, group
);
129 circle(x
, y
, cssClass
, group
);
132 texts
.push(function () {
135 name
= svg
.append('text')
138 .attr('class', 'blip-name')
139 .attr('text-anchor', 'left')
143 .on('mouseover', function () { name
.style('display', 'block'); })
144 .on('mouseout', function () { name
.style('display', 'none'); });
150 .attr('class', 'blip-text')
151 .attr('text-anchor', 'middle')
154 .text(blip
.name() + ((toolTipDescription
&& blip
.description())
155 ? ': ' + blip
.description().replace(/(<([^>]+)>)/ig, '')
161 function plotQuadrantNames(quadrants
) {
162 function plotName(name
, anchor
, x
, y
, cssClass
) {
166 .attr('class', cssClass
)
167 .attr('text-anchor', anchor
)
171 plotName(quadrants
.I
.name(), 'end', size
- 10, 10, 'first')
172 plotName(quadrants
.II
.name(), 'start', 10, 10, 'second')
173 plotName(quadrants
.III
.name(), 'start', 10, size
- 10, 'third')
174 plotName(quadrants
.IV
.name(), 'end', size
-10, size
- 10, 'fourth')
177 self
.init = function (selector
) {
178 svg
= d3
.select(selector
|| 'body').append("svg");
182 self
.plot = function () {
183 var cycles
, quadrants
;
185 cycles
= radar
.cycles().reverse();
186 quadrants
= radar
.quadrants();
188 svg
.attr('width', size
).attr('height', size
);
194 if (radar
.hasQuadrants()) {
195 plotQuadrantNames(quadrants
);
196 plotBlips(cycles
, quadrants
.I
, 1, -1, 'first');
197 plotBlips(cycles
, quadrants
.II
, -1, -1, 'second');
198 plotBlips(cycles
, quadrants
.III
, -1, 1, 'third');
199 plotBlips(cycles
, quadrants
.IV
, 1, 1, 'fourth');
202 texts
.forEach(function (fn
) {