added method to plot the blips
[tech-radar.git] / src / graphing / radar.js
1 tr.graphing.Radar = function (svg, size, radar) {
2 var self, fib;
3 self = {};
4 fib = new tr.util.Fib();
5
6 svg.attr('width', size).attr('height', size);
7
8 function center () {
9 return Math.round(size/2);
10 }
11
12 function plotLines() {
13 svg.append('line')
14 .attr('x1', center())
15 .attr('y1', 0)
16 .attr('x2', center())
17 .attr('y2', size)
18 .attr('stroke-width', 14);
19
20 svg.append('line')
21 .attr('x1', 0)
22 .attr('y1', center())
23 .attr('x2', size)
24 .attr('y2', center())
25 .attr('stroke-width', 14);
26 };
27
28 function getRadius(cycles, i) {
29 var sequence = fib.sequence(cycles.length);
30 var total = fib.sum(cycles.length);
31 var sum = fib.sum(i);
32
33 return center() - (center() * sum / total);
34 }
35
36 function plotCircles(cycles) {
37 var increment;
38
39 cycles.forEach(function (cycle, i) {
40 svg.append('circle')
41 .attr('cx', center())
42 .attr('cy', center())
43 .attr('r', getRadius(cycles, i));
44 });
45 }
46
47 function plotTexts(cycles) {
48 var increment;
49
50 increment = Math.round(center() / cycles.length);
51
52 cycles.forEach(function (cycle, i) {
53 svg.append('text')
54 .attr('y', center() + 4)
55 .attr('x', center() - getRadius(cycles, i) + 10)
56 .text(cycle.name());
57
58 svg.append('text')
59 .attr('y', center() + 4)
60 .attr('x', center() + getRadius(cycles, i) - 10)
61 .attr('text-anchor', 'end')
62 .text(cycle.name());
63 });
64 };
65
66 function random(min, max) {
67 return Math.floor(Math.random() * (max - min + 1)) + min;
68 }
69
70 function plotBlips(cycles, blips, adjustX, adjustY) {
71 cycles.forEach(function (cycle, i) {
72 var maxRadius, minRadius, cycleBlips;
73
74 maxRadius = getRadius(cycles, i);
75 minRadius = (i == cycles.length - 1) ? 0: getRadius(cycles, i + 1);
76
77 var cycleBlips = blips.filter(function (blip) {
78 return blip.cycle() == cycle;
79 });
80
81 cycleBlips.forEach(function (blip) {
82 var angleInRad, radius;
83
84 angleInRad = Math.PI * random(5, 85) / 180;
85 radius = random(minRadius + 5, maxRadius - 5);
86
87 svg.append('circle')
88 .attr('cx', center() + radius * Math.cos(angleInRad) * adjustX)
89 .attr('cy', center() + radius * Math.sin(angleInRad) * adjustY)
90 .attr('r', 5)
91 .append('title').text(blip.name());
92 });
93 });
94 };
95
96 self.plot = function () {
97 var cycles = radar.cycles().reverse();
98
99 plotCircles(cycles);
100 plotLines();
101 plotTexts(cycles);
102 plotBlips(cycles, radar.quadrants().I.blips(), 1, -1);
103 plotBlips(cycles, radar.quadrants().II.blips(), -1, -1);
104 plotBlips(cycles, radar.quadrants().III.blips(), -1, 1);
105 plotBlips(cycles, radar.quadrants().IV.blips(), 1, 1);
106 };
107
108 return self;
109 };