画扇形的方法

方法一:起始角度是0,那么第一条线就是line(r,0),通过旋转扇形的角度,第二条线就是line(r,0)

//圆弧

ctx.save();

ctx.translate(100, 100);

ctx.arc(0,0,100,0, 30*Math.PI/180);

ctx.restore();//第一条线

ctx.save();

ctx.moveTo(100,100);

ctx.lineTo(200,100);

ctx.restore();//第二条线

ctx.save();

ctx.translate(100, 100);

ctx.moveTo(0,0);

ctx.rotate(30*Math.PI/180);

ctx.lineTo(100,0);

ctx.stroke();

ctx.restore();

第一步为什么是设置原点呢,为什么不用moveTo来设置起始点呢?

因为画布的默认原点在0,0的位置上,如果用moveTo来设置起始点,原点依然还在0,0的位置,而变换是以原点为基准点的,即使你设置了起始点,但是起始点不是原点的话,图形旋转依然会围绕0,0点旋转然后自转,得到的图形就不知道是什么图形了。

方法二:

//将原点设置100,100位置

ctx.translate(100,100);//原点在100,100,则圆心设为0,0 ——> 100,100的位置

ctx.arc(0,0,100,30*Math.PI/180,60*Math.PI/180);//save(),restore()是为了防止角度旋转的污染

ctx.save();

ctx.rotate(30*Math.PI/180);

ctx.moveTo(0,0);

ctx.lineTo(100,0);

ctx.restore();

ctx.rotate(60*Math.PI/180);

ctx.moveTo(0,0);

ctx.lineTo(100,0);

ctx.stroke();

关于save()和restore():

其作用不只是可以防止外面的属性或方法对里面的绘制产生影响,它的本质意思是save()保存当前环境的状态,restore()返回之前保存路径的状态。在这里要注意还原的触点在什么地方,如下例子:

1 //将原点设置100,100位置

2 ctx.translate(100,100);3 //原点在100,100,则圆心设为0,0 ——> 100,100的位置

4 ctx.arc(0,0,100,30*Math.PI/180,60*Math.PI/180);5 //save(),restore()是为了防止角度旋转的污染

6 ctx.save();7 ctx.rotate(30*Math.PI/180);

8 ctx.moveTo(0,0);9 ctx.lineTo(100,0);10 ctx.restore();11 ctx.rotate(60*Math.PI/180);

12 ctx.lineTo(100,0);13 ctx.stroke();

跟上面的代码比就是少了12行的moveTo(0,0),结果如下图1:

原因是:线在旋转的时候,是从它的起点为圆心旋转的,而上面的代码是,第一条线从圆心开始,到圆弧的起点(旋转过后),自然现在的起点就是圆弧的起点了,然后再rotate(60*Math.PI/180);lineTo(100,0);就是从圆弧的起点画到(100,0)的线了

现在我们将第一条直线的起点设在(r,0)的位置,旋转后就到了圆弧的起始点,然后在画到圆心地方,那现在的起始点就是圆心了,再画一条线到圆弧,就可以了,如下:

//将原点设置100,100位置

ctx.translate(100,100);//原点在100,100,则圆心设为0,0 ——> 100,100的位置

ctx.arc(0,0,100,30*Math.PI/180,60*Math.PI/180);//save(),restore()是为了防止角度旋转的污染

ctx.save();

ctx.rotate(30*Math.PI/180);

ctx.moveTo(100,0);

ctx.lineTo(0,0);

ctx.restore();

ctx.rotate(60*Math.PI/180);

ctx.lineTo(100,0);

ctx.stroke();

方法三:充分使用触点的作用,当我们再画圆弧的时候,画完之后其触点在圆弧的结束位置,为何不直接将这个触点作为起点,画一条到圆心的线,然后再画第二条线。如下代码:

//将原点设置100,100位置

ctx.translate(100,100);//原点在100,100,则圆心设为0,0 ——> 100,100的位置

ctx.arc(0,0,100,30*Math.PI/180,60*Math.PI/180);//以圆弧终点为起点画直线,rotate使得直角坐标系旋转了30°

ctx.lineTo(0,0);

ctx.rotate(30*Math.PI/180);

//以0,0为起点画直线

ctx.lineTo(100,0);

ctx.stroke();

方法四:配合beginPath()和closePath()

