从来没有感觉到我是如此对不起党,对不起祖国的培养,对不起老师的辛辛教导,直到我再次碰到了 sin 、cos 、tan 时!如果老天再给我一次机会的话,我想说我要好好学数学
这是个噩梦,明明已经过去了的,但是为啥又再次遇到呢,还不是搞自定义 view 时算参数,啊啊啊啊,我想死啊,但是没办法啊,这些公式不会你就算不出参数来,没办法,再学一次吧,就当是重温高考了~
自定义 view 中涉及到以下几个公式:
- Math.sin - 正弦公式
- Math.cos - 余弦公式
- Math.acos() - 反余弦函数;
- Math.atan2
- Math.toDegrees() - 弧度转角度
- Math.toRadians - 角度转弧度
这几个数学公式在使用 path 绘制时必然会碰到的,比如计算 path 莫个点的切角角度,x,y 坐标。虽说我们可能很久没有接触过了,但是也不难的,搞懂就行了
1. 什么是 sin ,con
以这个三角形为例
按照概念解释:
- sin 正弦,锐角对应的边与斜边的边
- cos 余弦,锐角相邻的那条直角边与斜边的比
- tan 正切,直角三角函数中,锐角对应的边跟另一条直角边的比
文字看不懂的话,看标准实例图也知道是啥意思了。sin ,con 的值在 -1 到 1 之间,Math 中的 sin 和 cos 也是如此,比如 API:
- Math.sin(x)
- Math.cos(x)
但是要注意啊,Math 中的 x 可不是角度,而是弧度,转换公式如下:
- 弧度 = 角度 * Math.PI / 180
- 角度 = 弧度 x 180 / Math.PI
2. 什么是弧度
至于不知道弧度的同学,看图:
当这段弧长正好等于圆的半径时,两条射线的夹角大小为1弧度。所以 A-B 的弧线长度 / 半径 = 弧度了。详细可以查看:
公式用途
- sin 和 cos 的计算一般也就是知道一个边,角度算另一个边,比如:
a = Math.sin(x) * c
b = Math.con(x) * c
Math.acos 传入的参数是 邻边 / 斜边 的比值,获取是的弧度,用来计算角度的
Math.atan2 是用来算 path 中某个点的切线角度的,场景是图片跟着 path 的方向转动指定角度
atan2 需要传2个参数:
Math.atan2(tan[1], tan[0])
其中tan[0]是邻边边长,也就是 point 点的 x 坐标;tan[1]是对边边长,也就是 point 点的 y 坐标
tan 的值可以用 PathMeasure.getPosTan 方法获取
写法如下:
private float[] pos = new float[2];
private float[] tan = new float[2];
measure.getPosTan(length, pos, tan);
float degrees = (float) (Math.atan2(tan[1], tan[0]) * 180.0 / Math.PI);
基本上面的就差不多了,再有请留言,我加上