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

目录
相关文章
|
物联网 传感器
【物联网开发实战】- 设备上云方案详解
以智能洗衣机为例,介绍温度/水位等传感器,主控MCU(Microcontroller Unit),无线通信模组等核心模块,以实现洗衣机数据采集、预处理、加密、传输上云等功能。
3787 0
|
测试技术 Linux
三分钟搞定压力测试之http_load
本文对一个正在云服务器上运行的系统进行一个并发访问的压力测试,以此来模仿真实环境并发访问造成资源带宽不稳定出现的种种问题。
590 0
三分钟搞定压力测试之http_load
|
编解码 人工智能 自然语言处理
Stable Diffusion文生图-图生图-ControINet插件-线稿上色-生产全套表情包-3D Openpose-局部重绘-换衣服,换姿势人设三视图一键生成教程大全(一)
Stable Diffusion文生图-图生图-ControINet插件-线稿上色-生产全套表情包-3D Openpose-局部重绘-换衣服,换姿势人设三视图一键生成教程大全(一)
1272 2
|
10月前
|
存储 缓存 前端开发
聊聊公众号联动扫码登录功能如何实现
【10月更文挑战第30天】公众号联动扫码登录功能的实现涉及前端、后端与微信平台的交互。前端设计二维码展示区和轮询机制,后端负责生成二维码、处理微信推送、用户身份验证及登录。整个过程需确保数据交互安全顺畅,提升用户体验。
343 1
|
存储 Java 分布式数据库
使用Spring Boot和HBase实现大数据存储
使用Spring Boot和HBase实现大数据存储
|
11月前
|
机器学习/深度学习 人工智能 算法
AI在药物研发中还有哪些应用场景呢
【10月更文挑战第16天】AI在药物研发中还有哪些应用场景呢
1206 0
|
机器学习/深度学习 并行计算 算法
基于 PyTorch 的目标检测(YOLO实现)
基于 PyTorch 的目标检测(YOLO实现)
|
Kubernetes 负载均衡 Java
Kubernetes在Java应用部署中的最佳实践
Kubernetes在Java应用部署中的最佳实践
|
文字识别 小程序 安全
印刷文字识别操作报错合集之微信小程序调用API时路径总是返回不对,该如何处理
在使用印刷文字识别(OCR)服务时,可能会遇到各种错误。例如:1.Java异常、2.配置文件错误、3.服务未开通、4.HTTP错误码、5.权限问题(403 Forbidden)、6.调用拒绝(Refused)、7.智能纠错问题、8.图片质量或格式问题,以下是一些常见错误及其可能的原因和解决方案的合集。
|
安全 算法 应用服务中间件
SSL/TLS协议信息泄露漏洞(CVE-2016-2183)【原理扫描】
SSL/TLS协议信息泄露漏洞(CVE-2016-2183)【原理扫描】 【可验证】 详细描述TLS是安全传输层协议,用于在两个通信应用程序之间提供保密性和数据完整性。
8361 2