D3.js donut chart

by slandmann

HTML

<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.5.16/d3.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.2.0/jquery.min.js"></script>
<svg></svg>

CSS

line{
  fill: transparent;
  display: none;
}

circle{
  fill: #ffd502;
}

rect{
  fill: none;
}

#circleMask{
  fill: green;
  opacity: 0.5;
}

JavaScript

var width = 250,
    height = 250,
		primaryCircleSize = width * 0.15,
		circleDistances = [0.50, 0.77, 1.00],
    circleSizes = [0.25, 0.20, 0.15],
    arms = 9,
    armAngle = (360/arms),
    lines =	function(){
			var lines = [],
  			offsetDegrees = 15;
  		for(var i = 0; i < arms; i++){
  			lines.push((i * armAngle) + offsetDegrees);
  		}
  		return lines;
		},
		armLength = 3 * primaryCircleSize,
    centerX = width / 2,
    centerY = height / 2,
    chunksRotated = 0,
    maskRotations = 0,
    chunkRotationSpeedInMs = 200,
    maskRotationSpeedInMS = 2000,
    maxRadius = armLength + (circleSizes[circleSizes.length - 1] * primaryCircleSize),
    degressOfCircleVisibleOnMask = 180;
    
var svg = d3.select("svg")
    .attr("width", width)
    .attr("height", height)
    .append("g")
    .attr("transform", "translate(" + width / 2 + "," + height / 2 + ")")
    .append("g")
    .attr("id", "spinner")
    .attr("clip-path", "url(#mask)");
    
var arc = d3.svg.arc()
    .innerRadius(0)
    .outerRadius(maxRadius)
    .startAngle(0);
    
d3.select("svg").append("defs")
      .append("clipPath")
      .attr("id", "mask")
      .append("path")
     .datum({
        startAngle:  (0 / 360) * (2*3.14),
        endAngle:  (180 / 360) * (2*3.14)
      })
     .style("fill", "red")
     .attr("d", arc)
     .attr("transform", function(d) { 
          return "rotate("+ -165 + " "+0+","+0+")";
      });

function buildPrimaryCircle(){
	svg.append("g")
  	.attr("id", "primaryCircleG")
    //.attr("clip-path", "url(#mask)")
  	.append("circle")
    .attr("class", "primaryCircle")
    .attr("r", primaryCircleSize);
    //.attr("clip-path", "url(#mask)");
}

function buildLines(){
	svg.append("g")
  	.attr("id", "lineG")
    //.attr("clip-path", "url(#mask)")
    .selectAll("line")
  	.data(lines)
    .enter()
    .append("g")
    .attr("class", "lineGroup")
    .attr("id", function(d, i){
    	return "lineGroup" + i;
    })
    .append("line")
    .attr("x1", 0)
   ...