Canvas艺术之旅:了解几个绘制基本图形的 API

news2024/9/25 13:25:55

image.png

了解几个绘制基本图形的 API

CanvasHTML5 提供的绘画 API,可以用于在 Web 页面上绘制各种基本图形。本文介绍一些 Canvas 绘制基本图形的 API

前置条件

注意:本文章所提供的代码示例默认已经进行了 canvas 元素定义,DOM 获取以及 canvas 的上下文获取,以下进行代码演示时将会省略这部分代码,请注意!

<canvas id="myCanvas" width="800" height="200"></canvas>
const canvas = document.getElementById("myCanvas");
const ctx = canvas.getContext("2d");

1. 绘制直线

API说明

  • moveTo(x, y):将画笔移动到指定位置(x, y)。该方法定义了直线的起点。

  • lineTo(x, y):从当前位置绘制一条直线到指定位置(x, y)。该方法定义了直线的终点。

  • stroke():描边当前路径。该方法实际绘制了直线。

基本步骤

  1. 设置直线起始点坐标(x,y)和终点坐标(x,y)

  2. 开始绘制直线beginPath()moveTo()lineTo()

  3. 设置线条样式lineWidthstrokeStyle

  4. 绘制直线stroke()

代码示例

// 设置直线起始点坐标和终点坐标
var startX = 100;
var startY = 100;
var endX = 700;
var endY = 100;

// 开始绘制直线
ctx.beginPath();
ctx.moveTo(startX, startY);
ctx.lineTo(endX, endY);

// 设置线条样式
ctx.lineWidth = 2; // 线宽
ctx.strokeStyle = "red"; // 线条颜色

// 绘制直线
ctx.stroke();

image.png

2. 绘制曲线

API说明

  • moveTo(x, y):将画笔移动到指定位置(x, y)。该方法定义曲线的起点。

  • quadraticCurveTo(cpx, cpy, x, y):绘制二次贝塞尔曲线,从当前位置到(x, y),控制点为(cpx, cpy)。该方法通过控制点来定义曲线的弯曲程度。

  • bezierCurveTo(cp1x, cp1y, cp2x, cp2y, x, y):绘制三次贝塞尔曲线,从当前位置到(x, y),两个控制点分别为(cp1x, cp1y)和(cp2x, cp2y)。该方法通过两个控制点来定义曲线的弯曲程度。

  • stroke():描边当前路径。该方法实际绘制了曲线。

绘制曲线和绘制直线十分类似,区别在于quadraticCurveTo(),它是 Canvas 2D API 提供的方法之一,用于绘制二次贝塞尔曲线。二次贝塞尔曲线由起点、控制点和终点组成,它的形状由控制点的位置和两个端点的相对位置关系决定。下面是一个使用 quadraticCurveTo() 方法绘制二次贝塞尔曲线的示例:

代码示例

// 设置曲线起始点坐标
var startX = 50;
var startY = 50;
// 控制点的坐标
var controlX = 250;
var controlY = 250;
// 终点的坐标
var endX = 700;
var endY = 50;

// 开始绘制曲线
ctx.beginPath();
ctx.moveTo(startX, startY);
ctx.quadraticCurveTo(controlX, controlY, endX, endY);

// 设置线条样式
ctx.lineWidth = 2; // 线宽
ctx.strokeStyle = "red"; // 线条颜色

// 绘制曲线
ctx.stroke();

image.png

3. 绘制路径

API说明

  • beginPath(): 开始一个新的路径。当调用该方法后,所有之后的路径绘制操作都会被作为一个新的路径进行处理。

  • closePath(): 结束当前路径。通过连接路径的起点和最后一个点来闭合路径。

  • moveTo(x, y): 将路径的起点移动到指定的坐标。将绘图游标移动到给定的位置(x, y),不会绘制图形。

  • lineTo(x, y): 添加一条直线段到路径。从当前点绘制一条直线到指定的坐标(x, y)。

  • rect(x, y, width, height): 绘制矩形路径。在指定的位置(x, y)绘制一个宽为width,高为height的矩形路径。

