cos:余弦, sin:正弦 , atan2:反正切值 的使用详解【笔记】

image.png

https://blog.51cto.com/makeanything/1690199

这几天在研究S_eVent 的人物移动实例,由于本人对数学超白痴,所以花了两天时间才彻底搞明白这些里面只个经典三角函数的使用。

写出这个笔记一是留给以后哪一直在又忘了的时候帮助记忆,相信学as的不可能每一个都是数天才,所以也会对需要的人有很大的帮助。可能我的表述也会不对,不过相差不会很大,希望高手们不要笑话哦!

解释图:
[图片上传中...(image-7d8cad-1594365729111-0)]

以下内容都是 围绕 初中、及高中的 数学 直角三角形 公式演算的:

1、Math.atan2(对边,邻边),这函数求的是角度,在坐标系中,知道x,y轴,相当于知道是两边直角边,即对边和邻边,所以就能求出角度。

2、Math.cos(角度): 这个函数得到的结果就是 a(邻边)/c(斜边)的比值 ,可以理解成为a边与c边的比例,在上图中,人物所在角度的邻边就是a边,c就是斜边。所以Math.cos(角度)得到的就是相应比例,在使用中,只要知道邻边角度,就能算出这个比例。
3、Math.sin(角度): 这个函数得到的结果就是 b(对边)/c(斜边)的比值,也就是对边与斜边上的比例,上图中,人物所在角度的对边就是b边,所以只要提供给sin一个角度,就能得出对边与斜边的比例。

注意:
(1)、一个三角形是由三条边组成,称为某个角度的(邻边、对边、斜边)--(非直角)。
(2)、上面两个函数,计算出的结果只是个比例,范围在-1和1之间

上面我们看到,角度是关键,所以接下来,就要说到算角度的函数
3、Math.atan2(对边y,邻边x): 反正切值,在三角形中,要求某个角的弧度(角度)是多少,我们就要先知道此角度的对边与邻边是多少。上图中,因为b边在Y轴上,a边在X轴上,所以Math.atan2(b边,a边)就可以到得人物所在角度是多少了。

相信对在部分对数学公式不太敏感的同学有帮助!
实例的详细应用:
http://bbs.9ria.com/thread-162591-1-1.html

//怪物和炮塔之间的距离 得到的是一个vec2(5, 10) 代表 x距离5 y距离10
var ptSub = g_pSub(pMonster.node.position, this.node.position)
var fRotate = g_getAngle(ptSub)
this.rotateGunTo(fRotate);

if (canAttack) {
    var fDirection = Math.atan2(ptSub.y, ptSub.x)
    g_bulletMgr.createBullet(this.towerInfo, this.node.position, fDirection, pMonster)
    
    cc.log("this.node.position, fDirection, pMonster = ", this.node.position, fDirection, pMonster)
    // g_shakeNode(this)
    // g_audioMgr.playSkill(1)

    //这个是得到2点之间直线距离
    let fanPtSub = cc.Vec2.distance(pMonster.node.position, this.node.position)
    cc.log("pMonster.node.position = ", pMonster.node.position)
    cc.log("this.node.position = ", this.node.position)
    cc.log("ptSub = ", ptSub)
    cc.log("fanPtSub = ", fanPtSub)
    cc.log("fDirection = ", fDirection)

    let houzuospeed = 3
    let moveSpeed = new cc.Vec2(0, 0)
    //弧度求出距离 *-1是变成背向
    moveSpeed.x = -1 * houzuospeed * Math.cos(fDirection)
    moveSpeed.y = -1 * houzuospeed * Math.sin(fDirection)
    cc.log("moveSpeed = ", moveSpeed)

    //这里做一个炮塔后坐力效果
    // var callback = cc.callFunc(this.onComplete, this);
    this.ndBody.x = 0
    this.ndBody.y = 0
    this.ndBody.stopAllActions()
    let move1 = cc.moveBy(0.1, moveSpeed)
    let move2 = move1.reverse()

    let sequence = cc.sequence(move1,move2)//动作完成后会给玩家加100分
    this.ndBody.runAction(sequence)
}

你可能感兴趣的:(cos:余弦, sin:正弦 , atan2:反正切值 的使用详解【笔记】)