JavaScript-動畫與三角學

2020-12-12 Latekuki

三角學在動畫技術中被廣泛使用,不管是2D動畫亦或是3D動畫,都離不開三角學。

說到三角學,相信不少人會下意識地迴避數學與三角學,畢竟說起數學的種種邏輯與公式,腦袋就大了。事實上,我們不必過於擔心自己的數學不夠好而影響到動畫編程,大多數情況下,你可能只需處理好與位置、距離以及角相關的變量就行。

其實學習三角學最主要的是掌握各種邊與角的關係 ,而且實現基本動畫的90%的三角學知識都可歸結於兩個常用的三角函數:Math.sin 與 Math.cos。

1、角度與弧度

角的度量單位分別有角度和弧度兩大系統,對於角度系統,相信我們都不陌生。不過在衡量角的大小的時候,計算機卻更傾向於使用弧度的概念。所以無論喜歡與否,你都需要了解弧度。

2、canvas坐標系

常見的二維坐標系,其坐標原點(0,0)通常位於空間的正中心,x軸的坐標值向右以正數的形式不斷增大,向左以負數的形式 不斷減小,而y軸的坐標值向上以正數的形式不斷增大,向下以負數的形式不斷減小。

而canvas元素是基於視頻畫面的坐標系,其坐標原點(0,0)處在canvas畫布的左上角,x軸的坐標值從左往右不斷增大,y軸的坐標值是從上往下不斷增大。

標準坐標與canvas坐標

除了坐標系之外,在大多數系統中,角度的測量是以逆時針方向為正值的,0°表示一條線沿x軸正方向延伸。但在canvas元素中,順時針的角度才是正值,逆時針的角度反而成了負值。

常見的角度與canvas角度的不同

3、三角函數

三角函數是基本初等函數之一,是以角度為自變量,角度對應任意角終邊與單位圓交點坐標或其比值為因變量的函數。

常見的三角函數包括正弦函數、餘弦函數和正切函數。一般用於計算三角形中未知長度的邊和未知的角度。

(1)正弦

一個角的正弦表示與該角相對的直角邊與斜邊的比例。

在JavaScript中,使用Math.sin(angle) 函數計算正弦值。

如上圖顯示的是一個30°角的三角形,該30°角的對邊長度為1,斜邊長度為2,它們的比率是1 : 2,即1/2 或 0.5。因此,我們可以認為30°角的正弦值為0.5。

用 JavaScript 函數計算30°角正弦值如下:

計算正弦值

注意:在開始計算正弦值之前,第一步我們需要將角度值轉換為弧度值,然後再進行計算。

執行結果如下:

執行代碼後我們發現得到的是一串很長的浮點數,這是因為二進位電腦在表示浮點數時經常會出現的結果。我們可以四捨五入處理把它當作0.5即可。

但是在canvas坐標系中,垂直向上以及逆時針的角度均是負值,所以在上圖三角形中,角的對邊和角自身都是負值。

如此一來,對邊和斜邊的比例就變成了-1/2,即-0.5:

正弦值所對應的角度變成了-30°

(2)餘弦

一個角的正弦表示與該角相對的鄰邊與斜邊的比例。

在JavaScript中,使用Math.cos(angle) 函數計算餘弦值。

如上圖顯示的是一個30°角的三角形,該30°角的鄰邊相對於 角向右方向延伸,所以在x軸上長度是正值,長度為1.73,斜邊長度為2,它們的比率是1.73 : 2,即0.866。因此,我們可以認為-30°角的餘弦值為0.866。

用 JavaScript 函數計算該30°角餘弦值如下:

執行結果如下:

(3)正切

正切是另一個重要的三角函數,在 JavaScript 中通過函數Math.tan(angle) 表示,它表現的是對邊與鄰邊的關係。

用 JavaScript 函數計算該30°角正切值如下:

執行結果如下:

實際上,在日常的動畫代碼中很少用到正切,用得比較頻繁的主要是正弦和餘弦。

(4)反正切

為什麼不說反正弦和反餘弦呢?其實反正弦和反餘弦同正切一樣,在一般的動畫場景中不太用到,而在動畫開發中,反正切起的作用反而更大些。

