已知座標求角度
阿新 • • 發佈:2019-01-28
已知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));