Когда я работаю с математикой в JS, я бы хотел, чтобы ее триггерные функции использовали значения градуса вместо значений радиана. Как мне это сделать?
Как я могу получить грех, cos и tan, чтобы использовать градусы вместо радианов?
Ответ 1
Для выполнения преобразования вы можете использовать такую функцию:
function toDegrees (angle) {
return angle * (180 / Math.PI);
}
Обратите внимание, что функции типа sin
, cos
и т.д. не возвращают углы, они принимают углы в качестве входных данных. Мне кажется, что для вас было бы более полезно иметь функцию, которая преобразует степень ввода в радианы, например:
function toRadians (angle) {
return angle * (Math.PI / 180);
}
который вы могли бы использовать, чтобы сделать что-то вроде tan(toRadians(45))
.
Ответ 2
Умножьте ввод на Math.PI/180
чтобы преобразовать градусы в радианы, прежде чем вызывать функции триггера системы.
Вы также можете определить свои собственные функции:
function sinDegrees(angleDegrees) {
return Math.sin(angleDegrees*Math.PI/180);
};
и так далее.
Ответ 3
Я создал свой собственный маленький ленивый 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
Надеюсь это поможет!
Ответ 5
Создайте свою собственную функцию преобразования, которая применит необходимую математику, и вызовите ее. http://en.wikipedia.org/wiki/Radian#Conversion_between_radians_and_degrees
Ответ 6
Если вы хотите, чтобы все значения радиан были преобразованы в соответствующие углы в единичной окружности (0 градусов <= угол <360 градусов), вы можете сначала модульно отразить угол в радианах на 2 * pi, а затем выполнить преобразование радиан в градусы. Такое же преобразование может быть достигнуто и в градусах в радианы, и код здесь не показан.
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 * pi/3 + 23802 * pi) конвертируется в 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;
}