当前位置: 首页 > article >正文

掌握 JavaScript 旋转技术

1. 基本概念

1.1 角度与弧度

在讨论旋转之前,首先需要了解角度和弧度的概念:

  • 角度:通常用度数表示,一个圆周为360度。
  • 弧度:数学上更常用的角度单位,一个圆周为2π弧度。

在JavaScript中,大多数三角函数(如Math.sin()Math.cos())使用的是弧度而不是度数。因此,在进行旋转计算时,经常需要在两者之间进行转换。

转换公式:
function degreesToRadians(degrees) {return degrees * (Math.PI / 180);
}function radiansToDegrees(radians) {return radians * (180 / Math.PI);
}

1.2 旋转矩阵

在二维平面上,旋转可以通过旋转矩阵来描述。给定一个点 (x, y) 和旋转角度 θ(以弧度表示),新的坐标 (x', y') 可以通过以下公式计算:

x' = x * cos(θ) - y * sin(θ)
y' = x * sin(θ) + y * cos(θ)

在三维空间中,旋转变得更加复杂,通常使用四元数或旋转矩阵来表示旋转。


2. 使用 CSS 实现旋转

2.1 CSS Transform 属性

CSS 提供了 transform 属性来实现元素的旋转。最常用的旋转方式是使用 rotate() 函数。

示例:
.rotate {transform: rotate(45deg); /* 顺时针旋转45度 */
}
结合JavaScript动态设置:
const element = document.querySelector('.rotate');
element.style.transform = 'rotate(90deg)';

2.2 三维旋转

除了二维旋转,CSS还支持三维旋转,可以使用 rotateX(), rotateY(), rotateZ()rotate3d() 函数。

示例:
.rotate3d {transform: rotateX(45deg) rotateY(45deg) rotateZ(45deg);
}

3. 使用 Canvas 实现旋转

HTML5 的 <canvas> 元素提供了一个强大的绘图API,可以用来绘制和操作图像、形状等。在Canvas中,旋转主要通过 context.rotate() 方法实现。

3.1 基本旋转

const canvas = document.getElementById('myCanvas');
const ctx = canvas.getContext('2d');// 保存当前状态
ctx.save();// 平移到画布中心
ctx.translate(canvas.width / 2, canvas.height / 2);// 旋转45度(弧度)
ctx.rotate(degreesToRadians(45));// 绘制一个矩形
ctx.fillStyle = 'blue';
ctx.fillRect(-50, -50, 100, 100);// 恢复到之前的变换状态
ctx.restore();

3.2 复杂变换

结合平移、缩放和旋转,可以实现复杂的变换效果。

示例:
ctx.save();
ctx.translate(100, 100); // 平移到指定位置
ctx.scale(2, 2);         // 缩放
ctx.rotate(degreesToRadians(45)); // 旋转
ctx.fillStyle = 'red';
ctx.fillRect(-50, -50, 100, 100); // 绘制一个矩形
ctx.restore();

4. 使用 SVG 实现旋转

SVG(可缩放矢量图形)是一种基于XML的图形格式,广泛用于Web上的矢量图形绘制。SVG支持通过 transform 属性来实现旋转。

4.1 基本旋转

<svg width="200" height="200"><rect x="50" y="50" width="100" height="100" fill="blue" transform="rotate(45, 100, 100)" />
</svg>

rotate(45, 100, 100) 表示将矩形绕其中心点 (100, 100) 旋转45度。

4.2 动态旋转

通过JavaScript动态修改SVG元素的 transform 属性,可以实现动画效果。

示例:
<svg id="mySvg" width="200" height="200"><rect id="myRect" x="50" y="50" width="100" height="100" fill="blue" />
</svg><script>const rect = document.getElementById('myRect');let angle = 0;function rotateRect() {angle += 1;if (angle >= 360) angle -= 360;rect.setAttribute('transform', `rotate(${angle}, 100, 100)`);requestAnimationFrame(rotateRect);}rotateRect();
</script>

5. 高级技巧

