Canvas实现动态绘制圆周效果(沿圆周运动的圆的绘制)

news2024/9/21 22:59:30

步骤实现:

  1. 首先,创建一个 HTML 画布和一个 JavaScript 动画函数。

  2. 在画布上绘制一个圆。

  3. 定义一个变量来表示圆心的坐标和半径。

  4. 进行动画循环以更新圆心坐标,使其沿外圆周运动。

  5. 使用三角函数(如 sin 和 cos)来计算圆心坐标。

 下面是示例代码:(你可以根据需要调整圆的半径、角速度和起始角度。)

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
		<style>
		</style>
	</head>
	<body>
		<canvas id="myCanvas1" width="400" height="400"></canvas>
	</body>
</html>
<script>
    let canvas = document.querySelector("#myCanvas1");
    var ctx = canvas.getContext('2d');

    var centerX = canvas.width / 2;
    var centerY = canvas.height / 2;
    var R = 100;

    var angle = 0; // 初始角度
    var speed = 0.05; // 运动速度

    function animate() {
        requestAnimationFrame(animate);
        

        // 计算圆心坐标
        var x = centerX + Math.cos(angle) * R;
        var y = centerY + Math.sin(angle) * R;
        
        // 绘制圆
        ctx.beginPath();
        ctx.arc(x, y, 10, 0, 2*Math.PI);
        ctx.fillStyle = "red";
        ctx.fill();
        
        // 更新角度
        angle += speed;
    }
    // 清除画布
    ctx.clearRect(0, 0, canvas.width, canvas.height);

    animate();



</script>

一、canvas简介

是一个h5新增的标签 表示画布 是一个不需要其他三方操作 原生的

必须通过js来对其画布进行构图 canvas本身是一个容器 js是一个画笔

canvas有两个重要的属性 width height

canvas应用很多 验证码 图表操作 截屏 手写板 (签合同) 。。。

<canvas width="200" height="300"></canvas> 
/* 宽和高是2个独立的属性,写法是属性=“数值” ,数字不带单位;推荐使用属性设置宽高 */

<canvas style="width:300px;height:400px"></canvas> 
/* 不要这样写 这样写的style属性是的css样式,样式的值的单位带px */

二、canvas渲染

canvas的渲染得用js

 1. 获得canvas操作权限 let canvas = document.querySelecter("元素") ...

 2. 获得绘画能力 let context = canvas.getContext("2d");

 3. 调用绘画能力来对canvas进行操作

注意 : 不要用样式给canvas设置宽高 要用属性

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        .canvas1{
            border: 2px solid black;
        }
        p{
            font: 30px "宋体";
        }
    </style>
</head>
<body>
    <canvas width="400" height="400" class="canvas1"></canvas>
    <p>测试字体样式</p>
</body>
<script>
    let canvas1 = document.querySelector(".canvas1");
    let context1 = canvas1.getContext("2d");

    context1.font = "50px '华文行楷'"; //字体大小及样式
     context1.fillStyle = "#6260e8";   //填充颜色
     context1.fillText("李桥桉",100,50); //内容及坐标

    context1.strokeStyle = "#ff0000";  //描边颜色
    context1.strokeText("李桥桉",100,100);
</script>
</html>

三、canvas样式

  1. 填充 fill => fillStyle
  2. 描边 stroke => strokeStyle
  3. 样式是有顺序的 画完再给样式 ,需要先设置样式 后有字体文本

  1. 描边案例
  2. context1.font = "50px '华文行楷'"// 字体设置 参照css font
  3. context1.fillStyle = "#ff0000" // 填充颜色
  4. context1.fillText("李桥桉",100,50) // 填充
  5. context1.strokeStyle = "#0000ff" // 描边颜色
  6. context1.strokeText("Joan",150,100)// 描边

  1. 设置透明度
  2. context1.globalAlpha = 0.1; // opcity 取值 0-1
  3. context1.shadowColor = "#000" // 设置阴影颜色
  4. context1.shadowBlur = 0.5; // 阴影级别
  5. context1.shadowOffsetX = 10; // 阴影的x轴偏移
  6. context1.shadowOffsetY = 10; // 阴影的y轴偏移
  7. 以上样式不仅可以设置给文字,还可以设置给其他元素 
  8. 填充样式影响与填充相关的操作 fillStyle => fillText fill
  9. 描边样式对应描边 strokeStyle => strokeText stroke

