Jak sprawić, by sin, cos i tan używały stopni zamiast radianów?

102

Kiedy pracuję z matematyką w JS, chciałbym, aby jej funkcje trygonometryczne używały wartości stopni zamiast wartości radianów. Jak bym to zrobił?

0x499602D2
źródło
20
sin / cos / tan nie zwraca kątów w radianach; przyjmują kąty w radianach. Funkcje odwrotne atan(), atan2(), acos(), asin()kąty zwrotnego.
Jason S

Odpowiedzi:

215

Możesz użyć takiej funkcji, aby wykonać konwersję:

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

Zauważ, że funkcje takie jak sin, cosi tak dalej nie zwracają kątów , przyjmują kąty jako dane wejściowe. Wydaje mi się, że bardziej przydatne byłoby dla ciebie posiadanie funkcji, która konwertuje wejściowy stopień na radiany, na przykład:

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

którego możesz użyć do zrobienia czegoś takiego tan(toRadians(45)).

Peter Olson
źródło
27

Pomnóż dane wejściowe przez Math.PI/180 aby przekonwertować stopnie na radiany przed wywołaniem funkcji systemowych trygonometrycznych.

Możesz także zdefiniować własne funkcje:

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

i tak dalej.

Niet the Dark Absol
źródło
2
To naprawdę powinno być nazwane, sinDegreesaby uniknąć nieporozumień
BlueRaja - Danny Pflughoeft
Prawdziwe. Widziałem, jak niektóre witryny wzywają, sindaby to było krótkie. Osobiście trzymam się tego, sinponieważ wiem, że sinbędzie to w stopniach i Math.sinradianach, ale to zależy ode mnie.
Niet the Dark Absol
6
-1: sin () nie zwraca kąta. Jego argumentem wejściowym jest kąt.
Jason S
1
To ... ten uciekł mi. Wiem to. Oczywiście, że to wiem. Nie stworzyłbym bazillionów gier z funkcjami trygonometrycznymi, gdybym nie ... ale z jakiegoś powodu zupełnie o tym zapomniałem = /
Niet the Dark Absol
Jestem noobem i jestem zły z trig ... czy mogę zapytać, jak wyglądałoby równanie dla cosDeg i tanDeg? Dziękuję Ci.
Kama,
14

Stworzyłem własny, leniwy obiekt matematyczny na stopień naukowy (MathD), mam nadzieję, że pomoże:

//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
źródło
4

Podoba mi się bardziej ogólne podejście funkcjonalne:

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

lub,

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

które mogą być używane z dowolną funkcją biorącą radian:

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

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

Mam nadzieję że to pomoże!

David Nishikawa
źródło