已知坐标求角度

已知javascript canvas 的一个点二维坐标(x, y),由点(0,0)到点(x, y) 记为向量 a, 求向量 a 与 x 轴的夹角。

直接用反正切函数,或者反余弦函数来做比较方便,
注意这两个反三角函数的值域与定义域,一般来说用反余弦函数来做更简单,因为不用考虑除零异常。
已知坐标求角度_第1张图片
反 正切函数是奇函数,关于原点中心对称,既 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;
    }

已知坐标求角度_第2张图片

反余弦函数关于x轴对称,既cos(a) = cos (2π - 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));

你可能感兴趣的:(数学)