代码示例

  // 定义路径的各个点
  var pathPoints = [
    { x: 50, y: 50 },
    { x: 150, y: 150 },
    { x: 600, y: 50 },
    { x: 700, y: 150 },
  ];

  // 开始绘制路径
  ctx.beginPath();
  ctx.moveTo(pathPoints[0].x, pathPoints[0].y);

  // 绘制路径线条
  for (var i = 1; i < pathPoints.length; i++) {
    ctx.lineTo(pathPoints[i].x, pathPoints[i].y);
  }

  // 设置线条样式
  ctx.lineWidth = 2; // 线宽
  ctx.strokeStyle = "red"; // 线条颜色

  // 封闭路径(可选)
  ctx.closePath();

  // 绘制路径
  ctx.stroke();

image.png

4. 绘制矩形

API说明

  • fillRect(x, y, width, height): 绘制实心矩形。在指定的位置(x, y)绘制一个宽为width,高为height的实心矩形。

  • strokeRect(x, y, width, height): 绘制矩形的边框。在指定的位置(x, y)绘制一个宽为width,高为height的矩形的边框。

  • clearRect(x, y, width, height): 清除矩形区域。在指定的位置(x, y)清除一个宽为width,高为height的矩形区域。

使用 Canvas 绘制矩形(填充矩形、圆角矩形)的步骤如下:

  1. 清空画布(可选):

ctx.clearRect(0, 0, canvas.width, canvas.height);
  1. 绘制填充矩形:

  var x = 200,
    y = 50,
    width = 400,
    height = 100;
  ctx.fillStyle = "red"; // 设置填充颜色
  ctx.fillRect(x, y, width, height); // 绘制矩形,参数为起始点的坐标和矩形的宽高

image.png

  1. 绘制圆角矩形:

代码示例

  // 绘制圆角矩形
  function drawRoundRect(x, y, width, height, radius) {
    ctx.beginPath();

    // 绘制左上角的圆弧路径
    ctx.moveTo(x + radius, y);
    ctx.lineTo(x + width - radius, y);
    ctx.arcTo(x + width, y, x + width, y + radius, radius);

    // 绘制右上角的圆弧路径
    ctx.lineTo(x + width, y + height - radius);
    ctx.arcTo(
      x + width,
      y + height,
      x + width - radius,
      y + height,
      radius
    );

    // 绘制右下角的圆弧路径
    ctx.lineTo(x + radius, y + height);
    ctx.arcTo(x, y + height, x, y + height - radius, radius);

    // 绘制左下角的圆弧路径
    ctx.lineTo(x, y + radius);
    ctx.arcTo(x, y, x + radius, y, radius);

    ctx.closePath();

    // 填充圆角矩形
    ctx.fillStyle = "green";
    ctx.fill();
  }

  drawRoundRect(200, 50, 400, 100, 50);

image.png

在上述代码中,我们首先定义了一个 drawRoundRect 函数,该函数根据参数绘制圆角矩形图形。

其中,我们使用了 arcTo 方法绘制圆角路径,通过调用 moveTo 方法移动到圆角的起点位置,然后使用 lineTo 方法绘制至下一个点位置,最后使用 arcTo 方法绘制圆角路径。圆角的大小由 radius 参数决定。

绘制完四个圆角路径后,调用 closePath 方法将路径封闭起来。最后通过设置 fillStyle 属性设置填充颜色,并调用 fill 方法填充圆角矩形。

<body> 中的 drawRoundRect(50, 50, 300, 100, 50) 调用会在画布上绘制一个起点位置为 (200, 50),宽度为 400,高度为 100,圆角半径为 50 的圆角矩形。

5. 绘制圆和弧

