如何使用canvas绘制椭圆,扩展非chrome浏览器中的ellipse方法

  这篇博文主要针对浏览器中绘制椭圆的方法扩展。在网上搜索了很多,发现他们绘制椭圆的方式都有缺陷。其中有压缩法,计算法,贝塞尔曲线法等多种方式。但是都不能很好的绘制出椭圆。所有我就对这个绘制椭圆的方式进行了研究,发现压缩法是可以完美实现椭圆绘制的。废话不多说,直接上代码了。

 1 if (!CanvasRenderingContext2D.prototype.ellipse) {
 2     CanvasRenderingContext2D.prototype.ellipse = function(x, y, radiusX, radiusY, rotation, startAngle, endAngle,
 3         anticlockwise) {
 4         var r = radiusX > radiusY ? radiusX : radiusY; //用打的数为半径
 5         var scaleX = radiusX / r; //计算缩放的x轴比例
 6         var scaleY = radiusY / r; //计算缩放的y轴比例
 7         var _x = x / scaleX,
 8             _y = y / scaleY; //计算圆心位置
 9         this.save(); //保存副本
10         this.translate(_x, _y); //移动到圆心位置
11         this.rotate(rotation); //进行旋转
12         this.scale(scaleX, scaleY); //进行缩放
13         this.arc(0, 0, r, startAngle, endAngle, anticlockwise); //绘制圆形
14         this.restore(); //还原副本
15     }
16 }

这里给解释一下别的博文里面中的压缩法为啥不正确.下面我抄袭别人一段代码,来解析一下为啥错误.

 1 <!DOCTYPE html>
 2 <html>
 3 <head lang="en">
 4     <meta charset="UTF-8">
 5     <title>椭圆</title>
 6 </head>
 7 <body>
 8 <canvas id="canvas" style="border:1px solid #aaa;display:block;margin:50px auto;">
 9     当前浏览器不支持Canvas,请更换浏览器后再试
10 </canvas>
11 <script>
12     var canvas = document.getElementById("canvas");
13     canvas.width = 600;
14     canvas.height = 600;
15     var context = canvas.getContext("2d");
16         context.lineWidth = 10;
17         context.strokeStyle="black";
18        EvenCompEllipse(context, 130, 200, 100, 20); //椭圆
19     function EvenCompEllipse(context, x, y, a, b){
20         context.save();
21         //选择a、b中的较大者作为arc方法的半径参数
22         var r = (a > b) ? a : b;
23         var ratioX = a / r; //横轴缩放比率
24         var ratioY = b / r; //纵轴缩放比率
25         context.scale(ratioX, ratioY); //进行缩放(均匀压缩)
26         context.beginPath();
27         //从椭圆的左端点开始逆时针绘制
28         context.moveTo((x + a) / ratioX, y / ratioY);
29         context.arc(x / ratioX, y / ratioY, r, 0, 2 * Math.PI);
30         context.closePath();
31         context.stroke();
32         context.restore();
33     };
34 </script>
35 </body>
36 </html>

他绘制的效果如下

为什么会出现这种情况呢.因为他在绘制的时候先绘制了,然后才还原.这样的话是压缩的一个路径,在绘制的时候就会连线条也进行压缩.而我的那段代码中并没有直接进行绘制.而是进行了还原操作.下面我给一段示例代码.大家可以直接进行试验.

 1 <!DOCTYPE html>
 2 <html>
 3     <head>
 4         <meta charset="utf-8">
 5         <title>canvas绘制椭圆</title>
 6     </head>
 7     <body>
 8         <canvas id="canvas" width=‘500‘ height=‘500‘></canvas>
 9         <script>
10             if (!CanvasRenderingContext2D.prototype.ellipse) {
11                 CanvasRenderingContext2D.prototype.ellipse = function(x, y, radiusX, radiusY, rotation, startAngle, endAngle,
12                     anticlockwise) {
13                     var r = radiusX > radiusY ? radiusX : radiusY; //用打的数为半径
14                     var scaleX = radiusX / r; //计算缩放的x轴比例
15                     var scaleY = radiusY / r; //计算缩放的y轴比例
16                     var _x = x / scaleX,
17                         _y = y / scaleY; //计算圆心位置
18                     this.save(); //保存副本
19                     this.translate(_x, _y); //移动到圆心位置
20                     this.rotate(rotation); //进行旋转
21                     this.scale(scaleX, scaleY); //进行缩放
22                     this.arc(0, 0, r, startAngle, endAngle, anticlockwise); //绘制圆形
23                     this.restore(); //还原副本
24                 }
25             }
26             var ctx = document.getElementById("canvas").getContext("2d");
27             ctx.beginPath();
28             ctx.ellipse(300, 300, 150, 100, 30 * Math.PI / 180, 0, Math.PI * 2);
29             ctx.lineWidth = 10; //设定线宽为10
30             ctx.stroke();
31             ctx.closePath();
32         </script>
33     </body>
34 </html>

实际效果如下:

由此可见,其实压缩法是完全可以实现椭圆绘制的.只是大部分博文里面使用的都不太对而已.

如果觉得我这种方式不是你想要的的,也可以参考:https://www.cnblogs.com/fangsmile/p/9923532.html

如果 你觉得我的方式对的话,希望你能够进行转发.让更多的人知道这种绘制椭圆的方法.谢谢.

原文地址:https://www.cnblogs.com/flybeijing/p/canvas_ellipse.html

