前言
為什么講這個(gè)放案?
在我們自定義View和蚪,尤其是制作一些復(fù)雜炫酷的效果的時(shí)候双藕,實(shí)際上是將一些簡單的東西通過數(shù)學(xué)上精密的計(jì)算組合到一起形成的效果淑趾。
這其中可能會(huì)涉及到畫布的相關(guān)操作(旋轉(zhuǎn)),以及一些正余弦函數(shù)的計(jì)算等忧陪,這些內(nèi)容就會(huì)用到一些角度扣泊、弧度相關(guān)的知識。為什么對角的描述存在角度與弧度兩種單位嘶摊?
簡單來說就是為了方便延蟹,為了精確描述一個(gè)角的大小引入了角度與弧度的概念。
由于兩者進(jìn)制是不同的(角度是60進(jìn)制叶堆,弧度是10進(jìn)制),在合適的地方使用合適的單位來描述會(huì)更加方便阱飘。
例如: 角度是60進(jìn)位制,遇到30°6′這樣的角虱颗,應(yīng)該轉(zhuǎn)化為10進(jìn)制的30.1°沥匈。但弧度就不需要,因?yàn)榛《缺旧砭褪鞘M(jìn)制的實(shí)數(shù)忘渔。(當(dāng)求∠AOB的時(shí)候,得到弧度可能是0.52,轉(zhuǎn)換為角度可能就是30.1 °,只是表示形式不同,下文會(huì)介紹怎樣快速計(jì)算弧度從而轉(zhuǎn)化為角度)
角度與弧度的定義
角度和弧度一樣都是描述角的一種度量單位咐熙,下面是它們的定義:
角度 兩條射線從圓心向圓周射出,形成一個(gè)夾角和夾角正對的一段弧辨萍。當(dāng)這段弧長正好等于圓周長的360分之一時(shí)棋恼,兩條射線的夾角的大小為1度.
弧度 兩條射線從圓心向圓周射出,形成一個(gè)夾角和夾角正對的一段弧锈玉。當(dāng)這段弧長正好等于圓的半徑時(shí)爪飘,兩條射線的夾角大小為1弧度.(也就是1弧度是一個(gè)double值)
角度和弧度的換算關(guān)系
rad 是弧度, deg 是角度
應(yīng)用
在自定義view中求一個(gè)角度的時(shí)候,先求出弧度在轉(zhuǎn)化為角度
假設(shè):點(diǎn)擊view中一點(diǎn)A(touchPoint.x,touchPoint.y)
,求出相對于O(centerPoint.x,centerPoint.y)
的角度(A就是view坐標(biāo)系中點(diǎn)擊的一點(diǎn),O就相當(dāng)于view的中心點(diǎn))
// 兩點(diǎn)在X軸的距離
float lenX = (float) (touchPoint.x - centerPoint.x);
// 兩點(diǎn)在Y軸距離
float lenY = (float) (touchPoint.y - centerPoint.y);
// 兩點(diǎn)距離
float lenXY = (float) Math.sqrt((double) (lenX * lenX + lenY * lenY));
// 計(jì)算弧度
double radian = Math.acos(lenX / lenXY) * (touchPoint.y < centerPoint.y ? -1 : 1);
double tmp = Math.round(radian / Math.PI * 180);
// 計(jì)算角度
double angle =tmp >= 0 ? tmp : 360 + tmp;