好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

JavaScript 绘制饼图的示例

绘制效果

实现代码

JavaScript

?

var canvas = document.getElementById( "mycanvas" );

var w = window.innerWidth;

var h = window.innerHeight;

canvas.height = 1000;

canvas.width = 1400;

var ctx = canvas.getContext( '2d' );

 

var poppable = true ;

 

var slices = [];

 

function shadeColor(color, percent) {

  var f = parseInt(color.slice(1), 16),

   t = percent < 0 ? 0 : 255,

   p = percent < 0 ? percent * -1 : percent,

   R = f >> 16,

   G = f >> 8 & 0x00FF,

   B = f & 0x0000FF;

  return "#" + (0x1000000 + (Math.round((t - R) * p) + R) * 0x10000 + (Math.round((t - G) * p) + G) * 0x100 + (Math.round((t - B) * p) + B)).toString(16).slice(1);

}

 

function pieSlice(oX, oY, r, pos, len, col,data) {

  this .data = data

  this .originX = oX;

  this .originY = oY;

  this .radius = r;

  this .startingRadian = pos;

  this .length = len;

  this .color = col;

  this .highlightedColor = shadeColor( this .color, .6);

  this .highlighted = false ;

  this .popped = false ;

  this .animationFrame = 0;

 

  function setColor(c) {

   this .color = c;

  }

}

 

pieSlice.prototype.displayData = function (){

  ctx.fillStyle= this .color;

  ctx.fillRect( this .originX - this .radius - 40, this .originY- this .radius-35, 25,25);

  ctx.fillStyle= "white" ;

  ctx.font = "15px Arial" ;

  ctx.fillText( this .data, this .originX - this .radius - 10, this .originY - this .radius - 18);

}

 

pieSlice.prototype.render = function () {

  if (! this .highlighted) {

   ctx.fillStyle = this .color;

   ctx.strokeStyle = this .color;

  } else {

   if (! this .popped && poppable){

    this .displayData();

   }

   // ctx.fillStyle = this.color;

   ctx.fillStyle = this .highlightedColor;

   ctx.strokeStyle = this .color;

  }

  ctx.beginPath();

  var xOffset = Math.cos( this .length / 2 + this .startingRadian) * this .animationFrame;

  var yOffset = Math.sin( this .length / 2 + this .startingRadian) * this .animationFrame;

  ctx.moveTo( this .originX + xOffset, this .originY + yOffset);

  var x = this .originX + xOffset + this .radius * Math.cos( this .startingRadian);

  var y = this .originY + yOffset + this .radius * Math.sin( this .startingRadian);

  ctx.lineTo(x, y);

  ctx.arc( this .originX + xOffset, this .originY + yOffset, this .radius, this .startingRadian, this .startingRadian + this .length);

  if ( this .popped) {

   var fill = ctx.fillStyle;

   this .displayData();

   ctx.fillStyle = fill;

   if ( this .animationFrame < 30) {

    this .animationFrame += 2;

   }

  } else {

   if ( this .animationFrame > 0) {

    this .animationFrame -= 2;

   }

  }

  ctx.closePath();

  //ctx.stroke();

  //if (this.highlighted) {

  ctx.fill();

  // }

}

 

pieSlice.prototype.update = function () {

 

}

 

function pieChart(s) {

  this .slices = s;

}

pieChart.prototype.render = function () {

  this .slices.forEach( function (p) {

   p.render();

  });

};

 

pieChart.prototype.update = function () {

   this .slices.forEach( function (p) {

    p.update();

   });

 

  }

  //PIE ONE

var pie = new pieSlice(700, 170, 125, 0, Math.PI / 4, "#FFD1DC" , 12);

var slice2 = new pieSlice(700, 170, 125, Math.PI / 4, Math.PI / 4, "#08E8DE" );

var slice3 = new pieSlice(700, 170, 125, Math.PI / 2, Math.PI / 4, "#6699CC" );

var slice4 = new pieSlice(700, 170, 125, 3 * Math.PI / 4, Math.PI, "#ADD8E6" );

var slice5 = new pieSlice(700, 170, 125, 7 * Math.PI / 4, Math.PI / 4, "#B19CD9" );

var slices1 = [pie, slice2, slice3, slice4, slice5];

 

var pink = new pieSlice(220, 170, 125, 0, Math.PI / 3, "#FF4B4B" );

var orange = new pieSlice(220, 170, 125, Math.PI / 3, Math.PI / 3, "#FF931B" );

var yellow = new pieSlice(220, 170, 125, 2 * Math.PI / 3, Math.PI / 3, "#FFE21B" );

