广告
返回顶部
首页 > 资讯 > 前端开发 > JavaScript >如何使用lineTo/arc/bezierCurveTo画椭圆形
  • 647
分享到

如何使用lineTo/arc/bezierCurveTo画椭圆形

2024-04-02 19:04:59 647人浏览 安东尼
摘要

这篇“如何使用lineTo/arc/bezierCurveTo画椭圆形”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获

这篇“如何使用lineTo/arc/bezierCurveTo画椭圆形”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“如何使用lineTo/arc/bezierCurveTo画椭圆形”文章吧。

canvas中可以很方便的用arc方法画出圆形,本来圆形也可以看作是一个宽高相等的椭圆,但canvas中根本没有画椭圆的方法,我们要用其他方法来模拟。

我们首先要明确画一个椭圆需要那些参数,基本的几何知识告诉我们,椭圆需要圆心坐标,宽度,高度——或者还有旋转角度,不过这个可以暂时不要,旋转是比较容易的。

1,使用lineTo画椭圆

你没有看错,lineTo这样一个纯粹用来画直线的方法居然可以用来画椭圆!?但他确实存在,不过写法实在是有些不可思议:

复制代码 代码如下:

function DrawEllipse(Canvas,O,OA,OB){

//画椭圆,例子:var B=new Array(150,150); DrawEllipse(hb,B,50,30);

with (Canvas){

var x=O[0]+OA;

var y=O[1];

moveTo(x,y);

for (var i=0;i<=360;i++){

var ii=i*Math.PI/180;

var x=O[0]+OA*Math.cos(ii);

var y=O[1]-OB*Math.sin(ii);

lineTo(x,y);

}

}

}

这个方法的原理是,一个圆有360度,那么就用lineTo循环360次,画出每一度的线段,最终连成一个椭圆。其中需要用到三角函数正弦余弦进行计算。

注意,这个方法的第2个参数是个数组,即椭圆的圆心坐标.

思路很奇葩,而且画出的椭圆也比较平滑。但不值得大家使用&mdash;&mdash;此方法每画一个椭圆,就要循环360次,只有画的椭圆稍微一多,对浏览器的性能就是个考验。

我们只用了解一下他的思路即可

2,使用arc画圆,然后把他缩放成一个椭圆

这个方法的原文在此,核心函数如下:

复制代码 代码如下:

var canvas = document.getElementById('myCanvas');

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

var centerX = 0;

var centerY = 0;

var radius = 50;

// save state

context.save();

// translate context

context.translate(canvas.width / 2, canvas.height / 2);

// scale context horizontally

context.scale(2, 1);

// draw circle which will be stretched into an oval

context.beginPath();

context.arc(centerX, centerY, radius, 0, 2 * Math.PI, false);

// restore to original state

context.restore()

此方法用了一个我前面还没讲过的canvas函数,即scale,他能实现canvas的缩放。缩放有水平和垂直两个方向,代码中把canvas水平方向放大了,而垂直方向不变,so,原来arc画出的圆形就变成了一个椭圆。

这个方法初看甚妙,代码少,而且原理浅显易懂。但分析一下就能发现他的明显缺点了,就是&mdash;&mdash;不精确!比如我需要宽171高56的椭圆,此时我们如果把arc的半径定为28的话,那么后面就要为171/28/2这个蛋疼的不知所云的数字郁闷了。

不过有个折中的办法是始终把arc的半径设成100,然后,不够就放大,超过了就缩小。但是,还是不精确。

3,使用贝赛尔曲线bezierCurveTo

自从觉得上面的缩放法不精确后,我就很想找到一个精确的画椭圆的方法,最后在stackoverflow上找到了:

复制代码 代码如下:

function drawEllipse(ctx, x, y, w, h) {

var kappa = 0.5522848;

ox = (w / 2) * kappa, // control point offset horizontal

oy = (h / 2) * kappa, // control point offset vertical

xe = x + w, // x-end

ye = y + h, // y-end

xm = x + w / 2, // x-middle

ym = y + h / 2; // y-middle

ctx.beginPath();

ctx.moveTo(x, ym);

ctx.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y);

ctx.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym);

ctx.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye);

ctx.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym);

ctx.closePath();

ctx.stroke();

}

这个方法可以算是比较完美的了。他把一个椭圆分成了4条贝塞尔曲线,用他们连成了一个椭圆。最后宽度高度也比较精确,开销也较少。

但此方法依然有缺点。大家看那个kappa参数,有个很奇特的值,相信很多人在几何专家告诉你为什么他要取这个值之前,都不明白为什么非要取这个值&mdash;&mdash;我到现在还是不知道。并且我有很强烈的想把他改一下看看有什么后果的冲动。

当然我这种类似强迫症患者的冲动并不能说成是此方法的缺点,他真正的缺点是&mdash;&mdash;为什么要用4条贝塞尔曲线?我个人觉得,一个椭圆明显是由两条贝塞尔曲线组成的而不是4条。这个想法最终让我找到了最完美的画椭圆的方法。

 4,使用两条贝赛尔曲线画出椭圆

为了了解上一个方法能否精简,我专门注册了一个stackoverflow的帐号去提问,由于问题里有图片,积分不够不能传,我还迫不得已用勉勉强强的英语水平去回答老外的问题挣积分。但最终好运到了,回答一个问题就解决了我的积分问题。

我提的贝赛尔曲线和椭圆的关系的问题在此.

说实话,下面老外的回答我大部分没看懂,但幸亏他提供了一个代码示例页,让我明白了原理,在此对他表示再次的感谢。而根据他的解答,我找到的画椭圆的方法如下:

复制代码 代码如下:

//椭圆

