javascript三角函數的使用

來源:互聯網
上載者:User

標籤:

其實很多程式設計語言裡面都有數學函數,而且很多數學函數包括三角函數,只不過有些時候可能我們用的並不多,我最近在做一個h5的遊戲,其中有一個需求就是射擊的槍支需要更隨滑鼠變換位置,滑鼠移動到什麼地方,炮口就要指向那個方位,剛開始一直不能理解,後來朋友提供了思路,其實使用的就是javascript裡面的三角函數。

  首先呢,我們複習一下高中時候學習的三角函數的的基本知識吧,我這裡介紹其中幾個簡單的,第一個是sin函數,第二個是cos函數 ,第三個是tan函數,四四個是atan函數,sin函數在數學裡面其實是一個三角形的對邊比上斜邊得出的值,我們來看一個映像,那麼cos30=x/r,cos函數是臨邊比上斜邊,tan30=y/x,tan函數則是對邊比上臨邊,通過這些公式,我們可以很容易的得到這個三角函數的值,然後就闊以拿這些值去做有意思的事情啦!!

  那麼我們在javascript裡面的三角函數和數學中的三角函數其實有一點區別外,第一是寫發上不一樣,js裡面三角函數都是靜態方法,必須使用Math來調用,三個函數分別是Math.sin(),Math.cos(),Math.tan()。這個很容易理解咯,那麼第二個不同就是數學裡面的三角函數使用接受的參數是角度,但是在js裡面所接受的參數是弧度,有的朋友可能暈了,弧度角度什麼玩意???不要著急,這裡簡單介紹一下,我們首先來看一個圓,,如果一個圓的一段邊的長度等於這個圓的半徑長度,那麼這段邊就代表一弧度,正中紅色部分,就代表一弧度,這個其實僅僅就是一個概念,我們真正要使用的是吧我們想要的角度轉化成弧度,這裡直接套用數學公公式  1角度=π/180  那麼10個角度就等於10*π/180啦,那我們要用js的Math.sin()算出30度角等於多少,那麼就應該寫成Math.sin(30*Math.PI/180),這裡注意一下js裡面的π是Math.PI。相信大家看到這裡對js的三角函數肯定有一些瞭解咯,那麼接下來我們來看一個實際的小例子吧。

  首先呢,有一個需求。頁面上有一個小球,我希望當我的滑鼠放到頁面上時候,我的滑鼠移動到那裡。小球就會移動到對應的位置,注意,不是移動到滑鼠所在的位置,而是對應的位置,這裡不好髮網址,發個圖看看吧。其中,紅色小球代表一個槍口。藍色的小球代表滑鼠的位置,當滑鼠放置到頁面不同位置的時候,紅色的小球就會移動到相應的角度上與之對應,但是我們也看到有一個r,表示在平面的範圍呢,紅色小球能夠移動的範圍,實際上就是一個圓的半徑,如果這個r越大,那麼小球移動的範圍就越大啦!!(不理解的朋友先把下面的例子複製出來運行一下就可以了)

  這個功能的實現就需要我們使用三角函數來完成,檢測滑鼠的位置並且是在360度的範圍上來檢測,這裡就需要通過角度就算出紅色小球的距離左邊值和距離上邊的值,然後賦值給小球就闊以啦!!我們再來看一張圖,現在要做的就是如何擷取t的值和l的值,我們剛才已經說了小球運動是有範圍的,這個範圍其實就是一個圓,而半徑的大小決定小球運動範圍的大小,所以呢這個半徑是我們自己定義的,隨你定義多少都闊以,當然太小了可能效果就不是那麼明顯了,因此圖中的r我們其實已經知道了,我們就定義成100吧,接下來我們看一個推導公式  sin30=t/r 那麼t=sin30*r   cos30=l/r  那麼l=cos30*r,怎麼樣?有木有很激動,就是這樣算出來的!!但是問題來了,這個角度該怎麼得到呢,剛才我們只是隨意隨意寫了個角度來推導,而事實上我們的滑鼠在不停的移動,角度自然也是在不停的變化啦,我們看一下中的大三角形,看準了,是紅色的大三角形,不是藍色的小三角形哦!這個大三角形對應的邊分別是a邊和b邊,只要我們得到a邊和b邊的長度,然後用反正切函數atan(a/b)就可以得到滑鼠與球的夾角啦,這個反正切函數Math.atan(),接受一個參數,就是對邊比上臨邊的值,他會更具這個值返回對應的弧度,這個弧度就是我們需要的咯,那麼這個a和b怎麼算出來了,這個就簡單了,我們通過js可以很容易擷取到滑鼠距離上邊和左邊的距離,然後又能擷取到小球距離左邊和上邊的距離,我們把滑鼠距離上邊的距離減去小球距離上邊的距離,然後取一個絕對值,不就是ad的值了嘛,吧=把滑鼠距離左邊的距離減去小區距離左邊的距離,再去一個絕對值,不就是b的值咯,這樣我們在通三角函數Math.atan(b/a)就可以得到我們想要的那麼角度了,哈哈,拿到角度以後我們來套公式吧,假設我們即時得打的角度是n,那麼對應的t就是 t = Math.sin(n)* -r,l=Math.cos(n)*r,有人也許會說為什麼t的值是乘以一個-r,原因就是我們在檢測的時候其實是把360度分成四個地區,當滑鼠在左上方的時候,小球的位置是向左邊以及向上邊同時啟動並執行,小球往左邊走,當然是把小球當前的位置加上往左邊要走的距離,如果要往上邊走的話則要把小球當前距離上邊的距離減去要移動的距離,小球才能往上走,這個相信大家都明白,距離上邊的值越小自然就越靠上,對吧!!!那麼對應的在其他三個地區,這個r的值也是有所變化,有的時候取正值有的時候取負值,都是看他具體的運動方向和當前的位置,這個很容易,剛才也講過了,就不再囉嗦了!

  最後就是判斷滑鼠在哪一個地區上,這個其實也挺簡單的,我舉一個例子就可以了,當滑鼠在右上方的時候,我們來對比滑鼠和小球的位置,右上方的滑鼠距離左邊的值肯定是大於小球距離左邊的值的,距離上邊的值肯定是小於小球距離上邊的值的,滿足這兩個條件,則表明滑鼠在左上方。ok??相信大家都懂了,再說一句,這個判斷方法學名好像叫象限判定發。

  以上就是js的三角函數的簡單使用,這個例子是有點bug的,有興趣的朋友自行解決吧!!!其實還可以開發出很多更有的效果,當然js的三角函數還有一下其他的,不過使用起來都是大同小異,大家看看就闊以啦,下面是這個案例的代碼,有興趣的朋友可以看看!

 

 

