Canvas实现动态绘制圆周效果|实现奥运五环

news2024/11/25 14:57:20

步骤实现:

  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);

实现一个奥运五环

代码如下

<!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="800" height="500" class="canvas1"></canvas>
</body>
<script>
    let canvas1 = document.querySelector(".canvas1");
    let context1 = canvas1.getContext("2d");

    context1.beginPath();
    context1.arc(100,100,50,0,Math.PI * 2)
    context1.stroke();

    context1.beginPath();
    context1.arc(180,100,50,0,Math.PI * 2)
    context1.stroke();

    context1.beginPath();
    context1.arc(260,100,50,0,Math.PI * 2)
    context1.stroke();

    context1.beginPath();
    context1.arc(140,180,50,0,Math.PI * 2)
    context1.stroke();

    context1.beginPath();
    context1.arc(220,180,50,0,Math.PI * 2)
    context1.stroke();

</script>
</html>

五、canvas矩形

// 绘制矩形 但是需要再次填充。
//参数1代表x轴,参数2代表y轴。参数3代表宽,参数4代表高。
context1.rect(50,50,100,100) 

context1.fill()
context1.stroke() //描边
  1. // 直接绘制实心的矩形   

  2. context1.fillRect(50,50,100,100)

        

  1. // 直接绘制空心的矩形
  2. context1.strokeRect(50,50,100,100)

  1. // 清空画布
  2. context1.clearRect(0,0,canvas1.width,canvas1.height)

  1. // fillRect strokeRect rect
  2. // 前面二者立即填充或者描边 后者需要手动填充或者描边

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

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

相关文章

如何带领小微企业在软件开发行业生存

文章目录 前言一、企业急需的技术人才需要掌握的技能二、人工智能开发者技能三、领导者需要掌握的知识和技能四、具备敏锐的技术视野的方法和途径五、人工智能技术论坛及组织六、机器学习相关论坛和组织七、新技术如何应用和落地1、了解新技术2、确定应用场景3、进行实践验证4、…

Pinia与Vuex区别、Pinia安装与使用

目录 一、Pinia和Vuex区别 二、Pinia使用state、getters、actions 1、安装使用Pinia 2、State 3、actions 4、getters 三、Pinia划分模块 1、目录结构 2、store/user.js 3、某组件使用 四、Pinia持久化存储 1、安装插件 2、store/index.js 3、store/user.js 4、…

Linux 内核设计与实现

文章目录 一、前言二、进程管理1、task_struct2、thread_info 三、调度四、系统调用五、内核数据结构1、kfifo2、映射3、二叉树 六、中断1、软中断2、tasklet3、工作队列4、下半部机制的选择5、下半部禁止与使能 七、内核同步方法1、原子操作2、自旋锁&#xff08;1&#xff09…

辛弃疾最经典的10首词

他&#xff0c;文能挥笔填词&#xff0c;武能上马杀敌&#xff1b; 他&#xff0c;被称为“词中之龙”&#xff0c; 他&#xff0c;一生赤子&#xff0c;追求收复山河&#xff1b; 他&#xff0c;是与苏轼齐名的豪放派词人&#xff1b; 他是辛弃疾。 辛弃疾一生怀着赤子之…

Bito:一款 iead/webstorm 神级插件,由 ChatGPT 团队开发,堪称辅助神器

前言&#xff1a; idea(后端)&#xff0c;webstorm(前端)中可以用的一款辅助插件&#xff1a;Bito 个人尝试体验效果&#xff1a; 优点是&#xff1a;可以自动完成一些场景代码。 缺点&#xff1a;太慢了&#xff0c;大部分时间一直转圈 摘取文档&#xff1a; 什么是Bito&…

UE4 架构初识(一)

UE引擎学习 一、基础框架 UObject: ​ UE创世&#xff0c;万物皆UObject&#xff0c;接着有Actor。UObject提供的元数据、反射生成、GC垃圾回收、序列化、编辑器可见&#xff0c;Class Default Object等&#xff0c;UE可以构建一个Object运行的世界。 Actor: 脱胎自Object的…

问题解决 | Failed to initialize NVML: Driver/library version mismatch

问题描述&#xff1a; Ubuntu20.04服务器上&#xff0c;一个docker容器正在训练模型&#xff0c;打开另外一个docker容器时&#xff0c;出现以下错误 Error response from daemon: failed to create shim task: OCI runtime create failed: runc create failed: unable to st…

数字设计小思 - 谈谈Latch:组合与时序逻辑的桥梁

前言 本系列整理数字系统设计的相关知识体系架构&#xff0c;为了方便后续自己查阅与求职准备。对于FPGA和ASIC设计中&#xff0c;避免使用Latch&#xff08;锁存器&#xff09;一直是个绕不开的话题&#xff0c;本文结合网上的文章&#xff0c;并根据示例介绍如何在实际设计中…

学习如何通过构建一个简单的JavaScript颜色游戏来操作DOM

