绘制曲线

<script>window.onload = function () {let canvas = document.querySelector('canvas');if (canvas.getContext) {let ctx = canvas.getContext('2d');setTimeout(() => {ctx.clearRect(0, 0, canvas.width, canvas.height)}, 10000);// 什么是弧度?- 一种长度的描述// 一弧度等一圆的半径// 周长 = 2*π*r = 2*π*弧度 // 1° = π/180// 曲线的绘制-曲线是可以由数学公式得来// 线是由点构成的// 公式:y=2xlet canvasWidth = canvas.width;for (let i = 0; i < canvasWidth; i++) {let x = i;let y = 2 * x;// let y = 50 * Math.sin(x / 10) + 100;ctx.lineTo(x, y);};ctx.stroke();}}
</script>

圆弧

  • 绘制圆弧或者圆,我们使用arc()方法。
  • 注意点:弧度=(Math.PI/180)*角度
  • arc(x, y, radius, startAngle, endAngle, anticlockwise):画一个以(x,y)为圆心的以radius为半径的圆弧(圆),从startAngle开始到endAngle结束,按照anticlockwise给定的方向(默认为顺时针)来生成。

绘制圆弧

<script>window.onload = function () {let canvas = document.querySelector('canvas');if (canvas.getContext) {let ctx = canvas.getContext('2d');setTimeout(() => {ctx.clearRect(0, 0, canvas.width, canvas.height)}, 10000);// 根据角度转换成弧度function angleTransformRadin(angle) {// 一个弧度等于一个半径的长度// 圆的周长=2*π*r ==> 2*π*弧度// 一个角度=2*π*弧度/360=π*弧度/180// angle个角度=π/180*angle(弧度)return Math.PI * angle / 180};let canvasWidth = canvas.width;let canvasHeight = canvas.height;// 顺时针// ctx.beginPath();// ctx.arc(canvasWidth / 2, canvasHeight / 2, 150, 0, angleTransformRadin(90));// ctx.stroke();// 逆时针ctx.beginPath();ctx.arc(canvasWidth / 2, canvasHeight / 2, 150, 0, angleTransformRadin(90), true);ctx.stroke();}}
</script>

绘制笑脸

<script>window.onload = function () {let canvas = document.querySelector('canvas');if (canvas.getContext) {let ctx = canvas.getContext('2d');setTimeout(() => {ctx.clearRect(0, 0, canvas.width, canvas.height)}, 10000);for (var i = 0; i < 4; i++) {for (var j = 0; j < 3; j++) {ctx.beginPath();var x = 25 + j * 50; // x 坐标值var y = 25 + i * 50; // y 坐标值var radius = 20; // 圆弧半径var startAngle = 0; // 开始点var endAngle = Math.PI + (Math.PI * j) / 2; // 结束点var anticlockwise = i % 2 == 0 ? false : true; // 顺时针或逆时针ctx.arc(x, y, radius, startAngle, endAngle, anticlockwise);if (i > 1) {ctx.fill();} else {ctx.stroke();}}}}}
</script>

绘制扇形

<script>window.onload = function () {let canvas = document.querySelector('canvas');if (canvas.getContext) {let ctx = canvas.getContext('2d');setTimeout(() => {ctx.clearRect(0, 0, canvas.width, canvas.height)}, 10000);// 根据角度转换成弧度function angleTransformRadin(angle) {// 一个弧度等于一个半径的长度// 圆的周长=2*π*r ==> 2*π*弧度// 一个角度=2*π*弧度/360=π*弧度/180// angle个角度=π/180*angle(弧度)return Math.PI * angle / 180};let canvasWidth = canvas.width;let canvasHeight = canvas.height;ctx.moveTo(canvasWidth / 2, canvasHeight / 2);ctx.arc(canvasWidth / 2, canvasHeight / 2, 150, angleTransformRadin(0), angleTransformRadin(30));ctx.closePath();ctx.stroke();}}
</script>

绘制N等分的圆

<script>window.onload = function () {let canvas = document.querySelector('canvas');if (canvas.getContext) {let ctx = canvas.getContext('2d');setTimeout(() => {ctx.clearRect(0, 0, canvas.width, canvas.height)}, 10000);// 根据角度转换成弧度function angleTransformRadin(angle) {// 一个弧度等于一个半径的长度// 圆的周长=2*π*r ==> 2*π*弧度// 一个角度=2*π*弧度/360=π*弧度/180// angle个角度=π/180*angle(弧度)return Math.PI * angle / 180};// 获取16进制的随机颜色function getRandomColor() {return `rgb(${Math.floor(Math.random() * 256)},${Math.floor(Math.random() * 256)},${Math.floor(Math.random() * 256)})`}let canvasWidth = canvas.width;let canvasHeight = canvas.height;let count = 6;let angle = 360 / count;for (let i = 0; i < count; i++) {let startAngle = i * angle;let endAngle = (i + 1) * angle;ctx.beginPath();ctx.moveTo(canvasWidth / 2, canvasHeight / 2);ctx.arc(canvasWidth / 2, canvasWidth / 2, 150, angleTransformRadin(startAngle), angleTransformRadin(endAngle));ctx.fillStyle = getRandomColor();ctx.fill();}}}
</script>

绘制根据数据的饼图

<script>window.onload = function () {let canvas = document.querySelector('canvas');if (canvas.getContext) {let ctx = canvas.getContext('2d');setTimeout(() => {ctx.clearRect(0, 0, canvas.width, canvas.height)}, 10000);// 根据角度转换成弧度function angleTransformRadin(angle) {// 一个弧度等于一个半径的长度// 圆的周长=2*π*r ==> 2*π*弧度// 一个角度=2*π*弧度/360=π*弧度/180// angle个角度=π/180*angle(弧度)return Math.PI * angle / 180};// 获取16进制的随机颜色function getRandomColor() {return `rgb(${Math.floor(Math.random() * 256)},${Math.floor(Math.random() * 256)},${Math.floor(Math.random() * 256)})`}let canvasWidth = canvas.width;let canvasHeight = canvas.height;let data = [5, 30, 10, 5];let countData = data.reduce((prev, curr) => {return prev + curr;});let angleData = data.map(item => {return item / countData * 360});let startAngle = 0;angleData.forEach(item => {let endAngle = startAngle + item;ctx.beginPath();ctx.moveTo(canvasWidth / 2, canvasHeight / 2);ctx.arc(canvasWidth / 2, canvasWidth / 2, 150, angleTransformRadin(startAngle), angleTransformRadin(endAngle));ctx.fillStyle = getRandomColor();ctx.fill();startAngle = endAngle;});}}
</script>

根据数据绘制饼图

<script>window.onload = function () {let canvas = document.querySelector('canvas');if (canvas.getContext) {let ctx = canvas.getContext('2d');// setTimeout(() => {//   ctx.clearRect(0, 0, canvas.width, canvas.height)// }, 10000);let data = [{title: '15-20岁',count: 6},{title: '20-25岁',count: 30},{title: '25-30岁',count: 10},{title: '30以上',count: 8}];class PieChart {constructor(selector) {// 绘制工具this.ctx = document.querySelector(selector).getContext('2d');// 画布的宽度this.canvasWidth = this.ctx.canvas.width;// 画布的高度this.canvasHeight = this.ctx.canvas.height;// 饼图绘制中心this.x0 = this.canvasWidth / 2;this.y0 = this.canvasHeight / 2;// 圆的半径this.radius = 150;// 伸出去线的长度this.outline = 20;// 绘制矩形的大小this.legendWidth = 30;this.legendHeight = 16;this.space = 20;}// 根据角度转换成弧度angleTransformRadin(angle) {// 一个弧度等于一个半径的长度// 圆的周长=2*π*r ==> 2*π*弧度// 一个角度=2*π*弧度/360=π*弧度/180// angle个角度=π/180*angle(弧度)return Math.PI * angle / 180}// 获取16进制的随机颜色getRandomColor() {return `rgb(${Math.floor(Math.random() * 256)},${Math.floor(Math.random() * 256)},${Math.floor(Math.random() * 256)})`}init(data) {this.drawPie(data);}// 绘制饼图drawPie(data) {let allCount = data.reduce((total, curr) => {return total + curr.count}, 0);data.forEach(item => {item.radian = this.angleTransformRadin(item.count / allCount * 360);});let startAngle = 0;data.forEach((item, index) => {let endAngle = startAngle + item.radian;this.ctx.beginPath();this.ctx.moveTo(this.x0, this.y0);this.ctx.arc(this.x0, this.y0, this.radius, startAngle, endAngle);this.ctx.fillStyle = this.getRandomColor();this.ctx.fill();// 绘制文字说明this.drawText(startAngle, item, this.ctx.fillStyle);// 绘制图例this.drawLegend(item, index, this.ctx.fillStyle);startAngle = endAngle;})}// 绘制文字说明drawText(startAngle, item, lineColor) {// 获取斜边的长度let edge = this.radius + this.outline;// 获取x轴直角边的长度let edgeX = Math.cos(startAngle + item.radian / 2) * edge;// 获取y轴直角边的长度let edgeY = Math.sin(startAngle + item.radian / 2) * edge;// 绘制延长线this.ctx.beginPath();this.ctx.moveTo(this.x0, this.y0);this.ctx.lineTo(this.x0 + edgeX, this.y0 + edgeY);this.ctx.strokeStyle = lineColor;this.ctx.stroke();// 绘制文字this.ctx.beginPath();this.ctx.moveTo(this.x0 + edgeX, this.y0 + edgeY);if (edgeX > 0) {this.ctx.direction = 'ltr';} else {this.ctx.direction = 'rtl';}this.ctx.fillText(item.title, this.x0 + edgeX, this.y0 + edgeY);// 绘制文字下划线this.ctx.beginPath();let textWidth = this.ctx.measureText(item.title).width;this.ctx.moveTo(this.x0 + edgeX, this.y0 + edgeY);if (edgeX > 0) {this.ctx.lineTo(this.x0 + edgeX + textWidth, this.y0 + edgeY);} else {this.ctx.lineTo(this.x0 + edgeX - textWidth, this.y0 + edgeY);}this.ctx.stroke();}// 绘制图例drawLegend(item, index, fillStyle) {// 绘制矩形填充this.ctx.beginPath();this.ctx.fillStyle = fillStyle;this.ctx.fillRect(this.space, this.space + index * this.space, this.legendWidth, this.legendHeight);// 绘制文字this.ctx.beginPath();this.ctx.font = '16px 幼圆';this.ctx.direction = 'ltr';this.ctx.textBaseline = 'top'this.ctx.fillText(item.title, this.space + this.legendWidth + 6, this.space + index * this.space);}};new PieChart('canvas').init(data);}}
</script>

canvas-绘制曲线/圆弧/扇形/圆/饼图相关推荐

  1. html 画动画效果,html5 canvas绘制曲线动画特效

    特效描述:html5 canvas绘制 曲线动画特效. 代码结构 1. HTML代码 Balls Size Speed Delay Go! Presets: Atomic Flower Spiro Y ...

  2. html弧形列表效果,JavaScript+html5 canvas绘制的圆弧荡秋千效果完整实例

    本文实例讲述了JavaScript+html5 canvas绘制的圆弧荡秋千效果.分享给大家供大家参考,具体如下: 运行效果截图如下: 具体代码如下: demo #canvas { margin:50 ...

  3. Canvas绘制曲线

    文章目录 圆弧 贝塞尔曲线 圆弧 圆弧使用arc方法绘制,画圆的时候画的弧度是从0到2π,而想要画圆弧就调整参数只画出部分圆即可. const canvas = document.getElement ...

  4. 微信小程序canvas绘制曲线图表

    先上图 不能耽误大家时间.由于也是才入手小程序 很多不会代码有点乱 看官些能用就用不能用就看看哈. view代码 <view class="efficacy">< ...

  5. Canvas绘制圆滑曲线

    canvas 绘制曲线是一个比较容易实现的逻辑,但是对于签名,或者手写板,大屏会议机等设备原生的Canvas.drawPath(); 要求线条曲率完美,直接使用drawPath显然不能满足需求,这方面 ...

  6. android坐标图绘制曲线,Android 曲线图 绘制曲线

    Android 曲线图 Paste_Image.png 这里我引用了上回介绍的 折线图 首先我们看看onDrwa 里面做了什么 从图里面我们可看到 绘制的框线方法,绘制data线方法 绘制线上的圆 从 ...

  7. 使用canvas绘制水滴(二次贝塞尔曲线、圆弧)

    <!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8" ...

  8. vue + canvas绘制扇形圆盘

    vue + canvas绘制扇形圆盘 html: <canvas style="position: fixed;z-index:-1" width="545&quo ...

  9. html制作曲线,HTML5 canvas基本绘图之绘制曲线

    是HTML5中新增的标签,用于绘制图形,实际上,这个标签和其他的标签一样,其特殊之处在于该标签可以获取一个CanvasRenderingContext2D对象,我们可以通过JavaScript脚本来控 ...

最新文章

  1. torch拼接合并 cat优化记录
  2. 实际工程里的长宽设定
  3. 获取GitHub上远程分支内容
  4. 常犯的18个统计学错误, 避坑防雷指南!
  5. 几个最短路径算法Floyd、Dijkstra、Bellman-Ford、SPFA的比较
  6. 【探索HTML5第二弹05】响应式布局(中),一步一步响应式布局
  7. Python3爬虫(十一) 爬虫与反爬虫
  8. Monocular slam 的理论基础(1)
  9. 个人博客开发系列:前台博客页面开发部署完成
  10. ad中按钮开关的符号_弱电图纸中敷设方式符号表示大全
  11. Android 增量编译小解
  12. 强化学习之Q-Learning(附代码)
  13. android 主题颜色意义
  14. 生物信息学之抗癌药物反应论文阅读六:DNN整合基因组谱
  15. 葡萄城报表模板库更新!新增物流行业特色模板
  16. xxl-job + el-calendar实现任务日历制作
  17. 程序员都在哪些平台写技术博客?
  18. 《国史通鉴》- 宋朝
  19. 榆熙电商:在拼多多开网店如何计算产品价格弹性区间?
  20. 只用mysql实现银行转账_基于mysql数据库银行转账功能实现

热门文章

  1. Java设计模式之原型模式(浅克隆,深克隆)
  2. centos 安装 ImageMagick
  3. C语言编写web server
  4. 内网学习——0x05 BloodHound 的使用
  5. 花生壳工具使用无法映射本地站点问题
  6. Vercel部署Typecho动态博客
  7. eprom是计算机内存吗,eeprom是什么存储器
  8. python数据处理,用于大学生期末考试(还没完全写完,待更新)
  9. superblock块丢失后
  10. 数据库查询(连接查询)