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
英文地址,請注明出處:http://en.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…