为什么要用translate,而不要moveTo,是因为如果需要旋转,所以就需要原点,现在不需要旋转,而是正常的画图,那么就不需要原点,就可以用moveTo。

配合beginPath()和closePath(),就会将一个圆弧封闭起来。

ctx.beginPath();//定义起点

ctx.moveTo(100,100);//以起点为圆心,画一个半径为100的圆弧

ctx.arc(100,100,100,30*Math.PI/180, 60*Math.PI/180);

ctx.closePath();

ctx.stroke();

特别注意:

使用arc()绘制图形时,如果没有设置moveTo(),那么会从圆弧的开始的点作为起始点。如果设置了moveTo(),那么该点会连线到圆弧起始点。

如果使用stroke()方法,那么会从开始连线到圆弧的起始位置。 如果是 fill 方法, 会自动闭合路径填充

封装函数

CanvasRenderingContext2D.prototype.sector = function(x,y,r,angle1,angle2){this.save();this.beginPath();this.moveTo(x,y);this.arc(x,y,r,angle1*Math.PI/180,angle2*Math.PI/180,false);this.closePath();this.restore();return this;

}

ctx.fillStyle= 'red';

ctx.sector(200,200,100,30,150).fill();

ctx.fillStyle= 'green';

ctx.sector(200,200,100,150,270).fill();

ctx.fillStyle= 'blue';

ctx.sector(200,200,100,270,390).fill();

画饼图

思路:

1)将每块饼的占比以整数形式储存在数组nums中,将每个饼的颜色以字符串形式储存在数组colors中,两个数组的值一一对应。将画布旋转坐标定义在即将绘制圆的中心,定义绘制圆弧(饼)的起始角度start和终止角度end均为0

2)绘制圆饼,6个不同板块,所以有6次for循环,从绘制第二个饼开始,起始角度是在上一个饼的终止角度位置,因此,每次循环开始后,要对当前的终止角度end进行累加一次,绘制圆弧直接以start开始,以end结束,当前绘制完成之后,要对起始角度start完成一次累加;同时每次绘制都给板块填充对应的颜色。封装为函数pieChart();

3)绘制圆饼对应的占比数值,也是6次for循环,为了便于代码易读,这里重新定义了一个函数。并对起始角度start和终止角度end重新利用,nums中储存的是当前数值占100的份数,将其转化为对应角度为nums[i]/50*Math.PI;让其显示在板块角度中线位置nums[i]/50*Math.PI/2;同样每次循环起始角度是在上一个饼的终止角度位置,绘制前后也要进行累加。封装为函数pieNum();

varcan1=document.getElementById("can1");varctx=can1.getContext("2d");varnums=[26,15,12,5,25,17];varcolors=["#983335","#77963f","#5d437c","#35859f","#d1702f","#365e96"];varstart= 0;varend= 0;

ctx.translate(400,350);//绘制圆饼

functionpieChart(){for(vari= 0;i

ctx.beginPath();

ctx.moveTo(0,0);

end+=nums[i]/50*Math.PI;//终止角度

ctx.strokeStyle= "white";

ctx.fillStyle=colors[i];

ctx.arc(0,0,200,start,end);

ctx.fill();

ctx.closePath();

ctx.stroke();

start+=nums[i]/50*Math.PI;//起始角度

}

}//绘制圆饼上的数值

functionpieNum(){for(vari= 0;i

start=nums[i]/50*Math.PI/2;

ctx.rotate(end+start);//旋转数值

ctx.font= "25px scans-serif";

ctx.fillStyle= "#000";

ctx.fillText(nums[i]+"%",140,0);

end=nums[i]/50*Math.PI/2;

}

}

ctx.rotate(-Math.PI/6);//旋转一定角度更加自然

pieChart();

pieNum();