API说明

  • arc(x, y, radius, startAngle, endAngle, anticlockwise): 绘制弧形或部分圆。在指定的位置(x, y)绘制一个半径为radius的弧形或者部分圆。startAngleendAngle参数用于指定起始角度和结束角度(单位:弧度),anticlockwise参数可选择是否逆时针绘制,默认为false(顺时针)。

  • arcTo(x1, y1, x2, y2, radius): 绘制两个切线之间的弧线。绘制从当前点到(x2, y2)的直线,并在此间以给定半径radius绘制出从当前点开始的切线。

代码示例

  1. 绘制圆:

// 设置圆的中心点坐标和半径
var centerX = canvas.width / 2;
var centerY = canvas.height / 2;
var radius = 80;

// 开始绘制路径
ctx.beginPath();

// 绘制圆
ctx.arc(centerX, centerY, radius, 0, 2 * Math.PI);

// 设置圆的边框样式
ctx.strokeStyle = "black";

// 设置圆的填充颜色
ctx.fillStyle = "green";

// 填充圆
ctx.fill();

// 绘制圆的边框
ctx.stroke();

// 结束绘制路径
ctx.closePath();

image.png

以上代码会在画布上绘制一个半径为100px的绿色实心圆,边框为黑色。注意,在绘制圆之前,我们首先通过调用 beginPath() 方法开始一条新的路径,然后用 arc() 方法定义圆的形状,最后调用 fill() 方法填充圆并 stroke() 方法绘制圆的边框。

  1. 绘制弧:

// 设置弧的中心点坐标、半径、起始角度和结束角度(以弧度为单位)
var centerX = 400;
var centerY = 50;
var radius = 100;
var startAngle = Math.PI / 4; // 45度
var endAngle = (3 * Math.PI) / 4; // 135度
var counterclockwise = false; // 是否顺时针绘制弧形

// 开始绘制路径
ctx.beginPath();

// 绘制弧形
ctx.arc(centerX, centerY, radius, startAngle, endAngle, counterclockwise);

// 设置弧形的边框样式
ctx.strokeStyle = "red";

// 设置弧形的线宽
ctx.lineWidth = 5;

// 绘制弧形的边框
ctx.stroke();

// 结束绘制路径
ctx.closePath();

image.png

以上代码会绘制一个半径为100px的弧形,起始角度为45度,结束角度为135度,顺时针绘制,并设定边框样式为红色,线宽为5像素。注意,在绘制弧形之前,我们同样先通过调用 beginPath() 方法开始一条新的路径,然后使用 arc() 方法定义弧形的形状,arc()方法接受的参数依次是圆心的 x 坐标、y 坐标、半径、起始角度、终止角度。起始角度和终止角度都是弧度制表示,可以使用Math.PI来得到常用的角度值。最后调用 stroke() 方法绘制弧形的边框。

6. 绘制文本

API说明

  • fillText(text, x, y, maxWidth): 在指定位置绘制填充文本。在指定的位置(x, y)绘制给定的文本内容text。可选参数maxWidth用于指定文本的最大宽度,文本会在达到最大宽度后自动换行。

  • strokeText(text, x, y, maxWidth): 在指定位置绘制边框文本。在指定的位置(x, y)绘制给定的文本内容text的边框。可选参数maxWidth用于指定文本的最大宽度,文本会在达到最大宽度后自动换行。

  • measureText(text): 测量文本的宽度。返回一个 TextMetrics 对象,该对象包含文本的宽度和其他相关信息。可以使用 measureText(text).width 来获取文本的宽度。

  • font = value: 设置文本的字体样式。通过给 font 赋值来设置文本的字体样式,例如:ctx.font = "bold 12px Arial";

  • textAlign = value: 设置文本的水平对齐方式。通过给 textAlign 赋值来设置文本的水平对齐方式,可选值有 "start", "end", "left", "right", "center" 等。

  • textBaseline = value: 设置文本的垂直对齐方式。通过给 textBaseline 赋值来设置文本的垂直对齐方式,可选值有 "top", "hanging", "middle", "alphabetic", "ideographic", "bottom" 等。

