1 tr
.graphing
.Radar = function (size
, radar
) {
4 svg
= d3
.select("body").append("svg");
5 fib
= new tr
.util
.Fib();
11 return Math
.round(size
/2);
14 function plotLines() {
20 .attr('stroke-width', 14);
27 .attr('stroke-width', 14);
30 function getRadius(cycles
, i
) {
31 var sequence
= fib
.sequence(cycles
.length
);
32 var total
= fib
.sum(cycles
.length
);
35 return center() - (center() * sum
/ total
);
38 function plotCircles(cycles
) {
41 cycles
.forEach(function (cycle
, i
) {
45 .attr('r', getRadius(cycles
, i
));
49 function plotTexts(cycles
) {
52 increment
= Math
.round(center() / cycles
.length
);
54 cycles
.forEach(function (cycle
, i
) {
56 .attr('class', 'line-text')
57 .attr('y', center() + 4)
58 .attr('x', center() - getRadius(cycles
, i
) + 10)
62 .attr('class', 'line-text')
63 .attr('y', center() + 4)
64 .attr('x', center() + getRadius(cycles
, i
) - 10)
65 .attr('text-anchor', 'end')
70 function triangle(x
, y
, cssClass
) {
71 return svg
.append('path')
72 .attr('d', 'M412.201,311.406c0.021,0,0.042,0,0.063,0c0.067,0,0.135,0,0.201,0c4.052,0,6.106-0.051,8.168-0.102c2.053-0.051,4.115-0.102,8.176-0.102h0.103c6.976-0.183,10.227-5.306,6.306-11.53c-3.988-6.121-4.97-5.407-8.598-11.224c-1.631-3.008-3.872-4.577-6.179-4.577c-2.276,0-4.613,1.528-6.48,4.699c-3.578,6.077-3.26,6.014-7.306,11.723C402.598,306.067,405.426,311.406,412.201,311.406')
73 .attr('transform', 'translate(' + ((-421 * .73) + x
) + ',' + ((-299 * 0.73) + y
) + ') scale(0.73) ')
74 .attr('class', cssClass
)
75 .attr('stroke-width', 2);
79 var top
= y
- tsize
+ 2;
80 var left
= (x
- tsize
);
81 var right
= (x
+ tsize
);
82 var bottom
= (y
+ tsize
);
84 var points
= x
+ ',' + top
+ ' ' + left
+ ',' + bottom
+ ' ' + right
+ ',' + bottom
;
87 function circle(x
, y
, cssClass
) {
91 .attr('class', cssClass
)
92 .attr('stroke-width', 1.5)
96 function plotBlips(cycles
, quadrant
, adjustX
, adjustY
) {
98 blips
= quadrant
.blips();
99 cycles
.forEach(function (cycle
, i
) {
100 var maxRadius
, minRadius
, cycleBlips
;
102 maxRadius
= getRadius(cycles
, i
);
103 minRadius
= (i
== cycles
.length
- 1) ? 0: getRadius(cycles
, i
+ 1);
105 var cycleBlips
= blips
.filter(function (blip
) {
106 return blip
.cycle() == cycle
;
109 cycleBlips
.forEach(function (blip
) {
110 var angleInRad
, radius
;
112 var split
= blip
.name().split('');
113 var sum
= split
.reduce(function (p
, c
) { return p
+ c
.charCodeAt(0); }, 0);
114 chance
= new Chance(sum
* cycle
.name().length
* blip
.number());
116 angleInRad
= Math
.PI
* chance
.integer({ min
: 13, max
: 85 }) / 180;
117 radius
= chance
.floating({ min
: minRadius
+ 25, max
: maxRadius
- 10 });
119 var x
= center() + radius
* Math
.cos(angleInRad
) * adjustX
;
120 var y
= center() + radius
* Math
.sin(angleInRad
) * adjustY
;
123 triangle(x
, y
, cssClassFor(quadrant
.name()));
125 circle(x
, y
, cssClassFor(quadrant
.name()));
131 .attr('class', 'blip-text')
132 .attr('text-anchor', 'middle')
138 function cssClassFor(string
) {
139 return string
.toLowerCase().replace(/\s\&/g, '').replace(/\s/g, '-');
142 function plotQuadrantNames(quadrants
) {
143 function plotName(name
, anchor
, x
, y
) {
147 .attr('class', cssClassFor(name
))
148 .attr('text-anchor', anchor
)
152 plotName(quadrants
.I
.name(), 'end', size
- 10, 10)
153 plotName(quadrants
.II
.name(), 'start', 10, 10)
154 plotName(quadrants
.III
.name(), 'start', 10, size
- 10)
155 plotName(quadrants
.IV
.name(), 'end', size
-10, size
- 10)
158 self
.plot = function () {
159 var cycles
, quadrants
;
161 cycles
= radar
.cycles().reverse();
162 quadrants
= radar
.quadrants();
164 svg
.attr('width', size
).attr('height', size
);
170 if (radar
.hasQuadrants()) {
171 plotQuadrantNames(quadrants
);
172 plotBlips(cycles
, quadrants
.I
, 1, -1);
173 plotBlips(cycles
, quadrants
.II
, -1, -1);
174 plotBlips(cycles
, quadrants
.III
, -1, 1);
175 plotBlips(cycles
, quadrants
.IV
, 1, 1);