一、角度与弧度的定义
名称 | 定义 |
角度 | 两条射线从圆心向圆周射出,形成一个夹角和夹角正对的一段弧。**当这段弧长正好等于圆周长的360分之一时,两条射线的夹角的大小为1度。** |
弧度 | 两条射线从圆心向圆周射出,形成一个夹角和夹角正对的一段弧。**当这段弧长正好等于圆的半径时,两条射线的夹角大小为1弧度。** |
二、角度与弧度的换算
一个完整的圆的弧度是 2π,所以 2π rad = 360°,1 π rad = 180°,1°= π/180 rad,1 rad = 180°/π(约57.29577951°)。以度数表示的角度,把数字乘以 π/180 便转换成弧度;以弧度表示的角度,乘以 180/π 便转换成度数。
三、坐标系中的角度
角度在不同坐标系中的具体差异为:在数学坐标系中,角度沿逆时针方向增大;在屏幕坐标系中,角度沿顺时针方向增大。
四、三角函数
[一] 直角三角形中的定义
在直角三角形中仅有锐角(大小在 0 到 90 度之间的角)三角函数的定义。给定一个锐角 θ ,可以做出一个直角三角形,使得其中的一个内角是 θ 。设这个三角形中, θ 的对边、邻边和斜边长度分别是 a, b, h,那么该直角三角形的三角函数定义如下:
[二] 直角坐标系中的定义
设 P(x,y) 是平面直角坐标系 xOy 中的一个点,θ 是横轴正向 Ox 逆时针旋转到 OP 方向所形成的角, r 是 P 到原点 O 的距离,则 θ 的六个三角函数定义如下:
这样可以对 0 到 360 度的角度定义三角函数。要注意的是以上的定义都只在定义式有意义的时候成立。比如说当 x=0 的时候, y / x 和 r / x 都没有意义,这说明对于 90 度角和 270 度角,正切和正割没有定义。同样地,对于 0 度角和 180 度角,余切和余割没有定义。
[三] 单位圆定义
三角函数也可以依据直角坐标系 XOY 中半径为 1,圆心为原点 O 的单位圆来定义。给定一个角度 θ ,设 A(1,0) 为起始点,如果 θ > 0 则将 OA 逆时针转动,如果 θ < 0 则顺时针移动,直到转过的角度等于 θ 为止。设最终点 A 转到的位置为 P(x,y),那么三角函数定义如下:
这个定义和坐标系的定义类似,但角度 θ 可以是任何的数值。对于大于 360° 或小于 -360° 的角度,可以认为是逆时针(顺时针)旋转了不止一圈。而多转或少转了整数圈不会影响三角函数的取值。
五、优惠券案例
下面会以优惠券库 [Coupon@Github] 为案例,对三角函数的使用进行演示。其中,优惠券 UI 案例示意图中下面较大的圆形为上面圆形缺口的放大示意图。蓝色线条为内侧虚线和外侧之间的间隙,红色线条为外侧缺口圆的半径,所以,内侧虚线缺口圆的半径 = 间隙 + 外侧缺口圆半径。
描述清楚了半径和间隙之间的关系,我们就可以正式的开始进行内侧虚线缺口的绘制了。这里所说的虚线缺口实际上只是一段弧,要绘制这段弧,我们需要知道几个参数:1、弧的边界范围;2、弧的起始角度;3、弧的掠过角度;4、画笔。绘制方法如下:
1 | canvas.drawArc(rect, StartAngle, SweepAngle, false, paint); |
根据角度在屏幕坐标系中的特征(X 轴的逆时针方向为负,顺时针方向为正),上图中箭头起始位置所对应的角度为负值,角度大小为 -( θ + 90° )。那么,现在只需要知道 θ 的值,就能知道弧的起始角度了。Java 为我们提供了一系列的三角函数 API。在这里我们会用到 Math.acos(a)
方法,将 θ 的余弦值传入来计算出弧度值,然后再通过 deg = rad * 180 / Math.PI
将弧度值换算成对应的角度值 θ。圆沿垂直轴对称,所以,弧的掠过角度为 θ 的两倍,这样我们就计算出了弧的起始角度和掠过角度。