Revert "fixed fib sum, it was doing the sum for lenght + 1"
[tech-radar.git] / src / graphing / radar.js
index 10e2483..4265b2a 100644 (file)
@@ -1,9 +1,12 @@
-tr.graphing.Radar = function (svg, size, radar) {
-  var self, fib;
-  self = {};
+tr.graphing.Radar = function (size, radar) {
+  var self, fib, svg;
+
   fib = new tr.util.Fib();
 
-  svg.attr('width', size).attr('height', size);
+  self = {};
+  self.svg = function () {
+    return svg;
+  }
 
   function center () {
     return Math.round(size/2);
@@ -51,11 +54,13 @@ tr.graphing.Radar = function (svg, size, radar) {
 
     cycles.forEach(function (cycle, i) {
       svg.append('text')
+        .attr('class', 'line-text')
         .attr('y', center() + 4)
         .attr('x', center() - getRadius(cycles, i) + 10)
         .text(cycle.name());
 
       svg.append('text')
+        .attr('class', 'line-text')
         .attr('y', center() + 4)
         .attr('x', center() + getRadius(cycles, i) - 10)
         .attr('text-anchor', 'end')
@@ -63,11 +68,35 @@ tr.graphing.Radar = function (svg, size, radar) {
     });
   };
 
-  function random(min, max) {
-    return Math.floor(Math.random() * (max - min + 1)) + min;
+  function triangle(x, y, cssClass) {
+    var tsize, top, left, right, bottom, points;
+
+    tsize = 13
+    top = y - tsize;
+    left = (x - tsize + 1);
+    right = (x + tsize + 1);
+    bottom = (y + tsize - tsize / 2.5);
+
+    points = x + 1 + ',' + top + ' ' + left + ',' + bottom + ' ' + right + ',' + bottom;
+
+    return svg.append('polygon')
+      .attr('points', points)
+      .attr('class', cssClass)
+      .attr('stroke-width', 1.5);
   }
 
-  function plotBlips(cycles, blips, adjustX, adjustY) {
+  function circle(x, y, cssClass) {
+    svg.append('circle')
+      .attr('cx', x)
+      .attr('cy', y)
+      .attr('class', cssClass)
+      .attr('stroke-width', 1.5)
+      .attr('r', 10);
+  }
+
+  function plotBlips(cycles, quadrant, adjustX, adjustY, cssClass) {
+    var blips;
+    blips = quadrant.blips();
     cycles.forEach(function (cycle, i) {
       var maxRadius, minRadius, cycleBlips;
 
@@ -81,28 +110,72 @@ tr.graphing.Radar = function (svg, size, radar) {
       cycleBlips.forEach(function (blip) {
         var angleInRad, radius;
 
-        angleInRad = Math.PI * random(5, 85) / 180;
-        radius = random(minRadius + 5, maxRadius - 5);
+        var split = blip.name().split('');
+        var sum = split.reduce(function (p, c) { return p + c.charCodeAt(0); }, 0);
+        chance = new Chance(sum * cycle.name().length * blip.number());
+
+        angleInRad = Math.PI * chance.integer({ min: 13, max: 85 }) / 180;
+        radius = chance.floating({ min: minRadius + 25, max: maxRadius - 10 });
 
-        svg.append('circle')
-          .attr('cx', center() + radius * Math.cos(angleInRad) * adjustX)
-          .attr('cy', center() + radius * Math.sin(angleInRad) * adjustY)
-          .attr('r', 5)
-          .append('title').text(blip.name());
+        var x = center() + radius * Math.cos(angleInRad) * adjustX;
+        var y = center() + radius * Math.sin(angleInRad) * adjustY;
+
+        if (blip.isNew()) {
+          triangle(x, y, cssClass);
+        } else {
+          circle(x, y, cssClass);
+        }
+
+        svg.append('text')
+          .attr('x', x)
+          .attr('y', y + 4)
+          .attr('class', 'blip-text')
+          .attr('text-anchor', 'middle')
+          .text(blip.number())
       });
     });
   };
 
+  function plotQuadrantNames(quadrants) {
+    function plotName(name, anchor, x, y, cssClass) {
+      svg.append('text')
+        .attr('x', x)
+        .attr('y', y)
+        .attr('class', cssClass)
+        .attr('text-anchor', anchor)
+        .text(name);
+    }
+
+    plotName(quadrants.I.name(), 'end', size - 10, 10, 'first')
+    plotName(quadrants.II.name(), 'start', 10, 10, 'second')
+    plotName(quadrants.III.name(), 'start', 10, size - 10, 'third')
+    plotName(quadrants.IV.name(), 'end', size -10, size - 10, 'fourth')
+  }
+
+  self.init = function (selector) {
+    svg = d3.select(selector || 'body').append("svg");
+    return self;
+  };
+
   self.plot = function () {
-    var cycles = radar.cycles().reverse();
+    var cycles, quadrants;
+
+    cycles = radar.cycles().reverse();
+    quadrants = radar.quadrants();
+
+    svg.attr('width', size).attr('height', size);
 
     plotCircles(cycles);
     plotLines();
     plotTexts(cycles);
-    plotBlips(cycles, radar.quadrants().I.blips(), 1, -1);
-    plotBlips(cycles, radar.quadrants().II.blips(), -1, -1);
-    plotBlips(cycles, radar.quadrants().III.blips(), -1, 1);
-    plotBlips(cycles, radar.quadrants().IV.blips(), 1, 1);
+
+    if (radar.hasQuadrants()) {
+      plotQuadrantNames(quadrants);
+      plotBlips(cycles, quadrants.I, 1, -1, 'first');
+      plotBlips(cycles, quadrants.II, -1, -1, 'second');
+      plotBlips(cycles, quadrants.III, -1, 1, 'third');
+      plotBlips(cycles, quadrants.IV, 1, 1, 'fourth');
+    }
   };
 
   return self;