var green = new pieSlice(220, 170, 125, 3 * Math.PI / 3, Math.PI / 3, "#90E64E" );

var blue = new pieSlice(220, 170, 125, 4 * Math.PI / 3, Math.PI / 3, "#6097D9" );

var purple = new pieSlice(220, 170, 125, 5 * Math.PI / 3, Math.PI / 3, "#8365DD" );

 

var redd = new pieSlice(1180, 170, 125, 0, 2 * Math.PI / 3, "#B3989B" );

var orangee = new pieSlice(1180, 170, 125, 2 * Math.PI / 3, 1 * Math.PI / 8, "#C1AEE0" );

var bluee = new pieSlice(1180, 170, 125, 19 * Math.PI / 24, 4 * Math.PI / 24, "#928CE9" );

var greenn = new pieSlice(1180, 170, 125, 23 * Math.PI/24, 3* Math.PI/8, "#676675" );

var purplee = new pieSlice(1180, 170, 125, 4 * Math.PI/3, 3* Math.PI/8, "#947D59" );

var ceci = new pieSlice(1180, 170, 125, 41 * Math.PI/24, 7*Math.PI/24, "#D994E0" );

 

var slices3 = [redd, orangee, bluee, greenn, purplee, ceci];

 

var slices2 = [pink, orange, yellow, green, blue, purple];

var pie1 = new pieChart(slices1);

var pie2 = new pieChart(slices2);

var pie3 = new pieChart(slices3);

var update = function () {

  pie1.update();

}

var render = function () {

  ctx.clearRect(0, 0, canvas.width, canvas.height);

  pie1.render();

  pie2.render();

  pie3.render();

}

 

var step = function () {

  update();

  render();

  animate(step);

}

 

var animate = window.requestAnimationFrame ||

  window.webkitRequestAnimationFrame ||

  window.mozRequestAnimationFrame ||

  function (callback) {

   window.setTimeout(callback, 1000 / 60);

  };

 

slices.push.apply(slices, slices1);

slices.push.apply(slices, slices2);

slices.push.apply(slices, slices3);

 

canvas.addEventListener( "mousemove" , function (e) {

  var x = e.clientX;

  var y = e.clientY;

  slices.forEach( function (slice) {

   ctx.beginPath();

   var xOffset = Math.cos(slice.length / 2 + slice.startingRadian) * slice.animationFrame;

   var yOffset = Math.sin(slice.length / 2 + slice.startingRadian) * slice.animationFrame;

   ctx.moveTo(slice.originX + xOffset, slice.originY + yOffset);

   var xx = slice.originX + xOffset + slice.radius * Math.cos(slice.startingRadian);

   var yy = slice.originY + yOffset + slice.radius * Math.sin(slice.startingRadian);

   ctx.lineTo(xx, yy);

   ctx.arc(slice.originX + xOffset, slice.originY + yOffset, slice.radius, slice.startingRadian, slice.startingRadian + slice.length);

   if (ctx.isPointInPath(x, y)) {

    slice.highlighted = true ;

    slice.displayData();

   } else {

    slice.highlighted = false ;

   }

   ctx.closePath();

 

  });

});

 

canvas.addEventListener( "click" , function (e) {

  var x = e.clientX;

  var y = e.clientY;

  slices.forEach( function (slice) {

   ctx.beginPath();

   var xOffset = Math.cos(slice.length / 2 + slice.startingRadian) * slice.animationFrame;

   var yOffset = Math.sin(slice.length / 2 + slice.startingRadian) * slice.animationFrame;

   ctx.moveTo(slice.originX + xOffset, slice.originY + yOffset);

   var xx = slice.originX + xOffset + slice.radius * Math.cos(slice.startingRadian);

   var yy = slice.originY + yOffset + slice.radius * Math.sin(slice.startingRadian);

   ctx.lineTo(xx, yy);

   ctx.arc(slice.originX + xOffset, slice.originY + yOffset, slice.radius, slice.startingRadian, slice.startingRadian + slice.length);

   if (ctx.isPointInPath(x, y)) {

    if (slice.popped) {

     slice.popped = false ;

     poppable = true ;

    } else {

     if (poppable){

       slice.popped = true ;

      poppable = false ;

     }

    }

    slice.highlighted = false ;

   }

   ctx.closePath();

 

  });

});

 

//start the loop

animate(step);

html

?

< canvas id = "mycanvas" ></ canvas >

以上就是JavaScript 绘制饼图的示例的详细内容,更多关于JavaScript 绘制饼图的资料请关注服务器之家其它相关文章!

原文链接:https://codepen.io/brgirardeau/pen/MwqgKG

查看更多关于JavaScript 绘制饼图的示例的详细内容...

  阅读:39次