Js 跟手轉動的羅盤指標

2021-09-11 10:00:36 字數 1245 閱讀 9463

或許跟手拖拽已經足夠普遍,可是跟手沿著圓弧轉動的羅盤指標,卻依然足夠挑戰,先來看看我們要實現的小目標,檢視效果(請用手機開啟,或者用chrome的手機模式開啟)

一、 跟手拖拽的一般套路

touchstart 的時候記錄初始位置:ox,oy

touchmove 的過程中移動到新的位置:x = x1-ox, y = x1 - oy

touchend 的時候,這步好像也不需要幹啥

二、圓弧轉盤轉動的一般做法

設定圓心轉動的原點

動態的修改旋轉的角度(或者弧度)

三、合二為一

如何將手勢動作反應到圓弧的角度或者弧度變更上,這是問題的癥結所在,起初我也為此而困頓不已

先是通過設定某一位移而旋轉固定的角度,但是很難確定圓弧的有效位移,就算確定了有效位移,當旋轉到一百八十度之後也矇圈,反著動了~~

而且這種不均勻的運動實在也難以服眾

糾結之際,我拿起了紙和筆,重新尋找靈感:

注意到紅色的點是圓心,綠色的點是 touchstart 時候記錄下的起始點,藍色的點是 touchmove 的過程中不斷變化的目標點。我們的目標很明確,計算指標變化的角度(或弧度),用我僅有的初中數學知識思考得知,知道三角形的每個頂點,是可以求出每個頂角的角度。運用三角形的餘弦定理,求弧度值:

//獲得point2頂角的弧度值

//point1傳入起始點,point2傳入圓心,point3傳入結束點,可求得指標運動的夾角弧度

function getangle(point1, point2, point3) 複製**

剛才只考慮了順時針的情況,不能忽略逆時針的方向:

這種情況的弧度值為 -getangle(point1, point2, point3),這並不難理解,難點在於如何判斷到底是逆時針還是順時針,可以通過如下的面積量的方法來判斷順時針還是逆時針

//通過面積量的方法來判斷順時針還是逆時針

//point1傳入圓心,point2傳入起始點,point3傳入終點

function duration(point1, point2, point3) else if(sp<0) ="" else="" 0;="" }<="" code="">0)>複製**

go ~~

js 特效,有時候**不需要很多,但是找到其中的規律再轉化為機器認識的語言絕非易事,難就難在這個數學建模的過程,需要一點想象力,可以給予的經驗就是,拿起你的筆和紙,去畫,靈感自來

JS中this的指向,箭頭函式this的指向

除箭頭函式外函式的this在其執行時才被確定,指向其呼叫者。例如let obj let fn obj.b obj.b obj 2fn window undefined 等價window.fn 第一種情況下該函式是被obj物件呼叫的,this指向obj物件 第二種情況下該函式是被window物件呼叫的...

劍指offer 樹的深度非遞迴JS

題目描述 輸入一棵二叉樹,求該樹的深度。從根結點到葉結點依次經過的結點 含根 葉結點 形成樹的一條路徑,最長路徑的長度為樹的深度 思路 使用層次遍歷,在每一層節點的末尾加上標記0,每次出佇列遇到標記0,深度 1 關鍵點是最後乙個標記,此時隊列為空,要特判 function treedepth pro...

劍指offer 鍊錶中環的入口節點(JS實現)

題目描述 給乙個鍊錶,若其中包含環,請找出該鍊錶的環的入口結點,否則,輸出null。思路 function entrynodeofloop phead 分別定義快慢指標 let fast phead.next.next let slow phead.next while fast slow else...