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


103

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


20
sin / cos / tan не возвращают углы в радианах; они принимают углы в радианах. Обратные функции atan(), atan2(), acos(), asin()углы возврата.
Jason S

Ответы:


217

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

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

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

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

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


27

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

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

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

и так далее.


2
Это действительно следует назвать, sinDegreesчтобы избежать путаницы
BlueRaja - Danny Pflughoeft

Правда. Я видел, как некоторые сайты называют sindэто кратким. Я лично придерживаюсь этого, sinпотому что я знаю, что sinтогда это будет в градусах и Math.sinрадианах, но это на моей голове.
Niet the Dark Absol

6
-1: sin () не возвращает угол. Его входным аргументом является угол.
Jason S

1
Этот ... тот сбежал от меня. Я знаю это. Конечно, я это знаю. Я бы не сделал миллиард игр с триггерными функциями, если бы не ... но по какой-то причине я как бы совсем забыл об этом = /
Niet the Dark Absol

Я новичок и плохо разбираюсь в триггерах ... Могу я спросить, как будет выглядеть уравнение для cosDeg и tanDeg? Спасибо.
Кама

14

Я создал свой собственный маленький ленивый 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)));
   }
};

4

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

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

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


6
Хотя теоретически это может дать ответ на вопрос, было бы предпочтительнее включить сюда основные части ответа и предоставить ссылку для справки.
Jason C
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.