如何使用canvas绘制椭圆,扩展非chrome浏览器中的ellipse方法
这篇博文主要针对浏览器中绘制椭圆的方法扩展。在网上搜索了很多,发现他们绘制椭圆的方式都有缺陷。其中有压缩法,计算法,贝塞尔曲线法等多种方式。但是都不能很好的绘制出椭圆。所有我就对这个绘制椭圆的方式进行了研究,发现压缩法是可以完美实现椭圆绘制的。废话不多说,直接上代码了。
if (!CanvasRenderingContext2D.prototype.ellipse) {
CanvasRenderingContext2D.prototype.ellipse = function(x, y, radiusX, radiusY, rotation, startAngle, endAngle,
anticlockwise) {
var r = radiusX > radiusY ? radiusX : radiusY; //用打的数为半径
var scaleX = radiusX / r; //计算缩放的x轴比例
var scaleY = radiusY / r; //计算缩放的y轴比例
this.save(); //保存副本
this.translate(x, y); //移动到圆心位置
this.rotate(rotation); //进行旋转
this.scale(scaleX, scaleY); //进行缩放
this.arc(0, 0, r, startAngle, endAngle, anticlockwise); //绘制圆形
this.restore(); //还原副本
}
}
这里给解释一下别的博文里面中的压缩法为啥不正确.下面我抄袭别人一段代码,来解析一下为啥错误.
<!DOCTYPE html>
<html>
<head lang="en">
<meta charset="UTF-8">
<title>椭圆</title>
</head>
<body>
<canvas id="canvas" style="border:1px solid #aaa;display:block;margin:50px auto;">
当前浏览器不支持Canvas,请更换浏览器后再试
</canvas>
<script>
var canvas = document.getElementById("canvas");
canvas.width = 600;
canvas.height = 600;
var context = canvas.getContext("2d");
context.lineWidth = 10;
context.strokeStyle="black";
EvenCompEllipse(context, 130, 200, 100, 20); //椭圆
function EvenCompEllipse(context, x, y, a, b){
context.save();
//选择a、b中的较大者作为arc方法的半径参数
var r = (a > b) ? a : b;
var ratioX = a / r; //横轴缩放比率
var ratioY = b / r; //纵轴缩放比率
context.scale(ratioX, ratioY); //进行缩放(均匀压缩)
context.beginPath();
//从椭圆的左端点开始逆时针绘制
context.moveTo((x + a) / ratioX, y / ratioY);
context.arc(x / ratioX, y / ratioY, r, 0, 2 * Math.PI);
context.closePath();
context.stroke();
context.restore();
};
</script>
</body>
</html>
他绘制的效果如下

为什么会出现这种情况呢.因为他在绘制的时候先绘制了,然后才还原.这样的话是压缩的一个路径,在绘制的时候就会连线条也进行压缩.而我的那段代码中并没有直接进行绘制.而是进行了还原操作.下面我给一段示例代码.大家可以直接进行试验.
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>canvas绘制椭圆</title>
</head>
<body>
<canvas id="canvas" width='500' height='500'></canvas>
<script>
if (!CanvasRenderingContext2D.prototype.ellipse) {
CanvasRenderingContext2D.prototype.ellipse = function(x, y, radiusX, radiusY, rotation, startAngle, endAngle,
anticlockwise) {
var r = radiusX > radiusY ? radiusX : radiusY; //用打的数为半径
var scaleX = radiusX / r; //计算缩放的x轴比例
var scaleY = radiusY / r; //计算缩放的y轴比例
this.save(); //保存副本
this.translate(x, y); //移动到圆心位置
this.rotate(rotation); //进行旋转
this.scale(scaleX, scaleY); //进行缩放
this.arc(0, 0, r, startAngle, endAngle, anticlockwise); //绘制圆形
this.restore(); //还原副本
}
}
var ctx = document.getElementById("canvas").getContext("2d");
ctx.beginPath();
ctx.ellipse(300, 300, 150, 100, 30 * Math.PI / 180, 0, Math.PI * 2);
ctx.lineWidth = 10; //设定线宽为10
ctx.stroke();
ctx.closePath();
</script>
</body>
</html>
实际效果如下:

