用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>简单上手之后感觉跟小学时候学的小海龟画图挺像的,

目录
相关文章
|
前端开发 算法 数据可视化
怎么在echarts图上左右滑动切换数据区间
怎么在echarts图上左右滑动切换数据区间
625 0
|
JSON JavaScript 前端开发
JavaScript 中更现代的深拷贝方法!
JavaScript 中更现代的深拷贝方法!
435 0
|
定位技术 数据格式
Echarts实战案例代码(59):geomap实现飞线、散点、引导线以及重叠label的解决
Echarts实战案例代码(59):geomap实现飞线、散点、引导线以及重叠label的解决
1751 0
|
Web App开发 Python
DrissionPage 实战:极简壁纸爬取之旅
本文介绍了如何使用DrissionPage工具自动化爬取极简风格的壁纸图片。通过简单的环境搭建和代码实现,展示了从访问目标网站、定位图片元素到下载保存的全过程。文中还提供了详细的代码示例,帮助读者快速上手。
534 4
|
11月前
|
人工智能 搜索推荐 定位技术
AddressCLIP:一张照片就能准确定位!中科院联合阿里云推出街道级图像地理定位模型
AddressCLIP 是由中科院和阿里云联合开发的端到端图像地理定位模型,通过图像-文本对齐和地理匹配技术,实现街道级精度的定位,适用于城市管理、社交媒体、旅游导航等场景。
1714 30
AddressCLIP:一张照片就能准确定位!中科院联合阿里云推出街道级图像地理定位模型
|
网络协议 物联网 开发者
详细介绍 MQTT 的工作原理,包括 MQTT 协议的特点、核心概念以及消息传递的流程
详细介绍 MQTT 的工作原理,包括 MQTT 协议的特点、核心概念以及消息传递的流程
7894 1
|
前端开发 JavaScript
HTML+CSS实现超酷炫的返回顶部特效,你一定会爱上!
HTML+CSS实现超酷炫的返回顶部特效,你一定会爱上!
|
编解码 人工智能 自然语言处理
Stable Diffusion文生图-图生图-ControINet插件-线稿上色-生产全套表情包-3D Openpose-局部重绘-换衣服,换姿势人设三视图一键生成教程大全(一)
Stable Diffusion文生图-图生图-ControINet插件-线稿上色-生产全套表情包-3D Openpose-局部重绘-换衣服,换姿势人设三视图一键生成教程大全(一)
1691 2
|
存储 Java 分布式数据库
使用Spring Boot和HBase实现大数据存储
使用Spring Boot和HBase实现大数据存储
1059 1
|
数据挖掘 Python
利用Python进行数据分析PDF下载经典数据分享推荐
**Python数据分析大师作,Wes McKinney亲著,详述数据操作、清洗与分析。第2版面向Python 3.6,涵盖pandas、NumPy、IPython和Jupyter更新,实战案例丰富;第3版已升级至Python 3.10和pandas 1.4,继续引领数据科学潮流。[PDF下载](https://zhangfeidezhu.com/?p=337)**
719 0
利用Python进行数据分析PDF下载经典数据分享推荐