四、canvas路径(线)

直线 两个点组成 起始位置 终点位置

起点 moveTo(x,y)

终点 lineTo(x,y) 终点可以有多个

canvas实现一个三角形(倒三角)

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        .canvas1{
            border: 2px solid black;
        }
    </style>
</head>
<body>
    <canvas width="600" height="400" class="canvas1"></canvas>
</body>
<script>
    let canvas1 = document.querySelector(".canvas1");
    let context1 = canvas1.getContext("2d");

    context1.beginPath();//开启一个新路径,与之前的断开联系
    context1.strokeStyle = "#00f"
    context1.moveTo(10,100);
    context1.lineTo(200,200);
    context1.stroke();

    context1.beginPath();//开启一个新路径,与之前的断开联系
    context1.strokeStyle = "#f00";
    context1.moveTo(200,200);
    context1.lineTo(390,100);
    context1.stroke();

    context1.beginPath();//开启一个新路径,与之前的断开联系
    context1.strokeStyle = "#0f0";
    context1.moveTo(390,100);
    context1.lineTo(10,100);
    context1.stroke();
 

线样式

  1. context1.lineWidth = 15 // 线粗细
  2. context1.lineCap = "round"; // 线两端类型 "round" 圆弧型(常用)
  3. context1.lineCap = "square"; //线两端类型 "square" 自动伸长了一点
  4.     context1.beginPath();//开启一个新路径,与之前的断开联系
        context1.strokeStyle = "#000";
        context1.lineWidth = 15;
        context1.lineCap = "round";
        context1.lineJoin = "round";
    
        context1.moveTo(20,130);
        context1.lineTo(150,100);
        context1.lineTo(180,180);
        context1.stroke()

  5. context1.lineJoin = "bevel" // 线拐点样式 "round" 圆弧型 "bevel" 切面型

 弧样式--JavaScript实现一个圆环

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        .canvas1{
            border: 2px solid black;
        }
    </style>
</head>
<body>
    <canvas width="600" height="400" class="canvas1"></canvas>
</body>
<script>
    let canvas1 = document.querySelector(".canvas1");
    let context1 = canvas1.getContext("2d");
    
    context1.beginPath();//开启一个新路径,与之前的断开联系
    context1.arc(200,200,50,0,Math.PI * 2);
    // arc中参数1和参数2代表圆心坐标;参数3代表半径;参数4代表弧度,
    // 参数5代表角度(π代表180°),参数6为true/false代表顺时针或逆时针

    context1.stroke();

运行效果

 动态绘制一个圆。

    let i = 0;
    setInterval(() => {
        setTimeout(() => {
            context1.beginPath();
            context1.arc(200,200,50,0,Math.PI * 2);
            context1.stroke();
        },100);
        i += 0.001;

    },400);

 

 

 绘制一个做圆周运动的圆(实现一个动态绘制圆周的效果)

五、canvas矩形

  1. context1.rect(50,50,100,100) // 绘制矩形 但是需要再次填充
  2. context1.fill()
  3. context1.stroke()
  4. context1.fillRect(50,50,100,100) // 直接绘制死心的矩形
  5. context1.strokeRect(50,50,100,100) // 直接绘制空心的矩形
  6. // 清空画布
  7. context1.clearRect(0,0,canvas1.width,canvas1.height)
  8. // fillRect strokeRect rect
  9. // 前面二则立即填充或者描边 后者需要手动填充或者描边

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

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

相关文章

前端代码版本管理规范