5.1 矩阵变换

在Canvas中,可以使用变换矩阵来实现更复杂的旋转和平移操作。context.setTransform()context.transform() 方法允许你直接操作变换矩阵。

示例:
const canvas = document.getElementById('myCanvas');
const ctx = canvas.getContext('2d');// 设置变换矩阵
ctx.setTransform(Math.cos(degreesToRadians(45)), Math.sin(degreesToRadians(45)),-Math.sin(degreesToRadians(45)), Math.cos(degreesToRadians(45)),canvas.width / 2, canvas.height / 2
);// 绘制一个矩形
ctx.fillStyle = 'green';
ctx.fillRect(-50, -50, 100, 100);

5.2 三维旋转

虽然CSS和Canvas支持三维旋转,但在WebGL中可以实现更复杂的三维图形和动画。WebGL是一个低级别的图形API,适用于高性能的3D渲染。

示例:
const vertexShaderSource = `attribute vec4 a_position;uniform mat4 u_matrix;void main() {gl_Position = u_matrix * a_position;}
`;const fragmentShaderSource = `precision mediump float;void main() {gl_FragColor = vec4(1, 0, 0, 1); // 红色}
`;// 初始化WebGL上下文
const canvas = document.getElementById('myCanvas');
const gl = canvas.getContext('webgl');// 创建着色器程序
function createShader(gl, type, source) {const shader = gl.createShader(type);gl.shaderSource(shader, source);gl.compileShader(shader);if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {console.error(gl.getShaderInfoLog(shader));gl.deleteShader(shader);return null;}return shader;
}const vertexShader = createShader(gl, gl.VERTEX_SHADER, vertexShaderSource);
const fragmentShader = createShader(gl, gl.FRAGMENT_SHADER, fragmentShaderSource);const program = gl.createProgram();
gl.attachShader(program, vertexShader);
gl.attachShader(program, fragmentShader);
gl.linkProgram(program);
if (!gl.getProgramParameter(program, gl.LINK_STATUS)) {console.error(gl.getProgramInfoLog(program));
}gl.useProgram(program);// 设置顶点数据
const positionBuffer = gl.createBuffer();
gl.bindBuffer(gl.ARRAY_BUFFER, positionBuffer);
const positions = [0, 0,0, 0.5,0.7, 0,
];
gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(positions), gl.STATIC_DRAW);const positionAttributeLocation = gl.getAttribLocation(program, "a_position");
gl.enableVertexAttribArray(positionAttributeLocation);
gl.vertexAttribPointer(positionAttributeLocation, 2, gl.FLOAT, false, 0, 0);// 创建旋转矩阵
function createRotationMatrix(angleInRadians) {return [Math.cos(angleInRadians), Math.sin(angleInRadians),-Math.sin(angleInRadians), Math.cos(angleInRadians),];
}const matrixLocation = gl.getUniformLocation(program, "u_matrix");function render(time) {time *= 0.001; // 将时间转换为秒const angleInRadians = time * Math.PI * 2 / 3; // 三秒一圈const rotationMatrix = createRotationMatrix(angleInRadians);gl.uniformMatrix4fv(matrixLocation, false, new Float32Array([...rotationMatrix, 0, 0,0, 0, ...rotationMatrix, 0,0, 0, 0, 0, 1]));gl.clear(gl.COLOR_BUFFER_BIT);gl.drawArrays(gl.TRIANGLES, 0, 3);requestAnimationFrame(render);
}requestAnimationFrame(render);

相关文章:

掌握 JavaScript 旋转技术

1. 基本概念 1.1 角度与弧度 在讨论旋转之前&#xff0c;首先需要了解角度和弧度的概念&#xff1a; 角度&#xff1a;通常用度数表示&#xff0c;一个圆周为360度。弧度&#xff1a;数学上更常用的角度单位&#xff0c;一个圆周为2π弧度。 在JavaScript中&#xff0c;大多…...

力扣-贪心-968 监控二叉树