反正切是正切的逆運算,輸入角的對邊和鄰邊的比率,通過計算反正切就可得到角的弧度。在 JavaScript 中通過函數Math.atan(ratio) 表示。

由上第3點正切可以看出,30°角的正切值是0.577(四捨五入),由此可根據正切值計算出對應角度如下:

注意:計算得到的是弧度值,需要把弧度轉換為角度。

執行結果如下:

一個接近30的值,即表示角度為30°

我們細心觀察就會發現這裡存在這樣一個問題:

如圖所示的4個三角形A、B、C、D,分別用正切函數

Math.atan(ratio)計算它們的正切值如下:

A:-1 / 2,即 -0.5,Math.atan(-0.5) = -26.57°B:1 / 2, 即 0.5,Math.atan(0.5) = 26.57°C:1 /(-2),即 -0.5,Math.atan(-0.5) = -26.57°D:(-1)/(-2),即 0.5,Math.atan(0.5) = 26.57°

(以上計算省略了弧度轉角度,默認計算出了角度)

我們可以看到,僅憑 Math.atan(-0.5) = -26.57°,是無法分辨這個三角形是A還是C,同理,B與D亦是無法分辨。

那麼是否就無法解決這個問題?非也!

在 JavaScript 中,還有另一個反正切函數:

Math.atan2(y, x)

該函數接受兩個參數:對邊與鄰邊的長度,從而計算出弧度的值,它的不同之處在於,得出的角度值是從x軸正軸開始以逆時針方向計算的。

這時我們用 Math.atan2(y, x) 計算A、B、C、D 這4個三角形的角度:

A:Math.atan2(-1, 2) = -26.57°B:Math.atan2(1, 2) = 26.57°C:Math.atan2(1, -2) = 153.43°D:Math.atan2(-1, -2) = -153.43°

由此我們可知,在canvas坐標系統中,我們所關注的三角形D的角度為 -153.43° 而不是 26.57°,由此我們就可以很方便的分辨出三角形A和C,B和D具體是哪一個了!

