哎,本来挺相信微信后台文章自动保存功能的,结果前几天写了一篇文章没保存,郁闷!

言归正传

Canvas 可以利用这几种方式绘制图形:

1、使用 lineTo 画直线;

2、使用 rect 画矩形 使用 canvas 画矩形,实现橡皮擦功能;

3、使用 arc、arcTo 画弧线;

4、使用 quadraticCurveTo,bezierCurveTo 画曲线;

通过这四种方式的不同组合,可以实现任意图形的绘制。绘制直线和矩形比较简单,但是绘制曲线就难了,比如绘制下面这几个图形:

这背后的关键知识是「数学」,我们后面慢慢聊。

先学习下画直线。Canvas 画图形需要注意几点:

1、绘制之前需要设置一个绘制的起点,表明图形要在画布的那个位置开始;

2、一个图形可能会由多个子图形组成,在开始画的时候要调用 beginPath 告诉 Canvas 要开始绘制图形了;

3、期间可以绘制各种图形;

4、调用 stroke 开始绘制,绘制之前可以设置图形的属性,比如 strokeStyle、透明度、线条宽度、顶点之间连接样式等;

下面的例子是画一条直线:

// 绘制一根线
const drawLine = (ctx: CanvasRenderingContext2D) => {// 不调用 beginPath 会有意想不到的结果ctx.beginPath();// 移动移动到某个位置,可以作为绘图的起点,或者绘制之间不连接的 path// 线宽ctx.lineWidth = 30;// 线顶点的样式 'butt', 'round', 'square'// butt 默认样式,不会导致线变长// round 圆头,会导致两顶点处的线变长 lineWidth/2// square 方头,会导致两顶点处线变长 lineWidth/2ctx.lineCap = 'round';// 在画线的过程中需要注意最终线被画到了那个区域ctx.moveTo(80, 120);// lineTo 画一条直线ctx.lineTo(320, 120);ctx.stroke();
}

大家需要留意下这条线最终的位置。

我们再看下绘制弧,Canvas 提供了两种方法 :

arc(x: number, y: number, radius: number, startAngle: number, endAngle: number, anticlockwise?: boolean): void;

x:圆心在 x 轴的坐标;

y:圆心在 y 轴的坐标;

radius:圆半径;

startAngle:起始弧度值;

endAngle:结束弧度值;

anticlockwise:是否为时钟方向,false 顺时针, true 逆时针;

先来回忆下数学知识:

弧长等于半径的弧,其所对的圆心角为一弧度;

圆的弧长为 2πr,一个圆的弧度为 2πr / r = 2π,π为圆周率,约为 3.14, 2π = 2*3.14=6.28;

1π 为 180度,1度 = π / 180, 1弧度 = 180 / π;

理解了上面的知识,我们使用代码进行绘制:

const drawArcs = (ctx: CanvasRenderingContext2D) => {// arc(x, y, radius, startAngle, endAngle, counterclockwise)ctx.beginPath();// false 顺时针 true 逆时针// 弧度和角度// 弧度是角的度量单位// 弧长等于半径的弧,其所对的圆心角为一弧度// 弧度表示:弧长与半径长相等所对应的角度// 圆的弧长为 2πr,一个圆的弧度为 2πr / r = 2π,π为圆周率,约为 3.14 2π = 2*3.14=6.28// 1π 为 180度,1度 = π / 180, 1弧度 = 180 / π// 起点为 3 点钟方向// 画一弧度// ctx.arc(80, 160, 40, 0, 1, false); // Outer circle// 画 90 度// ctx.arc(80, 160, 40, 0, Math.PI / 180 * 90);ctx.arc(80, 160, 40, 0, Math.PI / 180 * 360, false);// 如何才能让起点为 12 点钟方向// ctx.arc(80, 160, 40, Math.PI / 180 * 270, Math.PI / 180 * 180, false);ctx.stroke();
}

arcTo(x1: number, y1: number, x2: number, y2: number, radius: number): void;

这个 API 主要用来解决给定两点绘制一段弧,比如绘制一个矩形的圆角,理解起来比较抽象,下节内容说吧。原理其实是这样的:

长按关注

素燕《前端小课》

帮助 10W 人入门并进阶前端

官网:https://lefex.gitee.io/