CanvasRenderinGContext2D.prototype.oval = function (x, y, width, height) {

var k = (width/0.75)/2,

w = width/2,

h = height/2;

this.beginPath();

this.moveTo(x, y-h);

this.bezierCurveTo(x+k, y-h, x+k, y+h, x, y+h);

this.bezierCurveTo(x-k, y+h, x-k, y-h, x, y-h);

this.closePath();

return this;

}

此方法既精确,又代码少,而且也没有奇怪的难懂的地方。只需要记住这一点,椭圆的宽度与画出椭圆的贝赛尔曲线的控制点的坐标比例如下:

贝塞尔控制点x=(椭圆宽度/0.75)/2这一点已经在代码中体现了。

以上就是关于“如何使用lineTo/arc/bezierCurveTo画椭圆形”这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注编程网JavaScript频道。

--结束END--

本文标题: 如何使用lineTo/arc/bezierCurveTo画椭圆形

本文链接: https://www.lsjlt.com/news/95980.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 如何使用lineTo/arc/bezierCurveTo画椭圆形
    这篇“如何使用lineTo/arc/bezierCurveTo画椭圆形”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获...
    99+
    2022-10-19
  • html5如何使用lineTo/arc/bezierCurveTo画椭圆形
    这篇文章主要介绍html5如何使用lineTo/arc/bezierCurveTo画椭圆形,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!1,使用lineTo画椭圆 你没有看错,lin...
    99+
    2022-10-19
  • 如何使用SVG中<ellipse>元素画椭圆
    这篇文章将为大家详细讲解有关如何使用SVG中<ellipse>元素画椭圆,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。SVG <ellipse>元...
    99+
    2022-10-19
  • 如何使用SVG画圆形
    小编给大家分享一下如何使用SVG画圆形,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!SVG  <circle&g...
    99+
    2022-10-19
  • css3动画如何使圆形旋转
    今天小编给大家分享一下css3动画如何使圆形旋转的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。css3动画使圆形旋转的方法:...
    99+
    2023-07-05
  • 如何使用css3实现椭圆轨迹旋转
    这篇文章主要介绍如何使用css3实现椭圆轨迹旋转,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完! css3实现椭圆轨迹旋转最近需要实现如下效果最开始用css...
    99+
    2022-10-19
  • html5如何调用绘图api画简单的圆形
    这篇文章将为大家详细讲解有关html5如何调用绘图api画简单的圆形,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。 代码如下:<!DOCTYPE htm...
    99+
    2022-10-19
  • 如何利用CSS3动画实现圆形动态时钟
    小编给大家分享一下如何利用CSS3动画实现圆形动态时钟,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧! 什么是动画?这是我们应该先了解的问题。按照百度百科的解释动画是采用逐帧拍摄对...
    99+
    2022-10-19
  • html5如何使用canvas画空心圆与实心圆
    这篇文章主要为大家展示了“html5如何使用canvas画空心圆与实心圆”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“html5如何使用canvas画空心圆与实...
    99+
    2022-10-19
  • 如何使用HTML5Canvas绘制圆角矩形
    这期内容当中小编将会给大家带来有关如何使用HTML5 Canvas绘制圆角矩形,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。圆角矩形是由四段线条和四个1/4圆弧组成,拆解...
    99+
    2022-10-19
  • 如何使用纯CSS画一个圆环
    这篇文章主要介绍如何使用纯CSS画一个圆环,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!画圆环思想很简单:首先画两个圆,设置不同的背景色;然后让两个圆的圆心重合即可。难度系数☆☆HTML<div cl...
    99+
    2023-06-14
  • 如何使用CSS画心形
    如何使用CSS画心形?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。1.一颗div一颗心用一个div画出一个心,核心的方法就是使用伪元素。首先,我们在页面上先写出一个div:&l...
    99+
    2023-06-08
  • 如何使用Python画几何图形动画
    要使用Python来绘制几何图形动画,你可以使用一些库来帮助你完成这个任务,如matplotlib、pygame或turtle。下面...
    99+
    2023-08-20
    Python
  • 如何使用纯CSS实现圆形图像?
    小编给大家分享一下如何使用纯CSS实现圆形图像?,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!   SS可以实现网页中的很多效...
    99+
    2022-10-19
  • 如何使用CSS实现圆形进度条
    这篇文章主要介绍了如何使用CSS实现圆形进度条,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。   首先一个父级div设置相对定位,内部含有...
    99+
    2022-10-19
  • Android如何使用圆形揭露动画巧妙地隐藏或显示View详解
    目录1.引言2.圆形揭露动画简介3.使用圆形揭露动画隐藏或显示View3.1 简易布局3.2 使用圆形揭露动画隐藏View3.3 使用圆形揭露动画显示View4.总结1.引言 在开发...
    99+
    2022-11-13
  • 如何使用css画三角形
    本篇内容主要讲解“如何使用css画三角形”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何使用css画三角形”吧! 用纯css画个...
    99+
    2022-10-19
  • 如何使用SVG 画多边形
    这篇文章主要讲解了“如何使用SVG 画多边形”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何使用SVG 画多边形”吧!一、 Polygon 画多边形简单的...
    99+
    2022-10-19
  • C#如何使用OpenCV剪切图像中的圆形和矩形
    这篇文章主要介绍“C#如何使用OpenCV剪切图像中的圆形和矩形”,在日常操作中,相信很多人在C#如何使用OpenCV剪切图像中的圆形和矩形问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C#如何使用OpenC...
    99+
    2023-06-07
  • 如何使用html5绘制圆形多角图案
    本篇文章为大家展示了如何使用html5绘制圆形多角图案,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。先看看最简单的效果图:代码如下:JavaScript Code复...
    99+
    2022-10-19
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作