相關焦點

  • Javascript定時器與CSS動畫製作的區別
    大家是否還記得如何用CSS製作動畫呢?用javascript可不可以呢?答案是肯定的。今天,小編就給大家講講如何用javascript製作一個簡單的從左往右移動的動畫案例!在寫代碼之前,咱們先來認識一下新內容:定時器.一:什麼是定時器,常見的定時器有哪些?
  • 使用HTML5畫布實現的超棒javascript動畫儀錶板:gauge.js
    使用HTML5畫布實現的超棒javascript動畫儀錶板:gauge.js 在線演示今天我們分享來自guage.js的超棒動畫儀錶板實現,這個類庫使用
  • 三角學的歷史和現狀-水
    三角學的歷史和現狀簡介三角學簡稱三角,包括平面三角和球面三角。
  • 最強大、最牛逼的javascript視頻免費發布啦
    是一門非常強大的腳本語言,應用的範圍非常廣泛,每一個web開發者學好javascript也是必須的,本套視頻教程詳細的講解了javascript各個知識點、關鍵點,其中涉及到高深的函數概念、原型概念、接口概念、單體概念、更是詳細的講解了javascript設計模式。 本
  • 課本上學不到的三角學之正弦和餘弦
    很多中學生和大學生,一聽到「三角學」或者說「三角函數」,就覺得是一件非常頭疼的事情。
  • Windows 10計算器全新升級:三角學、函數聚合
    今天,微軟放出了Windows 10計算器應用的新版本,除了優化調整UI界面,還有一個重大變化,那就是聚合支持三角學、函數計算。新版計算器的界面中央位置增加了三角學(trigonometry)、函數(function)兩個按鈕,點開前者可以在下拉菜單裡一鍵使用sin、cos、tan、cot、sec、csc、hyp、2nd等八種三角計算,而點開後者則就能直接執行八種函數計算。
  • 使用jQuery的animate()+CSS樣式實現動畫效果及stop()停止動畫
    DOCTYPE html><html><head><title></title><script src="jquery-3.3.1.js"></script><script type="text/javascript
  • 七天學會javascript第一天javascript介紹
    javascript介紹javascript數據類型javascript運算符javascript對象javascriptDate對象javascript String對象JavaScript常用於實現一些前端效果。
  • 微軟Win10 計算器更新:全面支持三角學、 函數 (f)
    此更新增加了對三角學的全面支持,並顯示了集合之間的函數(f)關係。如下面的截圖所示,Windows計算器支持三角學中使用的角度的所有六個功能。
  • JQuery的動畫操作
    人工智慧時代的動畫壹 · JQuery的介紹Write less,Do more>1.Jquery是目前使用最為廣泛的javascript函數庫,jquery是一個函數庫,一個js文件,頁面用script標籤引入即可,<script type="text/javascript" src="jquery-3.4.1.js">2.JQuery
  • 三角學一題多解:從不同角度認識解三角形
    解題過程我們都是追求簡單化,這個題目算是三角學中常見的題目,其解題過程中運用的思維方式、解題思路等都是常規的思路,所以,也算是比較好的例題,希望能給您一些借鑑。高考專欄推薦熱文:1.高考真題:2019全國一卷第10題:巧用對稱性求解橢圓方程2.三角學的奧秘:再論2019廣西高考數學(理科)18題3.2019年廣西高考數學理科填空壓軸題解析(重發)4.2019高考卷一第七題:誘導公式+和差倍公式5.高考真題
  • JavaScript為什麼這麼難?
    只有真正的javascript程式設計師才知道javascript太難了。其他程式設計師都覺得javascript是門玩具語言。javascript太難了。難點javascript的真值表,可以體驗一下。javascript使用一種非主流的對象機制,基於原型鏈的對象繼承機制。這需要我們拋棄很多語言的Class的思想。認真研究下這個原型鏈。
  • JavaScript是什麼
    可以將javascript程序單獨保存在一個文件中,保存javascript程序的文件後綴名一定是「.js」,r然後在html文件中和部分通過mytest.js//在獨立的javascript文件中編寫程序代碼是不需要為了以後調試程序,輸出運行結果,判斷程序運行是否正常,找出錯誤並修改
  • javascript定時器
    在javascript中,定時器一共有兩個:setTimeout與setInterval例1:使用javascript彈出一個helloworld例2:過3秒後彈出一個helloworld3秒後彈出helloworld,只執行一次,默認情況下setTimeout
  • Javascript 生成器
    在 javascript 中,如果想要使用生成器,則需要: 定義特殊的生成器函數 調用該函數創建一個生成器對象 在循環中使用該生成器對象,或直接調用其 方法 我們以下面這個簡單的程序做為起點,並執行以下每個步驟:
  • javascript流程語句
    小案例:輸入兩個數,然後交換這兩個數,再輸出他們交換後的結果<script type="text/javascript">var num1 = 20;var num2 = 10;var tmp =num1;num1 = num2;num2 = tmp;alert(
  • 淺談javascript的分號
    javascript的分號代表語句的結束符,但由於javascript具有分號自動插入規則,所以它是一個十分容易讓人模糊的東西,在一般情況下,一個換行就會產生一個分號,但實際情況卻不然,也就是說在javascript中換行可能產生分號,也可能不產生,是否自動插入分號,主要看上下行。
  • 超酷的CSS3列表動畫特效在線生成工具 - liffect
    超酷的CSS3列表動畫特效在線生成工具 - liffect 在線調試  在線演示還記得我們曾經介紹過的開源CSS3動畫CSS文件animate.css
  • JavaScript 執行機制
    因為javascript是一門單線程語言,所以我們可以得出結論:看到這裡讀者要打人了:我難道不知道js是一行一行執行的?還用你說?我們真的要徹底弄明白javascript的執行機制了。1.關於javascriptjavascript是一門單線程語言,在最新的HTML5中提出了Web-Worker,但javascript是單線程這一核心仍未改變。所以一切javascript版的"多線程"都是用單線程模擬出來的,一切javascript多線程都是紙老虎!
  • 網頁性能之html css javascript
    前言html css javascript可以算是前端必須掌握的東西了,但是我們的瀏覽器是怎樣解析這些東西的呢 我們如何處理html css javascript這些東西來讓我們的網頁更加合理,在我這裡做了一些實驗,總結起來給大家看看。