把数学学好才能画好图形相关推荐

  1. python画方波_今天学会傅里叶画画,明天就是初音未来 - 如何用Python和Blender画任意图形...

    前言: 最近在[编程德鲁伊]的[傅里叶级数可视化]章节中,练习了傅里叶级数基础原理的可视化,演示了周期方波曲线,可以分解为一系列正弦波曲线: 这次拿学到的知识做个实验,试试喜闻乐见的[用傅里叶级数画画 ...

  2. 用python画叶子_今天学会傅里叶画画,明天就是初音未来 - 如何用Python和Blender画任意图形...

    前言: 最近在[编程德鲁伊]的[傅里叶级数可视化]章节中,练习了傅里叶级数基础原理的可视化,演示了周期方波曲线,可以分解为一系列正弦波曲线: 这次拿学到的知识做个实验,试试喜闻乐见的[用傅里叶级数画画 ...

  3. 画函数图形的C#程序(改进版) (转)

    我在10月份发表过一篇随笔"画函数图形的C#程序,兼论一个病态函数",在那篇随笔中写道: 这个画函数图形的C#程序有一个严重的缺点,就是函数表达式是直接写的源程序中的,不能象Sci ...

  4. 初中位似图形作图_[如何画位似图形] 位似图形的画法及步骤

    如何画位似图形 位似变换是新课程标准中涉及的一个重要知识点,它是图形变换的一种,实际上它是相似变换的一种特殊情形,存在位似中心---即对应顶点连线的交点.其位似比就是相似比.作为一个新的知识点,越来越 ...

  5. 用java的事件监听机制实现一个简单的画板应用:通过选择图形按钮和颜色按钮来画出自己想画的图形:直线、空心矩形、圆形、折线、多边形、圆角矩形、弧线、曲线、喷枪

    今天做一个简单的画板,完整代码附在文章末尾处. - 功能:通过选择图形按钮和颜色按钮来画出自己想画的图形. - 界面展示: - 思路: 1.做一个可视化界面:创建JFrame对象,并设置Title.S ...

  6. 素描中的西红柿静物,这种画法才能画出果肉质感~

    西红柿是素描静物中非常有质感的静物,很多同学总是画不出西红柿的质感,那么本期,美术集网校小编就给大家讲解一下如果画出西红柿光滑表面果肉饱满的感觉吧~ 素描中的西红柿静物,这种画法才能画出果肉质感~ 素 ...

  7. 手怎么画?怎样才能画好人物的手部?

    手怎么画?怎样才能画好人物的手部?画好人物的手部有哪些技巧?想必这些问题都是绘画初学者们比较伤脑筋的问题,那么到底怎样才能画好动漫人物的手部呢?今天奇奇君就在网络上收集整理了关于手怎么画?手部姿势的画 ...

  8. 放肆地使用UIBezierPath和CAShapeLayer画各种图形

    CAShapeLayer 是 CALayer 的子类,但是比 CALayer 更灵活,可以画出各种图形,当然,你也可以使用其他方式来画,随你. 杂谈 在 CAShapeLayer 中,也可以像 CAL ...

  9. 放肆的使用UIBezierPath和CAShapeLayer画各种图形

    CAShapeLayer 是 CALayer 的子类,但是比 CALayer 更灵活,可以画出各种图形,当然,你也可以使用其他方式来画,随你. 杂谈 在 CAShapeLayer 中,也可以像 CAL ...

最新文章

  1. 用看板工具leangoo做需求管理,公开看板分享
  2. java设计模式---职责链模式
  3. 区块链BaaS云服务(21)腾讯CCGP”安全沙箱“
  4. 【C++grammar】格式化输出与I/O流函数
  5. python时域信号特征提取(各种因子)
  6. linux系统挂载NTFS格式文件系统
  7. 你还在生产环境改代码么?函数计算版本管理(三)使用别名进行灰度发布...
  8. Zoox 的自动驾驶汽车方法
  9. 会考计算机辅助制图,信息技术会考基础知识
  10. html怎么清除背景颜色,怎么去除Word复制网页内容的背景色?
  11. 如何在jsp中写一个弹窗
  12. 解决封号 Walmart最全申诉步骤
  13. 一只喵的西行记-8 魔法猫堡
  14. 全球化观点的生产模式
  15. 环境监测调查无人船OES120
  16. 这是烙印,是成长的陪伴,是归属
  17. JAVA实木商城开发,单品模式
  18. 从零到精通SVM之超平面求解和松弛变量
  19. 利用COORD软件进行坐标七参数转换
  20. Hello, .NET微软技术广州俱乐部

热门文章

  1. Oracle-安装客户端和服务端
  2. U盘装系统(Linux)
  3. linux kernel X-tranx-Y : Ethernet-to-Gadget
  4. spring中的loc和aop
  5. 中职计算机英语视频,中职计算机微课视频一等奖(中职英语微课)
  6. AtCoder Beginner Contest 172 总结
  7. 安卓View — View (一)
  8. xtrabackup 命令详解
  9. docker学习笔记2--docker镜像命令
  10. 数据结构C语言 胡学钢 PDF,数据结构(C语言版) 胡学钢.ppt