专栏首页重庆的技术分享区HTML5-Canvas之矩阵和多边形的绘制(2)

HTML5-Canvas之矩阵和多边形的绘制(2)

上篇文章我们了解了canvas的定义、获取和基础的绘图操作,其中的绘图功能我们讲解了线段绘制、上色、描边等方面知识点。

今天我们来讲讲矩形(Rectangle)和多边形的绘制。

矩形的绘制一共有两个口令,分别是 ctx.fillRect(x, y, width, height) 和 ctx.strokeRect(x, y, width, height) ,参数中的 x 和 y 依旧表示需绘制的矩形的起始点坐标(相对canvas原点),width 和 height表示需绘制的矩形宽高。 而 fillRect 表示绘制一个实心矩形,strokeRect 表示绘制一个描边矩形,我们来一个简单的例子:

效果如下


你也可以使用 Rect( x, y, width, height ) 的方法创建矩形路径,之后再通过 .stroke() 或 .fill() 方法来给矩形上色:

效果如下


上方我们绘制了两个默认黑色的实心和描边矩形,相信你也联想到上一章我们绘制线段时,若没有定义strokeStyle,则线段也是默认为黑色的事情。那么我们要给这俩矩形上色,或许你也会联想到应当使用 *Style 来处理,而这想法也是正确的。

在canvas上,给实心对象上色可以用 fillStyle 来定义,给描边对象上色我们可以用 strokeStyle来定义,它们的赋值均为 color|gradient|pattern ,在上章我们已经细说过,这里不再赘述。

那么我们来给上方绘制了的实心矩形填充一个放射状渐变(黄-蓝-红),将描边矩形的描边设为绿色。我们可以这样做:

效果如下

这里要提到的是上一次没有仔细介绍过的放射状渐变方法 createRadialGradient ,其语法为

ctx.createRadialGradient( Xstart, Ystart, Radiusstart, Xend, Yend, Radiusend )

其中前三个参数表示渐变起始圆形的中心坐标和半径,后三个参数表示渐变结束圆形的中点坐标和半径。

或许你会被这里的“半径”迷惑,回顾我们上章学习的createLinearGradient,它的参数并没有“半径”的概念,如果你是一名平面设计师,你更可能觉得放射状渐变只需要起始点和结束点坐标就可以了(毕竟PS/AI中的径向渐变只需要这两个点)。

但canvas在这里加入的“半径”参数还是有一定作用的,可以创造出比PS中径向渐变稍微复杂一些的效果。

⑴ 我们先来一个最简单最好理解的例子:

我们设置起始圆和结束圆中点相同,且起始圆半径为0,那么它的渐变线就是从两圆的中点开始到结束圆的边缘结束。我们设置渐变线结束点颜色透明度为0是为了方便查看结束圆的边界。效果如下:

⑵ 我们在⑴的基础上将起始圆的半径设为20,代码和效果图如下:

⑶ 我们在⑵的基础上挪动起始圆的中点,不要让它跟结束圆的中点重叠,代码和效果图如下:

注意我们在定义RadialGradient时,要尽量避免起始圆的范围超出结束圆的范围(起始圆最好是结束圆内部的一个真子集),否则绘制出来的效果会出现无法预知的错误,例如下面的代码:

不过如果你掌握了RadialGradient上色原理,倒是可以随意定位起始圆和结束圆的方位和大小。我从TimeLangoliers的博客(点击查看出处)看到这张原理图:

他还依照此原理图写了一个例子:

至此我们学习了通过 fillRect 和 strokeRect 来绘制矩形,下面再讲一个Rect相关的功能——clearRect。

clearRect类似PS中的方块橡皮擦,可以擦除画布上任意一块矩形区域的内容,其语法如下:

ctx.clearRect( x, y, width, height );

其中 x 和 y 表示起始点坐标,width 和 height 表示这块“橡皮擦”的宽高。举个例子:

注意clearRect不会清除掉之前定义过的样式、画笔位置等绘制信息,打个比方,有时候我们需要清空整个画布,我们可以这样做:

这个方法是通过重置画布大小,从而触发清空画布事件,但前面定义的 fillStyle=”blue” 也被清空掉了,从而绘制了一个黑色的矩形:

如果不想清除掉之前定义的样式,我们可以通过clearRect来实现:

执行结果如下:


最后聊一下多边形的绘制,其实现非常简单,先来个例子:

可见我们这里通过lineTo绘制了多边形的每条边(注意起点跟终点是同一个坐标),然后通过 stroke() 来描边、fill() 来填充,其执行效果如下:

眼尖的朋友会发现该多边形左上角的俩条描边没有接在一起,这是因为我们没有把这个多边形路径闭合起来,我们可以通过 ctx.closePath() 来解决这个问题:

眼尖的朋友会发现该多边形左上角的俩条描边没有接在一起,这是因为我们没有把这个多边形路径闭合起来,我们可以通过 ctx.closePath() 来解决这个问题:

这次就到这里,下次再见了!、

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Hydro李天放:为了区块链我曾拒绝了李开复

    区块链大本营
  • 人工智能的革命:人类的死或生(5/10)

    Peter Lu
  • 人工智能的革命:人类的死或生(2/10)

    Peter Lu
  • 像人一样脑补世界!DeepMind历时一年半搞出GQN,登上Science

    量子位
  • 人工智能的革命:通向超级智能之路(上)

    Peter Lu
  • 人工智能的革命:人类的死或生(6/10)

    Peter Lu
  • 人工智能的革命:人类的死或生(1/10)

    Peter Lu
  • 微软开发无人店技术叫阵Amazon Go,以后沃尔玛也能拿了就走?

    量子位
  • 人工智能的革命:人类的死或生(3/10)

    Peter Lu
  • 肯尼亚成立特别小组,研究人工智能和区块链等最新技术;新型比特币现金社交平台BlockPress现世

    区块链大本营

扫码关注云+社区

领取腾讯云代金券