Git 是目前最流行的源代码管理工具。为规范开发&#xff0c;保持代码提交记录以及 git分支结构清晰&#xff0c;方便后续维护&#xff0c;总结了如下规范。 分支约定 ├── master # 生产分支 ├── release # 测试分支├── develop # 开发分支…

学系统集成项目管理工程师(中项)系列11b_沟通管理(下)

1. 沟通过程的有效性 1.1. 效果 1.1.1. 在适当的时间、适当的方式、信息被准确的发送给适当的沟通参与方&#xff08;信息的接收方&#xff09;&#xff0c;并且能够被正确的理解&#xff0c;最终参与方能够正确的采取行动 1.2. 效率 1.2.1. 强调的是及时提供所需的信息 2…

两数之和hash

给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和为目标值 target 的那 两个 整数&#xff0c;并返回它们的数组下标。 你可以假设每种输入只会对应一个答案。但是&#xff0c;数组中同一个元素在答案里不能重复出现。 你可以按任意顺序返回…

基于opencv-python的深度学习模块案例

目录 图像分类 目标检测 人脸检测 姿态估计 车辆检测 一、图像分类 图像分类是基于深度学习的计算机视觉任务中最简单、也是最基础的一类&#xff0c;它其中用到的CNN特征提取技术也是目标检测、目标分割等视觉任务的基础。 具体到图像分类任务而言&#xff0c;其具体流…

Springcloud----Feign

在上一个案列中Springcloud-注册中心 使用的交互是利用RestTemplate发起远程调用的代码,Feign是Springcloud整合的声明式组件, Feign Feign和RestTemplate都是用于在Java中实现RESTful API调用的工具&#xff0c;但它们之间有一些区别和优缺点。 区别 Feign是一个声明式HTTP…

夜天之书 #82 Web API 简介

Application Programming Interface (API) 即应用程序接口。顾名思义&#xff0c;它是开发者访问应用程序的接口。 例如&#xff0c;你可以通过以下命令查询 GitHub 上特定代码仓库的元数据信息&#xff1a; curl https://api.github.com/repos/apache/pulsar GitHub 会返回以下…

Springboot——导入用户地址簿相关功能代码

目录 一、导入用户地址簿相关功能代码 1.1 需求分析 1.2 数据库对应的表 1.3 实体类 1.4 控制层 二、菜品展示 2.1 修改列表接口 2.2 设置对应接口查询套餐信息 三、购物车 3.1 购物车数据模型 3.2 代码开发 3.2.1 实体类 3.2.2 添加购物车 3.2.3 查看购物车 3.2.4 清空购…

clickhouse 为什么快?

文章目录 [TOC](文章目录) 前言一、什么是列式数据库&#xff1f;为什么要用列式数据库,优点是什么? 二、clickhouse入门1. 个人猜想2. 使用clickhouse引入依赖yml配置扫描mapper 2.生成相应代码,执行测试用例查询结果 总结 前言 例如&#xff1a;随着人工智能的不断发展&…

还在玩传统终端,不妨来试试全新 AI 终端 Warp

壹 ❀ 引 最近一段时间&#xff0c;AI领域如同雨后春笋般开始猛烈生长&#xff0c;processon&#xff0c;sentry&#xff0c;一些日常使用的工具都在积极接入AI&#xff0c;那么正好借着AI的风头&#xff0c;今天给大家推荐一款非常不错的智能终端 warp&#xff08;目前仅限ma…

Servlet配置与高效部署

作出网页后端的核心目标就是 , 基于 tomcat 编程进行网站后端的开发 , 肯定需要对 http 协议进行一系列操作 , 幸运的是 tomcat 已经把这些 http 相关的底层操作封装好了(监听端口 , 接收连接 , 读取请求 , 解析请求 , 构造请求对象等一系列操作) , 只需调用 tomcat 为我们提供…

VMware虚拟机安装Linux教程(Windows版)

VMware虚拟机安装Linux教程&#xff08;Windows版&#xff09; 第一步、安装 VM &#x1f4e2;&#x1f4e2;&#xff1a;VMware下载以及Linux系统镜像需要的小伙伴可以私信我&#xff0c;也可以去官网上下载&#xff0c;文章中不能涉及安装包啥的&#xff0c;不然显示侵权&a…

