JavaScript: 使用 atan2 來繪製 箭頭 和 曲線

来源:http://www.cnblogs.com/f1194361820/archive/2017/09/13/7517474.html
-Advertisement-
Play Games

最近搞Canvas繪圖,知道了JavaScript中提供了atan2(y,x)這樣一個三角函數。乍眼一看,不認識,畢竟在高中時,學過的三角函數有:sin,cos,arcsin,arccos,tan,arctan等,並沒有這個。而工作中又需要用到它,所以這裡就做了個簡單的瞭解。 何時需要用到 atan ...


最近搞Canvas繪圖,知道了JavaScript中提供了atan2(y,x)這樣一個三角函數。乍眼一看,不認識,畢竟在高中時,學過的三角函數有:sin,cos,arcsin,arccos,tan,arctan等,並沒有這個。而工作中又需要用到它,所以這裡就做了個簡單的瞭解。

 

  1. 在坐標系中理解tan 和atan
  2. 為何存在atan2 ?
  3. atan2 應用

 

 

 

在坐標系中理解tan atan

回顧一下三角函數tan

tanθ,用三角函數來表示時,它的值等於sinθ/cosθ,如果將其放到坐標系中,它的的值等價於:dy/dx。在坐標系中,任意兩個點所組成的直線,相對於x軸的斜率就是tanθ = dy /dx,相對於y軸的斜率就是dx/dy ,此時我們用cot來表示;其中,dy 是兩個點的y坐標的差值,dx是兩個點的x坐標的差值。

那麼坐標系內除了y軸,任何一個點(x,y),相對於x軸的斜率就是y-0/x-0,也即是y/x

 

我們將tanθ稱為一條直線相對於x軸的斜率,那麼θ就是相對於x軸的夾角(旋轉角度)了。

tan,是根據角度計算斜率的。那麼反過來 arctan(反正切)自然就認為是根據斜率來計算角度的。

 

為何存在atan2 ?

JavaScript中,提供了兩個arctan函數,一個是atan, 一個是atan2atan就是我們所熟知arctan。其實在很多編程語言中都提供了atan2

那麼atan2又是怎麼回事呢?

 

要知道這個,需要知道arctan的不足之處:

arctan的返回值範圍是(-π/2,  π/2) 不包括, ±π/2,也就是(兩個點組成的直線與x軸夾角是90°)90°是計算不出來的。為啥呢?在計算arctan ( dy/dx)時,如果兩個點(x1,y1),(x2,y2)組成的直線與x軸的夾角呈90°時,dx= x2-x1 = 0 0 是不能作為除數的,所以就無法計算這種情形。

值的範圍也就是計算的角度的範圍在(-π/2,  π/2),從坐標系來看,這個角度的範圍只能是在第14象限,並不能表示出第23象限的角。

 

為了彌補atan的不足,在電腦編程領域,引入了atan2函數,它的計算結果是在(-π,π]。它正好可以覆蓋整個坐標系,包括90°的情形。

 

它的計算過程是怎樣的呢?

關於這個,我從wikipedia上摘取了它的計算過程:

 

 

 

 

atan2的應用

在第一小節中的那張圖中的坐標系,是我們熟知的。在HTMLCanvas中,坐標系並不像我們熟知的坐標系那樣。它是這樣的:

 

x軸正向沿順時針方向,所經過的角度分別是0,π/2, π,3π/22π。

x軸正向沿逆時針方向,所經過的角度分別是0-π/2, -π,-3π/2-2π。

 

 

 

atan2的結果在(-π,π]之間,恰好一周,四個象限全覆蓋。從坐標系來看,順時針方向的值是正值,逆時針方向的值是負的。 

從坐標繫上來看,atan2結果是(0,-π)時就表示,從x軸正向逆時針方向轉最大 π弧度(180角度)。同理,(0,π)表示從x軸正向順時針轉最大π弧度(180角度)。

 