hdc mfc 画扇形图_canvas画扇形、饼图相关推荐

  1. python画超长图-python 画长图

    广告关闭 腾讯云双11爆品提前享,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高满返5000元! 最近遇到个任务需要画一些坐标图,我就在想,用了这么长时间的 python 了,能不 ...

  2. matlab如何画波特图,matlab画波特图

    Matlab 中 Bode 图的绘制技巧 学术收藏 2010-06-04 21:21:48 阅读 54 评论 0 字号:大中小 订阅 我们经常会遇到使用 Matlab 画伯德图的情况,可能我们我们都. ...

  3. java怎么画八卦图_自己画八卦图怎么画?电脑绘制八卦图|八卦图的简单画法

    今天又是美妙的周五了,其实小编周一早上起床睁开眼的时候,就很期待的想着,如果今天是周五就好了.结果没想到,时间一下子就过去了,今天真的是周五了.啊哈哈,很绕是吧,还是不说废话了,来看看今天的教程方案吧 ...

  4. python画离散图_python画离散图

    广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! 不过,恋习python突然想到,可以通过python将故宫的建筑物图片,转化为手 ...

  5. php类图怎么画,类图怎么画?

    类图怎么画? 步骤: 1.打开visio画图软件,在左边的导航中选择"软件"选项,在右边会有很多图,我们会看到UML图,点击选择进入. 2.我们会进入画图的界面,在上面导航区有个百 ...

  6. python用七巧板图片画个图_canvas练习 - 七巧板绘制

    27 28 您的浏览器不支持canvas,请更换29 30 31 //function DrawLine(arr) { 32 ///* 之前这种写法,以为要一个moveTo一个lineTo的,后来发现 ...

  7. python用七巧板图片画个图_canvas 入门-利用 canvas 制作一个七巧板

    当前浏览器不支持cnavas var tangram = [ { f:[{x: 0,y: 0},{x: 800, y: 0},{x: 400, y: 400}], color: "#FEF7 ...

  8. matlab画完图之后,Matlab的1个figure画多图在画最后1张图时整个图突然变乱了?

    在一个figure中画多张图出现下面的情况: 画前三个图时(图一)还正常(为了避嫌用画图板处理了一下),再画第四个整个figure(图二)就突然变乱了 .而且单独画第四个figure(图三),它的位置 ...

  9. html js 扇形统计图_canvas绘制扇形统计图

    今天偷懒了,把上次的作业代码记录在这里好了. 绘制简单的扇形统计图需要用到JS插件,绘制完以后的代码是这样的: 今天有点晚了把代码记录一下: *{ margin:0px; padding:0px;} ...

最新文章

  1. 线程VS进程,多线程VS多进程,并行VS并发,单核cpuVS多核cpu
  2. 推荐几篇介绍Windows CE 6.0的文章
  3. html如何获取请求头变量的值。_如何使用 Python 爬取微信公众号文章
  4. pillow模块批量 读取图像、旋转、放缩、裁剪图片等操作
  5. 08-Isolation using virtualization in the Secure World_Whitepaper
  6. kafka 集群_10分钟搭建单机Kafka集群
  7. leader选举的源码分析-QuorumPeer.start
  8. 最小二乘与最大似然估计之间的关系
  9. pycharm运行程序时看不到任何结果显示
  10. 注解、路径、 Log4J、<settings>标签
  11. 智慧城市特效(建筑颜色渐变、飞线、扫光、扫描、光墙、线路、水、道路线条、锥形标、漫游)three+shader
  12. Linux上查到目前透过FTP进来的使用者
  13. VC++鼠标、键盘的模拟操作
  14. 植被农业数据下载网站整理
  15. matlab如何根据历年gdp找增长规律,中国历年GDP统计数据
  16. 手机变Android麦克风,【工具】手机秒变摄像头及麦克风方法
  17. Attention-Based Recurrent Neural Network Models for Joint Intent Detection and Slot Filling论文笔记
  18. Permissions 0777 for ‘/home/***/.ssh/id_rsa‘ are too open.
  19. Java架构师学习路线图
  20. SpringBoot + Vue 的物流仓库管理系统源码

热门文章

  1. 80386/386/Intel386 架构/流水线及其优化
  2. android sdk源码 andoid-21 下的TextUtils.java文本工具类 源码赏析
  3. Unity的camera组件
  4. html 写字版插件,JS+HTML5 Canvas实现简单的写字板功能示例
  5. 关于Early-Z Culling(提前Z拣选)
  6. 2021-07-05 倒置链表(Cpp/C)
  7. 警告—系统—srv—2013—无
  8. 【MySQL数据库开发之四】MySQL 处理模式/常用查询/模式匹配等(下)
  9. 错误笔记:在OleDb执行下Access ,程序不报错,但是Update也更新不成功的
  10. draconet 1.6-release-1 (1.6.3.0)