由此可见,其实压缩法是完全可以实现椭圆绘制的.只是大部分博文里面使用的都不太对而已.
如果觉得我这种方式不是你想要的的,也可以参考:https://www.cnblogs.com/fangsmile/p/9923532.html
如果 你觉得我的方式对的话,希望你能够进行转发.让更多的人知道这种绘制椭圆的方法.谢谢.
原文地址:https://www.cnblogs.com/flybeijing/p/canvas_ellipse.html
如何使用canvas绘制椭圆,扩展非chrome浏览器中的ellipse方法的更多相关文章
- 将Chrome浏览器中的扩展程序导出为crx插件文件
将Chrome浏览器中安装的插件程序导出为crx插件文件 以360急速浏览器为例进行导出crx插件程序 1.在Chrom商店中找到需要的插件,安装到浏览器的扩展程序里面()IDM Integratio ...
- Google Chrome浏览器中如何使用命令
Google Chrome浏览器中如何使用命令 | 浏览:2974 | 更新:2014-02-23 23:12 | 标签:chrome 1 2 3 分步阅读 Google Chrome浏览器有很多的特 ...
- 使用Chrome浏览器设置XX-net的方法
以下介绍使用Chrome浏览器设置XX-net的方法 1.下载并安装谷歌浏览器. 2.打开https://github.com/XX-net/XX-Net/blob/master/code/d ...
- 在Chrome浏览器中保存的密码有多安全?
本文由 伯乐在线 - 黄利民 翻译.未经许可,禁止转载!英文出处:howtogeek.欢迎加入翻译组. [2013-08-09 更新]:最近又开始讨论“Chrome浏览器明文保存密码这个话题了,国外一 ...
- Jmeter在chrome浏览器中录制脚本
利用blazemeter插件可以录制chrome浏览器中的操作,并生成jmx文件,导入到jmeter中使用 1. 下载blazemeter 地址:https://pan.baidu.com/s/1V ...
- 【js】IE、FF、Chrome浏览器中的JS差异介绍
如何判断浏览器类型 转:http://www.cnblogs.com/carekee/articles/1854674.html 1.通过浏览器特有的对象 如ie 的ActiveXObject ff ...
- 去掉chrome浏览器中input获得焦点时的带颜色边框呢
可以设置表单控件的outline属性为none值, 来去掉Chrome浏览器中输入框以及其它表单控件获得焦点时的带颜色边框. css代码如下: input{outline:none}
- [转]chrome浏览器中 F12 功能的简单介绍
本文转自:https://www.cnblogs.com/zhuzhubaoya/p/9758648.html chrome浏览器中 F12 功能的简单介绍 由于F12是前端开发人员的利器,所以我自己 ...
- 查看 chrome 浏览器中的 Headers
查看 chrome 浏览器中的 Headers, Response 信息:
随机推荐
- CBE引擎概览
摘录于CBE官方文档:https://www.comblockengine.com/docs/1.0/overview/index/ 架构图总览: Switch Fabric:交换机网络,根据网络环境 ...
- echarts 如何去掉折线上的小圆点
series:[{ symbol:none; //去掉折线上的小圆点 type:line; name:seriesName; data:seriesData }]
- 生产环境实践:Cana实现MySQL到ES实时同步
注:由于文章篇幅有限,完整文档可扫下面二维码免费获取,更有深受好评的大数据实战精英+架构师好课等着你. 速点链接加入高手战队:http://www.dajiangtai.com/course/112. ...
- 拓扑排序 判断给定图是否存在合法拓扑序列 自家oj1393
//拓扑排序判断是否有环 #include<cstdio> #include<algorithm> #include<string.h> #include<m ...
- java 快捷表达式
:: 和 -> 主要说这两个,这个好像也叫:Lambda表达式 但我不知道对不对,就先叫他 “快捷表达式“,顾名思义:使用它,可以省很多代码,可以用来装X,但不便于阅读. 这种东西呢,虽 ...
- 【游戏体验】I Paid For It!(火柴人破坏狂)
>>>点此处可试玩无敌版<<< 注意,本游戏含有少量暴力元素,13岁以下的儿童切勿尝试本款游戏 这款游戏打击感非常高,动画也比较绚丽,可玩性很高 个人测评 游戏性 ...
- SpringBoot 各层之间的关系
SpringBoot 各层之间的关系 SpringBoot 分为四层:controller层.service层.dao层.entity层. entity层:和 model 层一样,存放的是实体类,属 ...
- STA之RC Corner拾遗
Q:还有一种RC corner 带后缀『_T』,只用于setup signoff,T指的是什么? A:T代表tighten,在rc的variation上的sigma分布比不带T的更紧,因此只能用于se ...
- input file弹出框选择文件后缀限制
在页面选择文件时的弹出框默认显示的是所有类型的文件,有时候文件太多不好选择,我们就要过滤掉不想展示的文件,这是需要用到input的accept属性,只有在type="file"才有 ...
- Hadoop3.1.1架构体系——设计原理阐述与Client源码图文详解 : 总览
一.设计原理 1.Hadoop架构: 流水线(PipeLine) 2.Hadoop架构: HDFS中数据块的状态及其切换过程,GS与BGS 3.Hadoop架构: 关于Recovery (Lease ...