用Canvas实现简单画图(线、三角形、矩形、圆)

简介: 👋因为在B站看到一个小demo是基于canvas写的,非常喜欢,然后上掘金大数据又给我推了 《Canvas 从入门到劝朋友放弃(图解版)》,就像上手一下canvas,本来不想写笔记的,因为《Canvas 从入门到劝朋友放弃(图解版)》自己看了一下挺全的,但本着输入要有输出,所以就有了这篇文章
👋因为在B站看到一个小demo是基于canvas写的,非常喜欢,然后上掘金大数据又给我推了 《Canvas 从入门到劝朋友放弃(图解版)》,就像上手一下canvas,本来不想写笔记的,因为《Canvas 从入门到劝朋友放弃(图解版)》自己看了一下挺全的,但本着输入要有输出,所以就有了这篇文章

参考文章:

https://juejin.cn/post/7116784455561248775>

[]()

简单了解一下Canvas

  • Canvas 是数据可视化在前端方面的基础技术。
  • 是一个可以使用脚本 (通常为JavaScript) 来绘制图形的 HTML 元素

简单上手

[]()

1. 快速上手——画条直线

Snipaste_2022-07-29_19-29-34.png

<body>
    <!--1.创建 canvas 元素-->
    <canvas id="line" width="300" height="200" style="border: 1px solid #ccc"></canvas>
​
    <script>
        //2. 获取canvas对象
        const cnv = document.getElementById("line")
        //3. 获取 canvas 上下文环境对象
        const cxt = cnv.getContext("2d")
        
        //4. 绘制图形
        cxt.moveTo(100,100)//起点坐标
        cxt.lineTo(200,100)//终点坐标
        cxt.stroke()// 将起点和终点连接起来
    </script>
</body>
  • <canvas>元素有一个叫做getContext() 的方法,这个方法是用来获得渲染上下文和它的绘画功能。
  • canvas 元素提供了widthheight 两个属性,可设置它的宽高,不需要传入单位(比如 px 等)。

注意: 如果你绘制出来的图像是扭曲的,尝试用 widthheight 属性为<canvas>明确规定宽高,而不是使用 CSS。 []()

2. 基础图形

👋在画图前,先了解一下画布栅格以及坐标空间

canvas_default_grid.png


我们画图就是基于这个网格画的,通常来说网格中的一个单元相当于 canvas 元素中的一像素。栅格的起点为左上角(坐标为(0,0))。

👋画图的基本方法

图形的基本元素是路径。路径是通过不同颜色和宽度的线段或曲线相连形成的不同形状的点的集合。一个路径,甚至一个子路径,都是闭合的。 使用路径绘制图形需要一些额外的步骤。

  1. 首先,你需要创建路径起点坐标。
  2. 然后你使用画图命令去画出路径。
  3. 之后你把闭合路径。
  4. 一旦路径生成,你就能通过描边或填充路径区域来渲染图形。 []()

案例一:两条线段

<body>
    <canvas id="line" width="300" height="200" style="border: 1px solid #ccc"></canvas>
​
    <script>
        const cnv = document.getElementById("line")
        const cxt = cnv.getContext("2d")
        
        cxt.moveTo(20,100)//起点坐标(x,y)
        cxt.lineTo(100,50)//终点坐标
        cxt.lineWidth = 5 //线的粗细
        cxt.strokeStyle = 'blue'
        cxt.stroke()// 将起点和终点连接起来
        
        cxt.beginPath() // 重新开启一个路径
        cxt.moveTo(100, 100)
        cxt.lineTo(180, 50)
        cxt.lineWidth = 4
        cxt.strokeStyle = 'red'
    cxt.stroke()
​
    </script>
</body>

Snipaste_2022-07-29_19-58-48.png
[]()

案例二:三角形

<body>
    <canvas id="triangle" width="300" height="200" style="border: 1px solid #ccc"></canvas>
​
    <script>
        const cnv = document.getElementById("triangle")
        const cxt = cnv.getContext("2d")
        
        cxt.moveTo(50, 100)
    cxt.lineTo(0, 150)
    cxt.lineTo(100,150)
        cxt.closePath() //使用 closePath() 方法进行闭合
        cxt.stroke()
    </script>
</body>

Snipaste_2022-07-29_20-12-49.png
[]()

案例三:矩形

方法一:跟之前一样,确认坐标,连线,闭合

<body>
    <canvas id="rectangular" width="300" height="200" style="border: 1px solid #ccc"></canvas>
​
    <script>
        const cnv = document.getElementById("rectangular")
        const cxt = cnv.getContext("2d")
        
        cxt.moveTo(50, 50)
    cxt.lineTo(200, 50)
    cxt.lineTo(200,150)
    cxt.lineTo(50,150)
        cxt.closePath() //使用 closePath() 方法进行闭合
        cxt.stroke()
    </script>
</body>

方法二: strokeRect(x, y, width, height)绘制一个矩形的边框 (原理:有了起点,宽,高 能得到一个矩形)

  • strokeStyle:设置描边的属性
  • strokeRect(x, y, width, height):(x和y是矩形左上角起点;width 和 height 是矩形的宽高)
  • strokeStyle 必须写在 strokeRect() 前面,不然样式不生效。
