Если вы хотите, чтобы все значения радиан были преобразованы в соответствующие углы в единичной окружности (0 градусов <= угол <360 градусов), вы можете сначала модульно отразить угол в радианах на 2 * пи, а затем сделать радианы в градусах. преобразование. Такое же преобразование может быть достигнуто и в градусах в радианы, и код здесь не показан. </p>
let radToDeg = function(rad) {
let pi = Math.PI;
let smallRad = rad % (2 * pi); // reduce the radians value to be within the unit circle or from 0 to 2 * pi
let deg = smallRad / (pi) * 180; // normal radians to degrees conversion factor
let errorBound = 1e-6; // error tolerance
// adjust floating point imprecisions
if (Math.abs(deg - Math.round(deg)) <= errorBound){
return Math.round(deg);
} else{
return deg;
}
}
Чтобы достичь более высокой точности в вычислениях, следует избегать встроенного модульного оператора Javascript (%). Следующий код в основном является копией единичного круга. Однако все углы преобразуются в соответствующие значения в единичной окружности. Например, 7.330382858376184 (или пи / 3 + 2 * пи) конвертируется в 60 градусов; 74774.09394564186 (или -2 * пи / 3 + 23802 * пи) преобразуется в 240 градусов.
let radToDeg = function(rad) {
let pi = Math.PI;
if (evenlyDivide(rad, 2 * pi)) {
return 0;
} else if (evenlyDivide(rad, pi)) {
return 180;
} else if (evenlyDivide(rad - pi / 2, 2 * pi)){
return 90;
} else if (evenlyDivide(rad + pi / 2, 2 * pi)){
return 270;
} else if (evenlyDivide(rad - pi / 4, 2 * pi)){
return 45;
} else if (evenlyDivide(rad + pi / 4, 2 * pi)){
return 315;
} else if (evenlyDivide(rad - pi / 6, 2 * pi)){
return 30;
} else if (evenlyDivide(rad + pi / 6, 2 * pi)){
return 330;
} else if (evenlyDivide(rad - pi / 3, 2 * pi)){
return 60;
} else if (evenlyDivide(rad + pi / 3, 2 * pi)){
return 300;
} else if (evenlyDivide(rad - 2 * pi / 3, 2 * pi)){
return 120;
} else if (evenlyDivide(rad + 2 * pi / 3, 2 * pi)){
return 240;
} else if (evenlyDivide(rad - 3 * pi / 4, 2 * pi)){
return 135;
} else if (evenlyDivide(rad + 3 * pi / 4, 2 * pi)){
return 225;
} else if (evenlyDivide(rad - 5 * pi / 6, 2 * pi)){
return 150;
} else if (evenlyDivide(rad + 5 * pi / 6, 2 * pi)){
return 210;
} else{
let smallRad = rad % (2 * pi);
return smallRad / (pi) * 180;
}
}
А функция evenlyDivide
просто проверяет, делятся ли два входных значения (результат деления на целое число) на некоторые пределы допуска:
let evenlyDivide = function(val, step) {
let divided = val / step; // the result of division of two input values
let errorBound = 1e-7; // error tolerance
if (Math.abs(divided - Math.round(divided)) < errorBound) { // test if within error bound
return true;
}
return false;
}