如何一键免费压缩PDF文件?最好的 PDF 阅读器免费下载!

PDF&#xff08;便携式文档格式&#xff09;是一种独立于应用程序和平台的通用文件格式。它确保不同的用户可以在各种软件、硬件或操作系统中接收具有相同格式和视觉呈现的相同内容。您还可以在需要时对 PDF 进行电子签名。因此&#xff0c;PDF 文档在学术和正式用途中具有普遍…

Idea Git 分支合并全部文件或指定文件

这里有两个分支&#xff0c;一个 master 主分支&#xff0c;一个 hy-master 分支 一、将 hy-master 全部合并到 master 1、先回到 master 分支 2、在当前工作目录的分支为 master 的基础上&#xff0c;点击 hy-master 分支 点击 Merge into Current&#xff0c;就会将 hy-mas…

真题详解(MTTR)-软件设计(五十七)

设计模式详解-软件设计&#xff08;五十六)https://blog.csdn.net/ke1ying/article/details/130327216 采用DMA方式传送数据的时候&#xff0c;都是占用 存储周期。 解析&#xff1a; 因为不需要与cpu交互&#xff0c;所以不是指令周期&#xff0c;与外设交互&#xff0c;所…

nodejs+python+php+springboot+vue 女生穿衣搭配系统

本文研究的女生穿衣搭配管理基于当前较为流行的B/S结构 通过本系统&#xff0c;实现了不同权限的用户登录&#xff0c;包括用户和管理员。管理员:用户管理、类型信息管理、服饰单品管理、今日搭配管理、论坛管理、系统管理、我的收藏管理。用户&#xff1a;类型信息管理、服饰单…

【项目实战】一个赛事组队交流分享平台——微信小程序 uniapp+springboot微服务

前言 去年微信小程序国三&#xff0c;今年这个比赛绝版了&#xff0c;把这个项目开源出来给大家学习一下吧&#xff0c;整个架构还是比较完善的&#xff0c;特别适合学习。&#xff08;开源不易&#xff0c;求个star&#xff09; 项目地址&#xff1a;https://github.com/Unde…

【独具匠心设计】全网最好的国学,历代文学,名著,小说网推荐

极力推荐一个功能简单、易用、访问快捷、界面大气,清爽、资源丰富、设计专业、完全免费的文学网站。它的名字叫“历代文学”&#xff0c;是由成都心海科技公司所研发&#xff0c;设计真可谓独具匠心。 “历代文学”收录了来自古今中外 20 多个朝代&#xff0c;近 30个 国家的作…

Mysql列的完整性约束详解(主键约束)

文章目录 前言一、设置表字段的主键约束&#xff08;PRIMARY KEY&#xff0c;PK&#xff09; 1.单字段主键2.多字段主键总结 前言 完整性约束条件是对字段进行限制&#xff0c;要求用户对该属性进行的操作符合特定的要求。如果不满足完整性约束条件&#xff0c;数据库系统将不再…

AUTOSAR文档如何阅读 -- 这些缩写是干嘛的!!!

目录 1 Autosar BSW Module List 2 Autosar规范文档的类型 2.1 Autosar文档中提到的缩写 3 如何快速查看相邻CP Autosar版本之间的差异 结尾 优质博文推荐阅读&#xff08;单击下方链接&#xff0c;即可跳转&#xff09;&#xff1a; 点击返回「《Autosar从入门到精通-实…

[入门必看]数据结构5.2:二叉树的概念

[入门必看]数据结构5.2&#xff1a;二叉树的概念 第五章 树与二叉树5.2 二叉树的概念知识总览5.2.1_1 二叉树的定义和基本术语5.2.1_2 二叉树的性质5.2.2 二叉树的存储结构 5.2.1_1 二叉树的定义和基本术语二叉树的基本概念二叉树的五种状态几个特殊的二叉树满二叉树&#xff1…