思路 用true和false作为放置了摄像头&#xff0c;会有局限&#xff0c;就是没法判断以下情况 所以要用数字代表三种状态 2&#xff1a;有覆盖1&#xff1a;有摄像头0&#xff1a;无覆盖 两个节点都被覆盖时&#xff0c;要返回0 两个节点有一个无覆盖就要返回1 两个…...

从零开始搭建你的第一个HBase项目:实战经验分享

从零开始搭建你的第一个HBase项目&#xff1a;实战经验分享 数据洪流中的你&#xff0c;准备好了吗&#xff1f; 在大数据时代&#xff0c;数据量的增长速度令人咋舌。面对海量的数据&#xff0c;如何高效地存储、管理和分析成为了一个亟待解决的问题。今天&#xff0c;我们将…...

计算机毕业设计SpringBoot+Vue.js智慧社区(源码+文档+PPT+讲解)

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…...

Elasticsearch 的分布式架构原理:通俗易懂版

Elasticsearch 的分布式架构原理&#xff1a;通俗易懂版 Lucene 和 Elasticsearch 的前世今生 Lucene 是一个功能强大的搜索库&#xff0c;提供了高效的全文检索能力。然而&#xff0c;直接基于 Lucene 开发非常复杂&#xff0c;即使是简单的功能也需要编写大量的 Java 代码&…...

每日一题之混乱的草稿纸

问题描述 一年一度的蓝桥杯省赛即将开赛&#xff0c;小蓝卧薪尝胆&#xff0c;目标直指省一。 为了实现这个宏伟目标&#xff0c;小蓝偷偷准备了一份 NN 行的代码模板&#xff0c;分别写在 NN 张草稿纸上&#xff08;每张草稿纸上都写有一行代码&#xff0c;并用 11 到 NN 的…...

【redis】数据类型之hyperloglog

Redis的HyperLogLog&#xff08;HLL&#xff09;是一种高效的概率数据结构&#xff0c;也是一种基于字符串的数据结构&#xff0c;用于估计大数据集的唯一元素数量&#xff08;基数统计&#xff09;。它通过极低的内存占用&#xff08;约 12KB&#xff09;实现接近线性的时间复…...

在 compare-form.vue 中添加 compareDate 隐藏字段,并在提交时自动填入当前时间

在 compare-form.vue 中添加 compareDate 隐藏字段&#xff0c;并在提交时自动填入当前时间。 提交表单时存入的对象是FakeRegistration&#xff0c;这个对象里面有compareDate字段&#xff0c;刚好表格查询的对象也是FakeRegistration&#xff0c;所以表格展示的时间就是刚才…...

Chat2File - DeepSeek Chat 导出助手:解决deepseek对话导出问题,提升开发效率

Chat2File - DeepSeek Chat 导出助手&#xff1a;解决deepseek对话导出问题&#xff0c;提升开发效率 大家好久不见&#xff0c;最近这段时间一直在开发一些项目&#xff0c;今天给大家带来一款刚在 Edge 成功上线的实用插件 ——Chat2File - DeepSeek Chat 导出助手。作为开发…...

MEMS光纤麦克风传感器特色解析

概念原理 光纤麦克风是利用光纤作为传光介质和传感元件&#xff0c;将声音信号转换为光信号&#xff0c;并通过对光信号的检测和处理来获取声音信息的设备。它区别于传统基于电信号转换的麦克风&#xff0c;利用光的特性来实现声音的传感与传输。  原理&#xff1a;声音引起敏…...

LLC谐振变换器恒压恒流双竞争闭环simulink仿真

1.模型简介 本仿真模型基于MATLAB/Simulink&#xff08;版本MATLAB 2017Ra&#xff09;软件。建议采用matlab2017 Ra及以上版本打开。&#xff08;若需要其他版本可联系代为转换&#xff09;针对全桥LLC拓扑&#xff0c;利用Matlab软件搭建模型&#xff0c;分别对轻载&#xf…...

山东大学软件学院ai导论实验之生成对抗网络