代码示例

// 设置文本样式
ctx.font = "bold 50px Arial"; // 设置文本粗细、大小及字体
ctx.fillStyle = "red"; // 设置文本颜色
ctx.textAlign = "center"; // 设置文本对齐方式:center(居中对齐)
ctx.textBaseline = "middle"; // 设置文本基线:middle(垂直居中)

// 绘制文本
ctx.fillText("Hello, Canvas!", canvas.width / 2, canvas.height / 2);

image.png

上述代码会在画布上绘制文本。我们使用 font 属性来设置文本的粗细、大小和字体,使用 fillStyle 属性来设置文本颜色,使用 textAlign 属性来设置文本对齐方式,使用 textBaseline 属性设置文本基线,

然后,我们使用 fillText() 方法来绘制文本,通过指定文本内容、位置(x坐标和y坐标)来实现。在上述代码中,我们将文本设置为"Hello, Canvas!",并将其绘制在画布的中心位置。注意使用的是 fillText() 方法来填充文本,如果希望绘制的是文本的边框,可以使用 strokeText() 方法,并在绘制文本之前设置 strokeStyle 属性。

总结

本文主要介绍了绘制基本图形的几个常用的 API 及示例,目的就是要对 Canvas 绘图 API 有一个基本的认识,图形绘制是 Canvas 的基础,是 Canvas 最简单的功能,只有基础打牢,后面我们使用 Canvas 开发图表可视化、动画、游戏等高级项目时,我们才会更快的学习。

本文主要讲解了绘制简单图形的基本操作:包括绘制直线、曲线、路径、圆弧、文本等,以下是在绘制这几种的图形的常用 API,总结一下:

  1. 绘制直线:

    • moveTo(x, y):将画笔移动到指定位置(x, y)。

    • lineTo(x, y):从当前位置绘制一条直线到指定位置(x, y)。

  2. 绘制矩形:

    • fillRect(x, y, width, height):绘制一个填充的矩形,起点为(x, y),宽度为width,高度为height

    • strokeRect(x, y, width, height):绘制一个边框的矩形,起点为(x, y),宽度为width,高度为height

  3. 绘制路径:

    • fillRect(x, y, width, height):绘制一个填充的矩形,起点为(x, y),宽度为width,高度为height

    • strokeRect(x, y, width, height):绘制一个边框的矩形,起点为(x, y),宽度为width,高度为height

  4. 绘制圆形、弧形:

    • arc(x, y, radius, startAngle, endAngle, anticlockwise):从起点(x, y)开始,以半径radius绘制一段弧线,从startAngle角度开始,到endAngle角度结束(以弧度为单位)。

    • arcTo(x1, y1, x2, y2, radius):绘制一段连接两个切线的弧线,其中(x1, y1)和(x2, y2)是切线的起点和终点,radius是弧线的半径。

  5. 绘制文本

    • fillText(text, x, y, maxWidth): 在指定位置绘制填充文本。在指定的位置(x, y)绘制给定的文本内容text

    • strokeText(text, x, y, maxWidth): 在指定位置绘制边框文本。在指定的位置(x, y)绘制给定的文本内容text的边框。

    • font = value: 设置文本的字体样式。例如:ctx.font = "bold 12px Arial";

希望本文能为你在初学 Canvas 绘图时,给你提供一些帮助!加油!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2110157.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java项目: 基于SpringBoot+mybatis+maven+mysql教师工作量管理系统(含源码+数据库+毕业论文)

一、项目简介 本项目是一套基于SpringBootmybatismavenmysql教师工作量管理系统 包含&#xff1a;项目源码、数据库脚本等&#xff0c;该项目附带全部源码可作为毕设使用。 项目都经过严格调试&#xff0c;eclipse或者idea 确保可以运行&#xff01; 该系统功能完善、界面美观…

日志框架log4j打印异常堆栈信息携带traceId,方便接口异常排查

