前言
為什么講這個?
在我們自定義View,尤其是制作一些復雜炫酷的效果的時候,實際上是將一些簡單的東西通過數學上精密的計算組合到一起形成的效果。
這其中可能會涉及到畫布的相關操作(旋轉),以及一些正余弦函數的計算等,這些內容就會用到一些角度、弧度相關的知識。為什么對角的描述存在角度與弧度兩種單位?
簡單來說就是為了方便,為了精確描述一個角的大小引入了角度與弧度的概念。
由于兩者進制是不同的(角度是60進制,弧度是10進制),在合適的地方使用合適的單位來描述會更加方便。
例如: 角度是60進位制,遇到30°6′這樣的角,應該轉化為10進制的30.1°。但弧度就不需要,因為弧度本身就是十進制的實數。(當求∠AOB的時候,得到弧度可能是0.52,轉換為角度可能就是30.1 °,只是表示形式不同,下文會介紹怎樣快速計算弧度從而轉化為角度)
角度與弧度的定義
角度和弧度一樣都是描述角的一種度量單位,下面是它們的定義:
角度 兩條射線從圓心向圓周射出,形成一個夾角和夾角正對的一段弧。當這段弧長正好等于圓周長的360分之一時,兩條射線的夾角的大小為1度.
弧度 兩條射線從圓心向圓周射出,形成一個夾角和夾角正對的一段弧。當這段弧長正好等于圓的半徑時,兩條射線的夾角大小為1弧度.(也就是1弧度是一個double值)
1度
1弧度
角度和弧度的換算關系
rad 是弧度, deg 是角度
應用
在自定義view中求一個角度的時候,先求出弧度在轉化為角度
假設:點擊view中一點A(touchPoint.x,touchPoint.y)
,求出相對于O(centerPoint.x,centerPoint.y)
的角度(A就是view坐標系中點擊的一點,O就相當于view的中心點)
// 兩點在X軸的距離
float lenX = (float) (touchPoint.x - centerPoint.x);
// 兩點在Y軸距離
float lenY = (float) (touchPoint.y - centerPoint.y);
// 兩點距離
float lenXY = (float) Math.sqrt((double) (lenX * lenX + lenY * lenY));
// 計算弧度
double radian = Math.acos(lenX / lenXY) * (touchPoint.y < centerPoint.y ? -1 : 1);
double tmp = Math.round(radian / Math.PI * 180);
// 計算角度
double angle =tmp >= 0 ? tmp : 360 + tmp;