目录 实验目的 实验代码 实验内容 实验结果 实验目的 基于Pytorch搭建一个生成对抗网络&#xff0c;使用MNIST数据集。 实验代码 import torch import torch.nn as nn import torch.optim as optim from torchvision import datasets, transforms from torch.utils.data…...

C++ Qt常见面试题(2):QT中的文件流(QTextStream)和数据流(QDataStream)的区别

在 Qt 中,QTextStream 和 QDataStream 是两种常用的流类,用于通过文件或其他 I/O 设备(如网络、内存)读写数据。虽然它们都可以用来操作数据,但它们的设计目标和使用场景不同。以下是它们的主要区别和适用场景的详细说明: 1. QTextStream:文本流 QTextStream 是一种专门…...

入门网络安全工程师要学习哪些内容【2025年寒假最新学习计划】

&#x1f91f; 基于入门网络安全/黑客打造的&#xff1a;&#x1f449;黑客&网络安全入门&进阶学习资源包 大家都知道网络安全行业很火&#xff0c;这个行业因为国家政策趋势正在大力发展&#xff0c;大有可为!但很多人对网络安全工程师还是不了解&#xff0c;不知道网…...

【论文解读】《C-Pack: Packed Resources For General Chinese Embeddings》

论文链接&#xff1a;https://arxiv.org/pdf/2309.07597 本论文旨在构建一套通用中文文本嵌入的完整资源包——C-Pack&#xff0c;解决当前中文文本嵌入研究中数据、模型、训练策略与评测基准缺失的问题。论文主要贡献体现在以下几个方面&#xff1a; 大规模训练数据&#xf…...

Cramér-Rao界:参数估计精度的“理论底线”

Cramr-Rao界&#xff1a;参数估计精度的“理论底线” 在统计学中&#xff0c;当我们用数据估计一个模型的参数时&#xff0c;总希望估计结果尽可能精确。但精度有没有一个理论上的“底线”呢&#xff1f;答案是有的&#xff0c;这就是Cramr-Rao界&#xff08;Cramr-Rao Lower …...

ClickHouse 的分区、分桶和分片详解

在大数据场景下&#xff0c;数据的存储和查询效率至关重要。ClickHouse 作为一款高性能的列式存储数据库&#xff0c;提供了多种数据组织方式来优化存储和查询&#xff0c;其中最常见的就是 分区&#xff08;Partition&#xff09;、分桶&#xff08;Sampling&#xff09;、分片…...

【操作系统、数学】什么是排队论?如何理解排队论?排队论有什么用处?Queueing Theory?什么是 Little’s Law?

排队论&#xff08;Queueing Theory&#xff09;是研究系统中排队现象的数学理论&#xff0c;旨在分析资源分配、服务效率及等待时间等问题。它广泛应用于计算机科学、通信网络、交通规划、工业工程等领域。 【下文会通过搜集的资料&#xff0c;从各方面了解排队论&#xff0c…...

2209. 用地毯覆盖后的最少白色砖块

2209. 用地毯覆盖后的最少白色砖块 题目链接&#xff1a;2209. 用地毯覆盖后的最少白色砖块 代码如下&#xff1a; class Solution { public:int minimumWhiteTiles(string floor, int numCarpets, int carpetLen) {vector<vector<int>>memo (numCarpets 1, vec…...

DeepSeek赋能大模型内容安全,网易易盾AIGC内容风控解决方案三大升级

在近两年由AI引发的生产力革命的背后&#xff0c;一场关乎数字世界秩序的攻防战正在上演&#xff1a;AI生成的深度伪造视频导致企业品牌声誉损失日均超千万&#xff0c;批量生成的侵权内容使版权纠纷量与日俱增&#xff0c;黑灰产利用AI技术持续发起欺诈攻击。 与此同时&#…...

(0)阿里云大模型ACP-考试回忆