一、异常堆栈无traceId 排查定位问题异常痛苦 在日常项目开发中&#xff0c;我们会自定义一个traceId方便&#xff0c;链路追踪。在log4j2.xml 我们可能是这样去配置日志打印格式。 <Console name"CONSOLE" target"SYSTEM_OUT"><PatternLayoutpa…

python学习第六节:使用python制作九九乘法表和学生管理系统

python学习第六节&#xff1a;使用python制作九九乘法表和学生管理系统 通过前面五节的了解&#xff0c;已经大概知道python的语法以及基础函数&#xff0c;下面是简单的两个小程序。不会做没关系&#xff0c;看得懂就可以了&#xff0c;如果能够自己加工举一反三那就更好了。 …

计算机网络 TCP/IP协议篇

今天学习了TCP/IP协议的相关知识&#xff0c;学习笔记如下&#xff1a; 在学习之前&#xff0c;我们先抛出几个问题&#xff0c;什么是TCP/IP协议簇&#xff1f;TCP/IP协议簇是怎么工作的&#xff1f; TCP/IP模型 协议分层 每层通过协议完成各自特定的功能上层依赖下层提供…

智能对决:提示词攻防中的AI安全博弈

智能对决&#xff1a;提示词攻防中的AI安全博弈 在2024年上海AIGC开发者大会上&#xff0c;知名提示词爱好者工程师云中嘉树发表了关于AI提示词攻防与安全博弈的精彩演讲。他深入探讨了当前AI产品的安全现状&#xff0c;提示词攻击的常见手段及其应对策略。本文将对他的演讲进…

【每日一题】LeetCode 84.柱状图中最大的矩形(栈、数组、单调栈)

【每日一题】LeetCode 84.柱状图中最大的矩形&#xff08;栈、数组、单调栈&#xff09; 题目描述 给定 n 个非负整数&#xff0c;用来表示柱状图中各个柱子的高度。每个柱子彼此相邻&#xff0c;且宽度为 1 。求在该柱状图中&#xff0c;能够勾勒出来的矩形的最大面积。 这…

Linux小程序:进度条

目录 一、换行与回车 二、缓冲区 三、倒计时代码 四、进度条实现 实现进度条程序&#xff0c;首先需要两个预备知识&#xff1a; 1.换行与回车 2.缓存区 一、换行与回车 我们通常使用\n作为换行符&#xff0c;但实际上\n是换行回车两种效果的结合&#xff0c;因此我们需…

.iso文件怎么打开?

在日常使用电脑的过程中&#xff0c;很多用户都会遇到.iso文件&#xff0c;尤其是在安装软件、操作系统或者备份光盘内容时。那么&#xff0c;什么是.iso文件&#xff1f;该如何打开它&#xff1f;本文将为大家详细解答这些问题&#xff0c;帮助大家轻松处理.iso文件。 什么是.…

IEEE TRO 人形机器人遥操作的综述

人形机器人的遥操作结合了人类的认知技能和领域专业知识以及人形机器人的物理能力。这种人形机器人的操作多功能性使它们成为远程环境中各种应用的理想平台。然而&#xff0c;人形机器人的复杂性给遥操作带来了挑战&#xff0c;尤其是在通信受限的非结构化动态环境中。尽管在过…

【2024国赛B题】高教杯全国大学生数学建模国赛建模过程+完整代码论文全解全析

你是否在寻找数学建模比赛的突破点&#xff1f;数学建模进阶思路&#xff01; 作为经验丰富的数学建模团队&#xff0c;我们将为你带来2024国赛数学建模竞赛&#xff08;B题&#xff09;的全面解析。这个解决方案包不仅包括完整的代码实现&#xff0c;还有详尽的建模过程和解析…

pdf怎么删除其中一页?这5个pdf编辑方法新手都在用,建议收藏

