已知坐标求角度

已知javascript canvas 的一个点二维坐标(x, y),由点(0,0)到点(x, y) 记为向量 a, 求向量 a 与 x 轴的夹角。
其中约定从一个向量 (1, 0) 从旋转到 (0, 1) 为正的90度旋转,而任意一个向量从y轴到x轴为负的90度旋转。

直接用反正切函数,或者反余弦函数来做比较方便,
注意这两个反三角函数的值域与定义域,一般来说用反余弦函数来做更简单,因为不用考虑除零异常。
这里写图片描述
反 正切函数是奇函数,关于原点中心对称,既 tan(a) = tan(a + π)

function getAngle(x, y) {
        if (x === 0) {
            return y > 0 ? 90 : 270;
        }
        var a = Math.atan(y/x);
        var ret = a * 180 / Math.PI; //弧度转角度,方便调试
        if (x < 0) {
            ret = 180 + ret;
        }
        if (ret > 360) {
            ret -= 360;
        }
        if (ret < 0) {
            ret += 360;
        }
        return ret;
    }

更加简单Math.atan2() 实现

function getAngle(x, y) {
        var a = Math.atan2(y, x);
        var ret = a * 180 / Math.PI; //弧度转角度,方便调试
        if (ret > 360) {
            ret -= 360;
        }
        if (ret < 0) {
            ret += 360;
        }
        return ret;
    }

这里写图片描述

反余弦函数关于x轴对称,既cos(a) = cos (2π - a)
反余弦函数关于y轴有,cos(a) = - cos (π - a)

function getAngle(x, y) {
        var l = Math.sqrt(x*x + y*y);
        var a = Math.acos(x/l);
        var ret = a * 180 / Math.PI; //弧度转角度,方便调试
        if (y < 0) {
            return 360 - ret;
        }
        return ret;
    }

测试代码

var a = Math.sqrt(3);
    console.log(getAngle(1, a));
    console.log(getAngle(1, -a));
    console.log(getAngle(-1, -a));
    console.log(getAngle(-1, a));
    console.log(getAngle(1, 0));
    console.log(getAngle(0, 1));
    console.log(getAngle(-1, 0));
    console.log(getAngle(0, -1));
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值