added fibonacci algorithm to render the arcs
authorBruno Trecenti <btrecent@thoughtworks.com>
Wed, 26 Feb 2014 18:14:03 +0000 (15:14 -0300)
committerBruno Trecenti <btrecent@thoughtworks.com>
Wed, 26 Feb 2014 18:14:03 +0000 (15:14 -0300)
examples/default.html
src/graphing/radar.js
src/namespaces.js
src/util/fib.js [new file with mode: 0644]
test/utils/fib-spec.js [new file with mode: 0644]

index 87fa986..e302073 100644 (file)
@@ -4,6 +4,7 @@
   <meta charset="utf-8">
   <script src="../bower_components/d3/d3.min.js"></script>
   <script src="../src/namespaces.js"></script>
+  <script src="../src/util/fib.js"></script>
   <script src="../src/models/cycle.js"></script>
   <script src="../src/models/blip.js"></script>
   <script src="../src/models/quadrant.js"></script>
@@ -43,7 +44,7 @@
         new tr.models.Blip('A', adopt),
         new tr.models.Blip('B', trial),
         new tr.models.Blip('C', assess),
-        new tr.models.Blip('D', hold),
+        new tr.models.Blip('D', hold)
     ]);
     radar.setFirstQuadrant(toolsQuadrant);
 
index b6386c6..704c572 100644 (file)
@@ -1,5 +1,7 @@
 tr.graphing.Radar = function (svg, size, radar) {
-  var self = {};
+  var self, fib;
+  self = {};
+  fib = new tr.util.Fib();
 
   svg.attr('width', size).attr('height', size);
 
@@ -23,16 +25,22 @@ tr.graphing.Radar = function (svg, size, radar) {
       .attr('stroke-width', 14);
   };
 
+  function getRadius(cycles, i) {
+    var sequence = fib.sequence(cycles.length);
+    var total = fib.sum(cycles.length);
+    var sum = fib.sum(i);
+
+    return center() - (center() * sum / total);
+  }
+
   function plotCircles(cycles) {
     var increment;
 
-    increment = Math.round(center() / cycles.length);
-
     cycles.forEach(function (cycle, i) {
       svg.append('circle')
         .attr('cx', center())
         .attr('cy', center())
-        .attr('r', center() - increment * i);
+        .attr('r', getRadius(cycles, i));
     });
   }
 
@@ -44,12 +52,12 @@ tr.graphing.Radar = function (svg, size, radar) {
     cycles.forEach(function (cycle, i) {
       svg.append('text')
         .attr('y', center() + 4)
-        .attr('x', (i * increment) + 10)
+        .attr('x', center() - getRadius(cycles, i) + 10)
         .text(cycle.name());
 
       svg.append('text')
         .attr('y', center() + 4)
-        .attr('x', size - (i * increment) - 10)
+        .attr('x', center() + getRadius(cycles, i) - 10)
         .attr('text-anchor', 'end')
         .text(cycle.name());
     });
index 60fafca..3d15545 100644 (file)
@@ -1,3 +1,4 @@
 var tr = tr || {};
 tr.models = {};
 tr.graphing = {};
+tr.util = {};
diff --git a/src/util/fib.js b/src/util/fib.js
new file mode 100644 (file)
index 0000000..2170b44
--- /dev/null
@@ -0,0 +1,24 @@
+tr.util.Fib = function () {
+  var self = {};
+
+  self.sequence = function (length) {
+    var result = [0, 1];
+
+    for (var i = 2; i < length; i++) {
+      result[i] = result[i-2] + result[i-1];
+    }
+
+    return result;
+  };
+
+  self.sum = function (length) {
+    if (length === 0) { return 0; }
+    if (length === 1) { return 1; }
+
+    return self.sequence(length + 1).reduce(function (previous, current) {
+      return previous + current;
+    }, 0);
+  };
+
+  return self;
+};
diff --git a/test/utils/fib-spec.js b/test/utils/fib-spec.js
new file mode 100644 (file)
index 0000000..50d00f1
--- /dev/null
@@ -0,0 +1,13 @@
+describe('tr.util.Fib', function () {
+  it('returns the fibonacci sequence', function () {
+    var fib = new tr.util.Fib();
+
+    expect(fib.sequence(5)).toEqual([0, 1, 1, 2, 3]);
+  });
+
+  it('returns the sum of a sequence', function () {
+    var fib = new tr.util.Fib();
+
+    expect(fib.sum(5)).toEqual(12);
+  });
+});