在第1)小節中說了atan可以用來計算平面坐標系內任意兩點的連線與x軸正向之間的夾角。而atan2atan的補充,那麼使用atan2自然就可以來計算平面坐標系內任意兩點的連線與x軸正向之間的夾角了。

 如果兩個點在第一象限內:

 

 

如果兩個點在第四象限內:

如果兩個點在不同的象限內,我們也可以平移來看。

 

 

何時需要使用atan2 ?

 

目前我遇到了兩種情況,是通過atan2來解決的:

1) 在平面坐標系內任意兩個點間畫一條帶有箭頭的直線(可以是單向箭頭,可以是雙向箭頭)。在這個需求中,另外也知道了箭頭的一條邊與直線的夾角和箭頭的長度。

這個需求的難點就是要計算出箭頭的另外兩個點坐標。

2) 在平面坐標系內任意兩個點之間畫一條指定曲率的曲線(arc)。在這個需求中,要計算arc,自然要知道radius, startAngle, endAngle,圓心坐標。可以根據曲率來計算出半徑等,但是難點在計算圓心坐標。

 

這兩個需求的共同特點是:

1)兩個已知的點

2)根據這兩個點和其他的條件去計算一些必須的(畫line,arc等必須的)點坐標。

 

目前我遇到了這兩種需求,都通過atan2來解決的。其他的情況,目前尚且未知,待後續發現時,補充上。

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 前面的話 本文將詳細介紹SVG基本操作API,並使用這些API製作實例效果 基礎API 在javascript中,可以使用一些基本的API來對SVG進行操作 【NS地址】 因為SVG定義在其自身的命令空間下,而不是HTML的命名空間下,可以作為單獨的XML文件存在。所以需要使用自身的NS地址 有兩個 ...
  • 做項目碰到問題:記錄之 問題: 如上圖中“新職”下的紅色線條該如何實現,開始嘗試將新職用一個span包裹起來 這樣實現的效果會長於UI圖中的效果。 解決辦法: 1 可以新設一個span 設置disblay: block, 然後在下方位置上設置長度寬度顏色,在細微調整位置。 2.https://www ...
  • 我們接著上文繼續,本文我們講解兄弟組件的通信,項目結構還是跟上文一樣. 在src/assets目錄下建立文件EventHandler.js,該文件的作用在於給同級組件之間傳遞事件 EventHandler.js代碼: 2,在Components目錄下新建一個組件Brother1.vue 。通過Eve ...
  • 我們在一些網站中可以見到一款網頁編輯器——markdown; 這是一款功能強大的富文本編輯器,之前自己在網頁上使用的時候遇到了一點點的問題,現在跟大家分享下 在我們寫了文章之後是需要將內容保存到資料庫的,如果保存到資料庫中要方便以後需改的話,那麼需要保存成markdown語言,如果保存成html語言 ...
  • 在git命令行下,執行以下命令完成環境的搭建: 1,npm install --global vue-cli 安裝vue命令行工具 2,vue init webpack vue-demo 使用vue命令生成一個webpack項目,項目名稱為vue-demo 3,cd vue-demo 切入項目 4, ...
  • 一,Rest and Spread操作符: 用來聲明任意數量的方法參數也就是“...”操作符 輸出結果: 18 jajj 89 function test (a, b, c) { console.log(a); console.log(b); console.log(c); } var agrs = ...
  • 用JS編寫一個函數,返回數組中重覆出現過的元素,見下麵的代碼: 而數組去重的方法詳見我的另一篇博文-->數組去重 ...
  • 1、對象集合 cells[] 返回包含表格中所有單元格的一個數組 rows[] 返回包含表格中所有行的一個數組 tBodies[] 返回包含表格中所有tbody的一個數組(主包含ty和td) 2、對象屬性 border 設置或返回表格邊框的寬度 caption 對錶格的caption元素的引用 ce ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...