1. 程式人生 > >已知座標求角度

已知座標求角度

已知javascript canvas 的一個點二維座標(x, y),由點(0,0)到點(x, y) 記為向量 a, 求向量 a 與 x 軸的夾角。

直接用反正切函式,或者反餘弦函式來做比較方便,
注意這兩個反三角函式的值域與定義域,一般來說用反餘弦函式來做更簡單,因為不用考慮除零異常。
這裡寫圖片描述
反 正切函式是奇函式,關於原點中心對稱,既 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)

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));