Как я могу заставить sin, cos и tan использовать градусы вместо радианов? - PullRequest
90 голосов
/ 14 марта 2012

Когда я работаю с математикой в ​​JS, я бы хотел, чтобы ее триггерные функции использовали значения градусов вместо радиан.Как бы я это сделал?

Ответы [ 6 ]

192 голосов
/ 14 марта 2012

Вы можете использовать такую ​​функцию для преобразования:

function toDegrees (angle) {
  return angle * (180 / Math.PI);
}

Обратите внимание, что такие функции, как sin, cos и т. Д. не возвращают углы ,они принимают углы в качестве входных данных.Мне кажется, что для вас было бы более полезно иметь функцию, которая преобразует входные данные градуса в радианы, например:

function toRadians (angle) {
  return angle * (Math.PI / 180);
}

, которую вы можете использовать для выполнения чего-то вроде tan(toRadians(45)).

24 голосов
/ 14 марта 2012

Умножьте входное значение на Math.PI/180, чтобы преобразовать градусы в радианы, прежде чем вызывать функции системной синхронизации.

Вы также можете определить свои собственные функции:

function sinDegrees(angleDegrees) {
    return Math.sin(angleDegrees*Math.PI/180);
};

и т. Д.

13 голосов
/ 23 декабря 2015

Я создал свой маленький ленивый Math-Object для степени (MathD), надеюсь, это поможет:

//helper
/**
 * converts degree to radians
 * @param degree
 * @returns {number}
 */
var toRadians = function (degree) {
    return degree * (Math.PI / 180);
};

/**
 * Converts radian to degree
 * @param radians
 * @returns {number}
 */
var toDegree = function (radians) {
    return radians * (180 / Math.PI);
}

/**
 * Rounds a number mathematical correct to the number of decimals
 * @param number
 * @param decimals (optional, default: 5)
 * @returns {number}
 */
var roundNumber = function(number, decimals) {
    decimals = decimals || 5;
    return Math.round(number * Math.pow(10, decimals)) / Math.pow(10, decimals);
}
//the object
var MathD = {
    sin: function(number){
        return roundNumber(Math.sin(toRadians(number)));
    },
    cos: function(number){
        return roundNumber(Math.cos(toRadians(number)));
    },
    tan: function(number){
        return roundNumber(Math.tan(toRadians(number)));
    },
    asin: function(number){
        return roundNumber(toDegree(Math.asin(number)));
    },
    acos: function(number){
       return roundNumber(toDegree(Math.acos(number)));
   },
   atan: function(number){
       return roundNumber(toDegree(Math.atan(number)));
   }
};
1 голос
/ 20 февраля 2018

Мне нравится более общий функциональный подход:

/**
* converts a trig function taking radians to degrees
* @param {function} trigFunc - eg. Math.cos, Math.sin, etc.
* @param {number} angle - in degrees
* @returns {number}
*/
const dTrig = (trigFunc, angle) => trigFunc(angle * Math.PI / 180);

или

function dTrig(trigFunc, angle) {
  return trigFunc(angle * Math.PI / 180);
}

, который можно использовать с любой функцией получения радиана:

dTrig(Math.sin, 90);
  // -> 1

dTrig(Math.tan, 180);
  // -> 0

Надеюсь, это поможет!

0 голосов
/ 13 декабря 2018

Если вы хотите, чтобы все значения радиан были преобразованы в соответствующие углы в единичной окружности (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;
}
0 голосов
/ 14 марта 2012

Создайте свою собственную функцию преобразования, которая применяет необходимую математику, и вызывайте ее вместо. http://en.wikipedia.org/wiki/Radian#Conversion_between_radians_and_degrees

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...