学习如何通过构建一个简单的JavaScript颜色游戏来操作DOM 题目要求 我们将构建一个简单的颜色猜谜游戏。每次游戏启动时&#xff0c;都会选择一个随机的RGB颜色代码。根据游戏模式&#xff0c;我们将在屏幕上提供三个&#xff08;简单&#xff09;或六个&#xff08;困难&…

基于 SpringBoot + Vue 的智能停车场项目。

一、开源项目简介 基于 SpringBoot Vue 的智能停车场项目。 智能停车场管理平台&#xff01;科学计费 多种计费方案灵活切换&#xff0c;商场、小区、停车场等场景均适用&#xff01;无人值守 云端控制实现无岗亭模式下的车辆自主进出&#xff0c;降低人工成本&#xff01; …

Nacos,OpenFeign,Ribbon,loadBalance如何相互协调工作

1、SpringCloud规范 对于Nacos而言其作用在于服务注册发现和配置中心&#xff0c;对于Ribbon而言作用在于实现实例负载均衡&#xff0c;对于OpenFeign而言要通过rpc实现远程调用 2、Nacos实现服务注册发现 SpringCloud提供了ServiceRegistration接口&#xff0c;实现服务注册…

软件保护器:Themida 3.1.14 Crack

先进的Windows软件保护系统 版本&#xff1a;3.1 版本&#xff1a;3.1.4.0 日期&#xff1a;2022 年 11 月 10 日 概述 在创建应用程序时&#xff0c;Compiler 会将应用程序源代码编译成多个由机器语言代码构成的目标文件。然后将目标文件链接在一起以创建最终的可执行文件。 与…

【chapter29】【PyTorch】[交叉验证】

前言 前面讲了 Underfit , Overfit ,这里重点讲解一下如何检测 一 数据集划分 训练的时候&#xff0c;我们一般把数据集分成 训练集 和 验证集 每训练一轮或者几轮.validation 一次,看一下当前 验证集上的loss&acc 是否 提升.如果已经是最佳值,则提前结束训练,防止过拟合…

如何做好联络口译的译前准备工作?

我们知道&#xff0c;译前准备与口译质量有着紧密的联系。在联络口译中&#xff0c;对口译员的双语能力和知识储备有着十分高的要求&#xff0c;为了能够顺利完成口译任务&#xff0c;就必须进行译前准备。那么&#xff0c;如何做好译前准备工作&#xff1f;联络口译的译前准备…

强烈推荐这 6 款 API 测试工具,绝对有一款没听过

Postman: Postman 是一个流行的 API 开发和测试工具&#xff0c;提供了丰富的功能&#xff0c;包括请求构建、测试自动化、数据驱动等。用户可以通过 Postman 的界面轻松创建和测试 RESTful API。 Insomnia: Insomnia 是一款功能强大的开源 API 测试工具&#xff0c;支持多种协…

Windows 远程桌面提示没有远程桌面授权服务器可以提供许可证

可参考之前发布的一篇文章&#xff0c;帮助你远程登录&#xff1a;远程连接提示 由于没有远程桌面授权服务器提供许可证_计算机没有远程桌面客户端访问许可证_csdn_aspnet的博客-CSDN博客 虽然上述文章命令可以远程进入系统&#xff0c;但是每次都需要使用上述文章中的命令进入…

MySQL高级篇——索引的创建与设计原则

导航&#xff1a; 【黑马Java笔记踩坑汇总】JavaSEJavaWebSSMSpringBoot瑞吉外卖SpringCloud黑马旅游谷粒商城学成在线牛客面试题 目录 一、索引的分类与使用 1.1 索引的分类 1.1.1. 普通索引 1.1.2. 唯一性索引 1.1.3. 主键索引&#xff08;唯一非空&#xff09; 1.1.4…

Jetson Orin MultiMedia 使用总结

1.Jetson Orin /Xavier 对于图片的输入以及输出处理有一套特定的API。代码存放在/usr/src/jetson_multimedia_api中。 2.其中最主要的几个头文件&#xff1a;缓存管理申请 nvbufsurface.h 缓存转换 nvbufsurftransform.h 显示 nvosd.h 以及显示模块。 3.YUV转RGB来分析一下各…

开发人员应考虑使用 Edge浏览器的 8 个理由

1.无限访问ChatGPT 这是正确的。您可以通过 Bing 访问 GPT-4。但与 2021 年后没有数据的 ChatGPT 不同&#xff0c;必应通过从自己的搜索引擎中提取最新数据来对其进行补偿。 首先&#xff0c;点击Edge 浏览器左上角的Bing 小图标 Bing 具有三个选项卡&#xff1a;Chat、Compo…

VMware虚拟机安装黑苹果10.15 || AMD R7 5800处理器

VMwar版本&#xff1a;16Pro 链接&#xff1a;https://pan.baidu.com/s/1qGHEynWSV4YS9WSNonxiuA?pwdazvh 提取码&#xff1a;azvh macOS链接&#xff0c;版本为Catalina 10.5。这个版本后&#xff0c;os安装包就过10G了&#xff0c;会特别卡。 链接&#xff1a;https://pan…