Canvas 学习笔记(二)——基础图形的绘制

韩瑶
• 阅读 2595

距离上一篇已经过去好长段日子了,本来这篇早就该写了,天不遂人愿:笔记本的键盘坏掉了,然后送修了耽误了好几天。

上一篇简单记录了一些Canvas 的基础知识,这一篇迟到的笔记来简单记录一下Canvas 绘制基本图形。

说到基本图形,无非是矩形圆形线段曲线。很多所谓的图案基本都是这几种基本图形组合而成。比如五星 ★ 其实就是几条线段分够填充而组成的图案;圆弧是不闭合的圆形组成的;折线是多条线段连接而成的。

在开始介绍绘制基本图形之前,有必要简单介绍一下Canvas 的坐标系统。坐标系大家都不陌生,中学时候平面坐标系都有学习过,X轴Y轴。在HTML开发中,也存在着平面坐标系Canvas的坐标系统和HTML的坐标系是类似的。有一定的相同的地方,也有不同的地方。

CanvasHTML的坐标系统原点都处于左上角,X轴上向右递增正数,向左递减;Y轴上向下递增为正数,向上递减。但是Canvashtml有一个不同的地方:即Canvas允许我们将原点进行平移,也即通过代码我们可以将Canvas的原点修改到任意位置去,可以不为左上角。 后边的笔记中我会讲讲怎么修改Canvas的坐标系。

关于坐标系统可以看看下面这张我从MDN偷来的图。

Canvas 学习笔记(二)——基础图形的绘制

  1. 绘制矩形

    Canvas为我们提供了三种方法来绘制矩形:

     fillRect(x, y, width, height)   绘制一个填充的矩形
     strokeRect(x, y, width, height) 绘制一个矩形的边框
     clearRect(x, y, width, height) 清除指定矩形区域,让清除部分完全透明 
    

    三个方法都接收4个参数,xy分别代表了要绘制的矩形左上角的坐标位置,widthheight 则分别代表了矩形的宽高尺寸。三个方法虽然都是绘制矩形的,但也有不同的地方:strokeRect是用砖瓦围了一个围墙,我们能看到的是围墙;而fillRect则不仅围了一个围墙,连围墙里面用砖瓦铺平了,我们能到一片的砖瓦;clearRect就有点类似于拆迁大队 拆拆拆,把矩形区域内的东西都拆掉。

    http://codepen.io/YoRolling/p...

  2. 绘制圆

    相对于绘制矩形,绘制圆(圆弧)就简单的多了。只有两个方法 arcarcTo,但根据MDN的说明arcTo的实现不靠谱,我们这里就不对它多做解释。我们来看一下arcTo

    arc(x, y, radius, startAngle, endAngle, anticlockwise)
    

    该方法有五个参数:x,y 为绘制圆弧所在圆上的圆心坐标;radius为半径;startAngle以及endAngle参数用弧度定义了开始以及结束的弧度。参数anticlockwise 为一个布尔值,为true时,是逆时针方向,否则顺时针方向,默认为false,即顺时针。

    来颗板栗吧:

    http://codepen.io/YoRolling/p...

  3. 绘制路径

    Canvas 绘制中最麻烦也是功能最强大的部分就是路径绘制了。 我们都知道两点确定一条直线(线段),路径绘制中运用的就是这个定理。通过一组又一组的两点绘制出各种复杂的图形出来。

    通过路径绘制一个图形基本分为一下几步:

    • 首先,需要将画笔移动到某处。

    • 然后你使用画图命令去画出路径。

    • 之后把路径封闭。

    • 一旦路径生成,你就能通过描边或填充路径区域来渲染图形。
      对应到Canvas的API为以下几个API

    beginPath();
    moveTo(x,y);
    lineTo(x,y);
    closePath();
    fill();
    stroke();
    
    

    创建路径意味着首先我们要告诉Canvas我们接下来要绘制路径(beginPath)了,然后我们将画笔移动到某处moveTo,这里就是两点中的第一个点,接下来我们要确定第二个点了,即lineTo,假设我们只画一个线段,那么接下来我们就要告诉Canvas要结束绘制路径了(closePath);当到这一步的时候我们就可以选择这个图形是什么样的了,是要fill还是stroke

    到这里,你可能会觉得绘制路径好麻烦啊,如果每次绘制路径都要经过这么多步骤的话,那要多麻烦啊。幸运的是,某些情况下Canvas能够为我们自动推测完善一些步骤。

    • 当前路径为空,即调用beginPath()之后,或者canvas刚建的时候,第一条路径构造命令通常被视为是moveTo() ,无论最后的是什么。出于这个原因,你几乎总是要在设置路径之后专门指定你的起始位置。

    • 就是闭合路径closePath(),不是必需的。这个方法会通过绘制一条从当前点到开始点的直线来闭合图形。如果图形是已经闭合了的,即当前点为开始点,该函数什么也不做。

    • 当你调用fill()函数时,所有没有闭合的形状都会自动闭合,所以你不需要调用closePath()函数。但是调用stroke()时不会自动闭合。

    其实,在以上几种之外还有一个更为有用的东西贝塞尔曲线Canvas提供了一次贝塞尔曲线二次贝塞尔曲线 。 这里暂时先不多做介绍,其实是因为我对贝塞尔不熟悉。在稍后回来补充这一点。

