Como posso fazer com que sin, cos e tan usem graus em vez de radianos?

101

Quando estou trabalhando com matemática em JS, gostaria que suas funções trigonométricas usassem valores de graus em vez de valores de radianos. Como eu faria isso?

0x499602D2
fonte
20
sin / cos / tan não retorna ângulos em radianos; eles tomam ângulos em radianos. As funções inversas atan(), atan2(), acos(), asin()retorno ângulos.
Jason S

Respostas:

215

Você pode usar uma função como esta para fazer a conversão:

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

Observe que funções como sin, cose assim por diante não retornam ângulos , elas tomam ângulos como entrada. Parece-me que seria mais útil para você ter uma função que converte uma entrada de grau em radianos, como este:

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

que você pode usar para fazer algo parecido tan(toRadians(45)).

Peter Olson
fonte
27

Multiplique a entrada por Math.PI/180para converter de graus em radianos antes de chamar as funções trigonométricas do sistema.

Você também pode definir suas próprias funções:

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

e assim por diante.

Niet the Dark Absol
fonte
2
Deve ter um nome sinDegreespara evitar confusão
BlueRaja - Danny Pflughoeft
Verdade. Já vi alguns sites chamarem sindpara ser breve. Pessoalmente, mantenho-o assim sinporque sei que sinentão será em graus e Math.sinem radianos, mas isso é por minha conta.
Niet the Dark Absol
6
-1: sin () não retorna um ângulo. Seu argumento de entrada é um ângulo.
Jason S
1
Aquele ... aquele fugiu de mim. Eu sei disso. Claro que sei disso. Eu não teria feito um bazilhão de jogos com funções trigonométricas se não ... mas por alguma razão eu meio que esqueci completamente que = /
Niet the Dark Absol
Eu sou um novato e ruim com trig ... posso perguntar como seria a equação para cosDeg e tanDeg? obrigado.
Kama
14

Eu criei meu próprio objeto de matemática preguiçoso para o grau (MathD), espero que ajude:

//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)));
   }
};
Daniel Budick
fonte
4

Gosto de uma abordagem funcional mais geral:

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

ou,

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

que pode ser usado com qualquer função de tomada de radiano:

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

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

Espero que isto ajude!

David Nishikawa
fonte