360° 拖动旋转的角度计算原理

360° 拖动旋转的角度计算原理

简化的 正方形 div demo
专注讲清楚「点击 / 拖动如何计算角度」这个原理,没有精美 UI哦

  • 中间标注中心点
  • 鼠标点击或拖动时,计算当前位置相对于中心的角度
  • 在页面上实时显示角度

代码示例(原生 HTML + JS)

<!doctype html>
<html lang="zh-CN">
<head>
<meta charset="utf-8">
<title>角度计算原理 Demo</title>
<style>body { display:flex;align-items:center;justify-content:center;height:100vh;margin:0;font-family:sans-serif; }.box {width:300px; height:300px;border:2px dashed #888;position:relative;background:#f9f9f9;}.center {position:absolute;left:50%; top:50%;transform:translate(-50%,-50%);width:8px; height:8px;background:red; border-radius:50%;}.dot {position:absolute;width:10px; height:10px;background:blue; border-radius:50%;transform:translate(-50%,-50%);pointer-events:none;}.info {margin-top:20px; font-size:16px; text-align:center;}
</style>
</head>
<body><div class="wrap"><div class="box" id="box"><div class="center"></div><div class="dot" id="dot"></div></div><div class="info" id="info">点击或拖动蓝点,显示角度</div></div><script>
(function(){const box = document.getElementById('box');const dot = document.getElementById('dot');const info = document.getElementById('info');let dragging = false;function computeAngle(evt){const rect = box.getBoundingClientRect();const cx = rect.left + rect.width/2;const cy = rect.top + rect.height/2;const dx = evt.clientX - cx;const dy = evt.clientY - cy;// atan2: 右方为0°,逆时针为正。我们希望0°在正上方,顺时针为正。let raw = Math.atan2(dy, dx) * 180 / Math.PI;let angle = (raw + 450) % 360; return {angle, x:evt.clientX, y:evt.clientY};}box.addEventListener('mousedown', e=>{dragging = true;update(e);});window.addEventListener('mousemove', e=>{if(dragging) update(e);});window.addEventListener('mouseup', ()=> dragging=false);box.addEventListener('click', e=>{update(e);});function update(e){const {angle, x, y} = computeAngle(e);dot.style.left = (x - box.getBoundingClientRect().left) + 'px';dot.style.top = (y - box.getBoundingClientRect().top) + 'px';info.textContent = "角度: " + angle.toFixed(1) + "°";}
})();
</script>
</body>
</html>

工作原理

  1. 取中心点坐标

    const cx = rect.left + rect.width/2;
    const cy = rect.top + rect.height/2;
    
  2. 求向量 (dx, dy)

    const dx = evt.clientX - cx;
    const dy = evt.clientY - cy;
    
  3. 用 atan2 计算角度

    • Math.atan2(dy, dx) → 返回弧度,范围 -π ~ π,0° 在右侧,逆时针为正

    • 转换到度数并修正到「0° 在正上方,顺时针递增」:

      let raw = Math.atan2(dy, dx) * 180 / Math.PI;
      let angle = (raw + 450) % 360;
      
  4. 实时显示角度,同时让蓝点跟随鼠标。

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

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

相关文章

五分钟XML速成

原文链接&#xff1a; XML - Dive Into Python 3 深入探讨 本书几乎所有章节都围绕一段示例代码展开&#xff0c;但 XML 并非关于代码&#xff0c;而是关于数据。 XML 的一个常见用途是 “聚合提要”&#xff08;syndication feeds&#xff09;&#xff0c;用于列出博客、论坛…

如何直接访问docker容器中的端口服务而不需要改端口映射

查看docker容器对于宿主服务器的ip地址 docker inspect -f {{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}} $容器名 # 替换$容器名 为自己的启动docker内的服务&#xff0c;监听端口是否用信息 curl http://172.17.0.2:90有信息就可以直接通过该ip访问docker容器端口…

《Istio故障溯源:从流量劫持异常到服务网格的底层博弈》

服务网格常被企业视为微服务通信复杂性的“终极方案”。不少团队在部署Istio时,往往满足于“控制面启动、Sidecar注入成功”的表层验证,却忽视了底层机制与业务场景的深度适配—这种“重部署轻调优”的心态,往往为后续的生产故障埋下隐患。某大型金融机构的核心交易中台在接…

第24节:3D音频与空间音效实现

第24节&#xff1a;3D音频与空间音效实现 概述 3D音频是构建沉浸式体验的关键组件&#xff0c;它通过模拟真实世界中的声音传播特性&#xff0c;为用户提供空间感知和方向感。本节将深入探讨Web Audio API与Three.js的集成&#xff0c;涵盖空间音效原理、音频可视化、多声道处理…

一步搞清楚本地客户端和全局服务器是如何更新模型的

我们可以把它想象成一个 “老师”和“学生” 协作学习的过程。全局服务器 “老师”本地客户端 “学生”整个模型更新的过程遵循一个核心原则&#xff1a;“数据不动&#xff0c;模型动”。原始数据永远留在本地客户端&#xff0c;只有模型的参数&#xff08;即模型的“知识”…

跨平台超低延迟RTSP播放器技术设计探究

摘要 RTSP 播放在实验室里“跑起来”并不难&#xff0c;难的是在真实场景中做到 超低延迟、跨平台、高稳定&#xff0c;并长期可靠运行。大牛直播SDK&#xff08;SmartMediaKit&#xff09;的全自研跨平台 RTSP 播放栈&#xff0c;正是把这些工程难题转化为可用、可控、可交付的…

知识点汇集——web(三)

1.index.php 的备份文件名通常为index.php.bak 2.PHP2是服务器端脚本语言&#xff0c;主要用于处理和生成网页的内容&#xff0c;当用户访问一个网站时&#xff0c;PHP脚本会在服务器上执行&#xff0c;生成动态的HTML页面&#xff0c;然后将页面发送给用户的浏览器进行显示。p…

变频器【简易PLC】功能中的时间问题

一、变频器的简易PLC功能简易PLC功能是将提前设置好的多端速频率&#xff0c;进行自动运行&#xff0c;类似于PLC程序中的CASE指令一样&#xff0c;我们需要提前设置好几段频率&#xff0c;该频率所维持的时间&#xff0c;以及加减速时间&#xff0c;按下启动后&#xff0c;变频…

Swift 解题:LeetCode 372 超级次方(Super Pow)

文章目录摘要描述题解答案题解代码分析代码解析示例测试及结果时间复杂度空间复杂度总结摘要 在算法题里&#xff0c;有一些问题看似“简单”&#xff0c;比如算一个幂次方&#xff0c;但一旦放大规模就完全不同了。LeetCode 372 超级次方就是这样的题目。普通的幂运算没什么难…

揭秘23种设计模式的艺术与技巧之结构型

结构型模式&#xff1a;优化软件结构的策略代理模式&#xff08;Proxy Pattern&#xff09;代理模式就像一个经纪人&#xff0c;代表真实对象进行操作。比如&#xff0c;在网络访问中&#xff0c;我们可能会通过代理服务器来访问外部网站。在软件中&#xff0c;当一个对象由于某…

PyTorch图像数据转换为张量(Tensor)并进行归一化的标准操作

transform ToTensor() 是 PyTorch 中用于将图像数据转换为张量&#xff08;Tensor&#xff09;并进行归一化的标准操作&#xff0c;以下是对其功能的逐层解析及关键细节&#xff1a;核心功能总结功能描述类型转换将 PIL Image / numpy 数组 → PyTorch Tensor (dtype: torch.f…

HarmonyOS学习

一&#xff0c;DevEoc Studio基本内容学习项目工程目录entry 默认的项目入口模块ets 界面相关文件&#xff08;目前都放入pages文件内即可&#xff09;resource资源文件&#xff0c;配置文件index.est默认文件’ ‘开头的一般为装饰器&#xff0c;修饰功能&#xff0c;来约定后…

【大前端】Vue 和 React 主要区别

Vue 与 React 的主要区别 在前端开发领域&#xff0c;Vue 和 React 是两大最受欢迎的框架/库。尽管它们都可以帮助我们构建现代化的 Web 应用&#xff0c;但在设计理念、开发方式、生态系统等方面有许多不同。本文将从多个角度对两者进行对比。 目录 框架与库的定位核心理念…

高级RAG策略学习(五)——llama_index实现上下文窗口增强检索RAG

LlamaIndex上下文窗口实现详解 概述 本文档详细讲解基于LlamaIndex框架实现的上下文窗口RAG系统&#xff0c;重点分析关键步骤、语法结构和参数配置。 1. 核心导入与环境配置 1.1 必要模块导入 from llama_index.core import Settings from llama_index.llms.dashscope import …

Doris 数据仓库例子

基于 Apache Doris 构建数据仓库的方案和具体例子。Doris 以其高性能、易用性和实时能力&#xff0c;成为构建现代化数据仓库&#xff08;特别是 OLAP 场景&#xff09;的优秀选择。一、为什么选择 Doris 构建数据仓库&#xff1f;Doris&#xff08;原名 Palo&#xff09;是一个…

WebRTC进阶--WebRTC错误Failed to unprotect SRTP packet, err=9

文章目录 原因分析 SRTP Anti-Replay 机制 客户端源码 err=9 的定义: 为什么会触发 replay_fail ✅ 解决方向 原因分析 SRTP Anti-Replay 机制 SRTP 收包时会用一个 Replay Window(64/128个序列号大小)检查 seq 是否合理。 如果你构造的恢复包 recover_seq 比当前接收窗口…

Web服务与Nginx详解

文章目录前言一、Web 概念1.1 Web 的基本概念1.1.1 特点1.2 B/S 架构模型1.3 Web 请求与响应过程1.4 静态资源与动态资源1.5 Web 的发展阶段1.6 实验&#xff1a;搭建最小 Web 服务1.6.1 实验目标1.6.2 实验步骤1.7 小结二、HTTP 与 HTTPS 协议2.1 HTTP 与 HTTPS 的区别2.2 HTT…

CC-Link IE FB 转 DeviceNet 实现欧姆龙 PLC 与松下机器人在 SMT 生产线锡膏印刷环节的精准定位控制

案例背景在电子制造行业&#xff0c;SMT&#xff08;表面贴装技术&#xff09;生产线对设备的精准控制要求极高。某电子制造企业的 SMT 生产线中&#xff0c;锡膏印刷机、SPI&#xff08;锡膏厚度检测仪&#xff09;等前段设备采用了基于 CC-Link IE FB 主站的欧姆龙 NJ 系列 P…

IP5326_BZ 支持C同口输入输出的移动电源芯片 2.4A的充放电电流 支持4LED指示灯

IP5326 是一款集成升压转换器、锂电池充电管理、电池电量指示的多功能电源管理 SOC&#xff0c;为移动电源提供完整的电源解决方案。得益于 IP5326 的高集成度与丰富功能,使其在应用时仅需极少的外围器件&#xff0c;并有效减小整体方案的尺寸&#xff0c;降低 BOM 成本。IP532…

若依基础学习

若依基础学习 1.修改数据库密码以及连接名&#xff1a; RuoYi-Vue-master\ruoyi-admin\src\main\resources\application-druid.yml2.各个文件作用&#xff1a; ruoyi-admin (主启动)├── ruoyi-framework (框架核心)│ ├── ruoyi-common (通用工具)│ └── ruoyi-sy…