Canvas的基本操作方法基本介绍完了,通过合适的组合利用这些API 以及你的创意相信可以创建出非常出彩的效果。

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Python进阶者 Python进阶者
3年前
手把手教你使用CanvasAPI打造一款拼图游戏
一、canvas简介1.canvas是HTML5提供的一种新标签,双标签;2.HTML5 canvas标签元素用于图形的绘制,通过脚本(通常是JavaScript)来完成;3.canvas标签只是图形容器,必须使用脚本来绘制图形;Canvas是一个矩形区域的画布,可以用JavaScript在上面绘画;二、案例目标我们今天的目标是使用HTML5
Jacquelyn38 Jacquelyn38
4年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Stella981 Stella981
3年前
Exceptionless
<divid"cnblogs\_post\_body"class"blogpostbodycnblogsmarkdown"<h1id"exceptionless.netcore开源日志框架"Exceptionless.NetCore开源日志框架</h1<blockquote<p作者:markjiang7m2<b
Wesley13 Wesley13
3年前
View绘制系列(10)
Canvas基础变换前面学习了Canvas相关的一些绘制方法,不知道大家发现没?我们都是根据左上角(0,0)点算出来新的坐标,然后再绘制,这样明显不符合我们平常基于坐标原点绘制的习惯,那么我们能不能直接在原点绘制图形,然后通过操作Canvas来实现移动到目标位置呢?答案是肯定的,这就需要用到Canvas变换方法了。Canvas变
Easter79 Easter79
3年前
Twitter的分布式自增ID算法snowflake (Java版)
概述分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移
Wesley13 Wesley13
3年前
03.Android崩溃Crash库之ExceptionHandler分析
目录总结00.异常处理几个常用api01.UncaughtExceptionHandler02.Java线程处理异常分析03.Android中线程处理异常分析04.为何使用setDefaultUncaughtExceptionHandler前沿上一篇整体介绍了crash崩溃
Wesley13 Wesley13
3年前
HTML5实现绘制几何图形
HTML5新增了一个<canvas.../属性。该元素自身并不绘制图形,只是相当于一张空画布。如果开发者需要向<canvas.../上绘制图形则必须使用JavaScript脚本进行绘制。为了向<canvas.../元素上绘图,必须经过如下3步。获取<canvas.../元素对应的DOM对象,这是一个Canvas对象。调用Canvas对象
Wesley13 Wesley13
3年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
3年前
Android利用Canvas绘图功能来绘制五角星(升级版)
文章目录上一篇问题解决利用Canvas绘图功能来绘制五角星(升级版)过程结果在上一篇文章中,我们利用直线的旋转绘制了五角星。出现了五角星会跑出界面的情况。我们就在这儿解决一下这个问题,并呈现另一种实现方式——函数画五角星。上一篇问题解决利用Canvas实现绘图功
美凌格栋栋酱 美凌格栋栋酱
5个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(