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

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.xdnf.cn/news/1470997.html

相关文章:

  • LangChain: Memory
  • 嵌入式学习日记(41)串口
  • 数据库(基础操作)
  • 载流子寿命
  • 基于FPGA实现CRC校验码算法(以MODBUS中校验码要求为例)verilog代码+仿真验证
  • Python命令行选项(flags)解析
  • 漫画布局面板设计系统
  • 事务管理的选择:为何 @Transactional 并非万能,TransactionTemplate 更值得信赖
  • 从Java全栈到前端框架:一位程序员的实战之路
  • NestJS 整合 Redis 特性详解
  • 2025年统计与数据分析领域专业认证发展指南
  • [TryHackMe]Wordpress: CVE-2021-29447(wp漏洞利用-SSRF+WpGetShell)
  • harmony 中集成 tuanjie/unity
  • Leetcode每日一练--20
  • ESP-IDF串口中断接收
  • 概率论第二讲——一维随机变量及其分布
  • 广告投放全链路解析
  • B.50.10.01-消息队列与电商应用
  • PyInstaller完整指南:将Python程序打包成可执行文件
  • Nacos中yaml文件新增配置项不规范导致项目启动失败
  • 在 CentOS 上完整安装 Docker 指南
  • SQLServer死锁监测方案:如何使用XE.Core解析xel文件里包含死锁扩展事件的死锁xml
  • LightDock.server liunx 双跑比较
  • 消息队列-ubutu22.04环境下安装
  • 激光雷达与IMU时间硬件同步与软件同步区分
  • 深度学习之第八课迁移学习(残差网络ResNet)
  • ChartGPT深度体验:AI图表生成工具如何高效实现数据可视化与图表美化?
  • RequestContextFilter介绍
  • 53.【.NET8 实战--孢子记账--从单体到微服务--转向微服务】--新增功能--集成短信发送功能
  • 《C++变量命名与占位:深入探究》