cxt.strokeRect(50, 50, 200, 150)

方法二: fillRect(x, y, width, height)绘制一个填充的矩形

 cxt.fillStyle = 'pink'   //填充
 cxt.fillRect(50, 50, 200, 150) // fillRect(x, y, width, height)

方法三: 使用rect(x, y, width, height) 生成矩形

cxt.rect(50, 50, 200, 150) // rect(x, y, width, height)
  cxt.stroke()
  cxt.fill()

扩:clearRect(x, y, width, height)清除指定矩形区域,让清除部分完全透明。 []()

案例四:圆

绘制圆形的方法是 arc(),当然还有arcTo(),不过这个有点麻烦,我们不找麻烦😁

<br>注意:每一段圆弧的开始都调用`beginPath()`。
<canvas id="round" width="300" height="300" style="border: 1px solid #ccc;"></canvas>
​
<script>
  const cnv = document.getElementById('round')
  const cxt = cnv.getContext('2d')
​
  cxt.beginPath()
  cxt.arc(200, 200, 80, 0, 360 * Math.PI / 180)
  //cxt.arc(圆心x,圆心y,圆半径r,开始角度,结束角度,绘制方向)
  cxt.closePath()
​
  cxt.stroke()
</script>

解释:

  • 绘制方向(true: 逆时针; false: 顺时针),默认 false
  • 角度都是以弧度为单位,

    与弧度的 js 表达式:弧度=(Math.PI/180)角度**
😁总结
<br>
线:起点、终点、连线 
<br>三角形:起点、第二个点、第三个点、闭合、连线 
<br>矩形:起点,宽,高 
<br>圆:圆心坐标,半径,开始角度,结束角度,顺时针还是逆时针 
<br>简单上手之后感觉跟小学时候学的小海龟画图挺像的,

目录
相关文章
JAVA 将一个对象的所有字段值 赋给另一个 对象
JAVA 将一个对象的所有字段值 赋给另一个 对象
1277 0
JAVA 将一个对象的所有字段值 赋给另一个 对象
|
前端开发 算法 数据可视化
怎么在echarts图上左右滑动切换数据区间
怎么在echarts图上左右滑动切换数据区间
830 0
|
Dart Android开发 iOS开发
比较 Flutter 日期选择器库【Flutter 专题 6】
日期选择器是对 UI 的有用补充,它使您的应用程序用户可以轻松地从日历中选择日期。无论您是在注册表单中添加出生日期字段,还是为用户提供预约时间段,您都可以使用日期选择器库来简化流程。 在本教程中,我们将探索 Flutter 的三个流行日期选择器库 Flutter、Flutter Datetime Picker、Flutter Date Range Picker 和date_time_picker。我们将检查每个库的功能并将每个库安装在一个简单的移动应用程序中。
1682 0
比较 Flutter 日期选择器库【Flutter 专题 6】
|
JSON JavaScript 定位技术
Echarts 绘制地图(中国、省市、区县),保姆级教程!
Echarts 绘制地图(中国、省市、区县),保姆级教程!
29016 154
|
人工智能 搜索推荐 定位技术
AddressCLIP:一张照片就能准确定位!中科院联合阿里云推出街道级图像地理定位模型
AddressCLIP 是由中科院和阿里云联合开发的端到端图像地理定位模型,通过图像-文本对齐和地理匹配技术,实现街道级精度的定位,适用于城市管理、社交媒体、旅游导航等场景。
2677 30
AddressCLIP:一张照片就能准确定位!中科院联合阿里云推出街道级图像地理定位模型
|
Web App开发 Python
DrissionPage 实战:极简壁纸爬取之旅
本文介绍了如何使用DrissionPage工具自动化爬取极简风格的壁纸图片。通过简单的环境搭建和代码实现,展示了从访问目标网站、定位图片元素到下载保存的全过程。文中还提供了详细的代码示例,帮助读者快速上手。
937 4
|
前端开发 Java Shell
【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
1134 20
【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
|
网络协议 物联网 开发者
详细介绍 MQTT 的工作原理,包括 MQTT 协议的特点、核心概念以及消息传递的流程
详细介绍 MQTT 的工作原理,包括 MQTT 协议的特点、核心概念以及消息传递的流程
9563 1
|
移动开发 缓存 Dart
Pad大屏&Flutter多引擎适配之路
# 背景 在电商场景中iPad的大屏拥有比普通手机相比更大的屏幕,对于购物体验而言,如能充分利用好iPad的大屏体验,无疑提高用户购买体验,但一直以来在混合栈应用特别是Flutter混合栈中,在iPad大屏适配和Flutter多引擎适配都是个老大难问题。本文会介绍闲鱼在这iPad适配中的各个疑难点。 # 分屏模式 华为,oppo等厂商折叠屏的方案。界面会在展开和折叠时展示不同的视图样式。op
1411 0
Pad大屏&Flutter多引擎适配之路
|
前端开发 JavaScript
HTML+CSS实现超酷炫的返回顶部特效,你一定会爱上!
HTML+CSS实现超酷炫的返回顶部特效,你一定会爱上!