这两天通过了阿里云大模型ACP考试&#xff0c;由于之前在网上没有找到真题&#xff0c;导致第一次考试没有过&#xff0c;后面又重新学习了一遍文档才顺利通过考试&#xff0c;这两次考试内容感觉考试题目90%内容是覆盖的&#xff0c;后面准备分享一下每一章的考题&#xff0c;…...

0.【深度学习YOLOV11项目实战-项目安装教程】(图文教程,超级详细)

目录 前言一、安装Pycharm&#xff08;安装过Pycharm的跳过这一步&#xff09;1.1 点击下述链接直接跳转到教程页面进行安装 二、安装Anaconda&#xff08;安装过Anaconda的跳过这一步&#xff09;2.1 点击下述链接直接跳转到教程页面进行安装 三、后续安装教程&#xff08;有N…...

Docker 部署 Jenkins持续集成(CI)工具

[TOC](Docker 部署 Jenkins持续集成(CI)工具) 前言 Jenkins 是一个流行的开源自动化工具&#xff0c;广泛应用于持续集成&#xff08;CI&#xff09;和持续交付&#xff08;CD&#xff09;的环境中。通过 Docker 部署 Jenkins&#xff0c;可以简化安装和配置过程&#xff0c;并…...

布署elfk-准备工作

建议申请5台机器部署elfk&#xff1a; filebeat(每台app)--> logstash(2台keepalived)--> elasticsearch(3台)--> kibana(部署es上)采集输出 处理转发 分布式存储 展示 ELK中文社区: 搜索客&#xff0c;搜索人自己的社区 官方…...

uniapp 小程序如何实现大模型流式交互?前端SSE技术完整实现解析

文章目录 一、背景概述二、核心流程图解三、代码模块详解1. UTF-8解码器&#xff08;处理二进制流&#xff09;2. 请求控制器&#xff08;核心通信模块&#xff09;3. 流式请求处理器&#xff08;分块接收&#xff09;4. 数据解析器&#xff08;处理SSE格式&#xff09;5. 回调…...

微软推出Office免费版,限制诸多,只能编辑不能保存到本地

易采游戏网2月25日独家消息&#xff1a;微软宣布推出一款免费的Office版本&#xff0c;允许用户进行基础文档编辑操作&#xff0c;但限制颇多&#xff0c;其中最引人关注的是用户无法将文件保存到本地。这一举措引发了广泛讨论&#xff0c;业界人士对其背后的商业策略和用户体验…...

《ArkTS鸿蒙应用开发入门到实战》—新手小白学习鸿蒙的推荐工具书!

《ArkTS鸿蒙应用开发入门到实战》—新手小白学习鸿蒙的推荐工具书&#xff01; 在科技日新月异的今天&#xff0c;鸿蒙操作系统&#xff08;HarmonyOS&#xff09;作为华为推出的全新操作系统&#xff0c;正迅速进入越来越多的智能设备&#xff0c;成为物联网和智能硬件领域的…...

销售成交九步思维魔方

销售成交九步思维魔方 点 一、确定需求 原则1&#xff1a;问题是需求的前身原则2&#xff1a;基于问题才做决定原则3&#xff1a;人只解决大的问题 二、塑造价值 USP 利益 快乐 痛苦 价值 线 三、销售准备 精神上的准备 体能上的准备 产品知识准备 彻底了解顾客背景 …...

橄榄球、棒球项目排名·棒球1号位

美国四大体育联盟按照规模、影响力等因素综合排名&#xff0c;通常认为是&#xff1a; 1. NFL&#xff08;国家橄榄球联盟&#xff09;&#xff1a;成立于1920年&#xff0c;是北美四大职业体育运动联盟之首&#xff0c;也是世界上最大的职业美式橄榄球联盟。由32支球队组成&am…...

DeepSeek 提示词:高效的提示词设计

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家&#xff0c;历代文学网&#xff08;PC端可以访问&#xff1a;https://literature.sinhy.com/#/?__c1000&#xff0c;移动端可微信小程序搜索“历代文学”&#xff09;总架构师&#xff0c;15年工作经验&#xff0c;精通Java编…...