/***********例子來了*************/

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<title>Document</title>
<style>
#box{width:30px;height:30px;background:red;position:absolute;top:400px;left:400px;border-radius:15px;}
</style>
</head>
<body>
<div id="box"></div>
</body>

<script>
var obox = document.getElementById(‘box‘);
var r=50;
document.onmousemove=function(ev){
var oev = ev||event;
var x = Math.abs(oev.clientX-obox.offsetLeft);
var y = Math.abs(oev.clientY-obox.offsetTop);
var angle = Math.atan(y/x);
var cx=0;
var cy=0;
if(oev.clientX>=obox.offsetLeft && oev.clientY<=obox.offsetTop){
cx = Math.cos(angle)*r;
cy = Math.sin(angle)*-r;
}
if(oev.clientX<obox.offsetLeft && oev.clientY<obox.offsetTop){
cx = Math.cos(angle)*-r;
cy = Math.sin(angle)*-r;
}
if(oev.clientX<obox.offsetLeft && oev.clientY>obox.offsetTop){
cx = Math.cos(angle)*-r;
cy = Math.sin(angle)*r;
}
if(oev.clientX>obox.offsetLeft && oev.clientY>obox.offsetTop){
cx = Math.cos(angle)*r;
cy = Math.sin(angle)*r;
}

obox.style.top = 400+cy+‘px‘;
obox.style.left = 400+cx+‘px‘;
}
</script>
</html>

javascript三角函數的使用

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.