pdf怎么删除其中一页&#xff1f;在日常的工作和学习生活中&#xff0c;我们经常会遇到需要处理PDF文件的情况。有时候&#xff0c;我们在处理PDF文件时&#xff0c;发现某些页面内容不再需要&#xff0c;想从PDF中删除特定的页面。然而&#xff0c;很多小伙伴对PDF的编辑和修改…

员工上班摸鱼怎么办,上班期间摸鱼

在现代企业的日常运营中&#xff0c;员工的工作效率是企业成功的关键因素之一。随着远程办公的普及&#xff0c;员工在工作中“摸鱼”的现象愈加频繁。这不仅会导致工作效率的下降&#xff0c;还可能拖延项目进展&#xff0c;增加企业的管理成本。面对这一问题&#xff0c;企业…

大模型备案重难点最详细说明【评估测试题+附件】

2024年3月1日&#xff0c;我国通过了《生成式人工智能服务安全基本要求》&#xff08;以下简称《AIGC安全要求》&#xff09;&#xff0c;这是目前我国第一部有关AIGC服务安全性方面的技术性指导文件&#xff0c;对语料安全、模型安全、安全措施、词库/题库要求、安全评估等方面…

极市开发平台yolov8训练无人机数据集样例数据流程

先进入vscode&#xff0c;进入src_repo文件夹。 第一步&#xff0c;克隆一个比较好的博主的库&#xff1a; GitHub - Incalos/YOLO-Datasets-And-Training-Methods: This project involves making custom datasets for the YOLO series and model training methods for YOLO.…

在生产线打包机中RFID技术的赋能

在生产线打包机中RFID技术的赋能 随着制造业的智能化发展&#xff0c;RFID技术越来越多地被应用于生产线中&#xff0c;特别是在产线打包环节。本文将探讨RFID技术如何提高产线打包机的工作效率和准确性&#xff0c;并分析其在现代制造业中的重要作用。 RFID在产线打包机上的应…

顶刊速递|医学AI在乳腺癌中的最新研究进展·24-09-06

小罗碎碎念 本期推文主题&#xff1a;乳腺癌 最近我在思考一个问题&#xff0c;生信分析和人工智能的区别和联系是什么&#xff1f;细节现在是想不清楚的&#xff0c;因为我的知识储备还不够&#xff0c;但是有一点我可以确定&#xff0c;二者的部分本质都是一样的——强大的计…

使用程序方式获取与处理MySQL表数据

8.1  执行多条语句获取 MySQL 表数据 8.1.1  MySQL 中的常量 8.1.2  MySQL 中的变量 1&#xff0e;用户变量 用户可以在表达式中使用自己定义的变量&#xff0c;这样的变量称为用户变量。 用户变量在使用前必须定义和初始化&#xff0c;如果使用没有初始化的变量&#x…

EG边缘计算网关连接华为云物联网平台(MQTT协议)

需求概述 实现一个流程&#xff1a;EG8200mini采集Modbus RTU数据&#xff0c;通过MQTT协议连接华为云物联网平台 Modbus RTU采集此处不做过多赘述&#xff0c;可参考其他案例&#xff08;串口读取Modbus传感器数据&#xff09;介绍。下文默认已经采集到Modbus RTU数据。 要…

【B题成品论文已出】24数学建模国赛B题成品论文(附参考代码)免费分享

B题&#xff1a;生产过程中的决策问题 一、第一问 针对问题一&#xff0c;要求我们制定多种抽样方案&#xff0c;并利用区间估计的方法确定各个抽样方案的检测次数&#xff0c;在两种情形下确定抽样方法。这里可以选择的抽样方案有简单随机抽样&#xff08;超几何分布中未知参…

详解 MQ 消息队列

谈起消息队列&#xff0c;内心还是会有些波澜。 消息队列&#xff0c;缓存&#xff0c;分库分表是高并发解决方案三剑客&#xff0c;而消息队列是我最喜欢&#xff0c;也是思考最多的技术。 我想按照下面的四个阶段分享我与消息队列的故事&#xff0c;同时也是对我技术成长经…