原文地址:https://www.cnblogs.com/flybeijing/p/canvas_ellipse.html

时间: 2024-08-15 15:12:04

如何使用canvas绘制椭圆,扩展非chrome浏览器中的ellipse方法的相关文章

Jmeter在chrome浏览器中录制脚本

利用blazemeter插件可以录制chrome浏览器中的操作,并生成jmx文件,导入到jmeter中使用 1.  下载blazemeter 地址:https://pan.baidu.com/s/1VRVv4ZQ9B2U_y2p22NNqhA 2.  安装插件 将文件拖到 chrome->更多工具->扩展程序 中 插件会自动安装 安装完后,Chrome浏览器右上角有一个BZ的图标 3.注册并登录blazemeter 打开blazemeter后,需要登录,方可将录制后的脚本转换为jmx文件: 登

【js】IE、FF、Chrome浏览器中的JS差异介绍

如何判断浏览器类型 转:http://www.cnblogs.com/carekee/articles/1854674.html 1.通过浏览器特有的对象 如ie 的ActiveXObject  ff 的getBoxObjectFor  opera 的window.opera  safari 的openDatabase  Chrome 的MessageEvent有趣的是,Chrome的userAgent还包含了Safari的特征,也许这就是Chrome可以运行所有Apple浏览器应用的基础吧 2

父节点使用css的transform: translate(0, 0)时position:fixed在chrome浏览器中无效

今天在做移动端的页面,无意间发现了一个Chrome浏览器下的一个bug,在使用CSS3的transform: translate(0, 0)属性对节点A进行位置转化,此时A节点下面有一个字节点B,节点B使用了position:fixed进行了定位,按照常理节点B应该悬挂在浏览器窗口视图上,不会跟随滚动条而滚动的,但是这个效果在Chrome浏览器下面是无效的,经过测试在IE11.Firefox.safari中均没有问题,在Opera中出现的效果和Chrome中完全一样. 总结一下:在Chrome和

无法在Chrome浏览器中查看SCCM SSRS报告

小编一直热衷于在Chrome浏览器,总感觉Chrome浏览器都比其他浏览器好使,最近在玩SCCM的报表,于是就使用该浏览器访问SCCM报告.但是当我访问报告时,报告根本没有显示出来.我无法在Chrome浏览器中查看SCCM SSRS报告.SSRS代表SQL Server报告服务.这里记录更多有关SSRS的信息.尽管这是Chrome浏览器的问题,但是Firefox和Internet Explorer中的报告都很好.   Configuration Manager中的报告提供了一组工具和资源.这些帮

渗透技巧——导出Chrome浏览器中保存的密码

0x00 前言 在后渗透阶段,获得权限后需要搜集目标系统的信息.信息越全面,越有助于进一步的渗透.对于Windows系统,用户浏览器往往包含有价值的信息. 在之前的文章<本地密码查看工具LaZagne中的自定义脚本开发>曾介绍过利用LaZagne导出多个浏览器密码的方法. 本文将要针对Chrome浏览器,介绍具体的导出原理和利用方法,解决一个实际问题: 如何导出另一系统下Chrome浏览器中保存的密码? 0x01 简介 本文将要介绍以下内容: ·Chrome浏览器保存密码的方式 ·如何导出Ch

【F12】chrome浏览器中 F12 功能的简单介绍

chrome浏览器中 F12 功能的简单介绍 由于F12是前端开发人员的利器,所以我自己也在不断摸索中,查看一些博客和资料后,自己总结了一下来帮助自己理解和记忆,也希望能帮到有需要的小伙伴,嘿嘿! 首先介绍Chrome开发者工具中,调试时使用最多的三个功能页面是:元素(ELements).控制台(Console).源代码(Sources),此外还有网络(Network)等. 元素(Elements):用于查看或修改HTML元素的属性.CSS属性.监听事件.断点等. 控制台(Console):控制

Chrome浏览器中onunload有时候没反应怎么办

Chrome浏览器中,onunload事件触发后,alert()和confirm()等对话框不允许再弹出,直接用return返回内容就好了 onunload换成onbeforeunload 使用 window.onbeforeunload = han; function han() { return "您确定要离开吗?"; } 原文地址:https://www.cnblogs.com/caimengting/p/11865679.html

关于 Chrome 浏览器中 onresize 事件的 Bug

我在写插件时用到了 onresize 事件,在反复地测试后发现该事件在 Chrome 及 Opera(内核基本与 Chrome 相同,以下统称 Chrome)浏览器打开时就会执行,这种情况也许不能算作 bug 吧,估计他们的工程师认为浏览器打开时也算窗口发生了变化.解决问题之前我搜索了相关内容,确实有关于 Chrome 的 onresize 的问题,但跟我遇到的问题还有很大不同.我把这个问题抽象为以下函数: function init() { alert('a'); window.onresiz

Chrome浏览器获取XPATH的方法----通过开发者工具获取

还在为xpath的正确性而犯愁吗?难道必须得装一个Firefox浏览器,安装一个插件? No!!!!!!! 有了chrome浏览器,照样能获取xpath,而且保证正确. 具体的使用方法?请往下看. chrome有自己的开发者工具,可以用这儿来直接获取xpath,都不用担心正确性了. 具体使用步骤如下: 1.在chrome浏览器的右上角有个选择菜单,也就是这个,点一下: 2.在列表最后面有个"更多工具",点击一下,就可以看到开发者工具了. 3.打开开发者工具后,点击开发者工具中第一行的第