【问题标题】:How can I get sin, cos, and tan to use degrees instead of radians?如何获得 sin、cos 和 tan 以使用度数而不是弧度?
【发布时间】:2012-03-31 02:22:15
【问题描述】:

当我在 JS 中处理数学时,我希望它的三角函数使用度数值而不是弧度值。我该怎么做?

【问题讨论】:

  • sin/cos/tan 不以弧度返回角度;它们以弧度表示角度。反函数atan()atan2()acos()asin() 返回角度。

标签: javascript math


【解决方案1】:

在调用系统三角函数之前,将输入乘以Math.PI/180 以将度数转换为弧度。

您也可以定义自己的函数:

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

等等。

【讨论】:

  • 这真的应该被命名为sinDegrees以避免混淆
  • 是的。我看到一些网站调用sind 来保持简短。我个人将其保留为sin,因为我知道sin 将以度为单位,Math.sin 以弧度为单位,但这是我自己的想法。
  • -1: sin() 不返回角度。它的输入参数是一个角度。
  • 那个……那个人离我而去。我知道。我当然知道。如果我没有,我就不会制作带有三角函数的无数游戏......但出于某种原因,我有点完全忘记了 =/
  • e-17 告诉你它是0.00000000000000006123...
【解决方案2】:

您可以使用这样的函数进行转换:

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

请注意,sincos 等函数不返回角度,它们将角度作为输入。在我看来,拥有一个将度数输入转换为弧度的函数对您来说会更有用,如下所示:

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

你可以用它来做类似tan(toRadians(45))的事情。

【讨论】:

    【解决方案3】:

    创建您自己的应用所需数学的转换函数,然后调用这些函数。 http://en.wikipedia.org/wiki/Radian#Conversion_between_radians_and_degrees

    【讨论】:

    • 虽然这在理论上可以回答问题,it would be preferable 在此处包含答案的基本部分,并提供链接以供参考。
    【解决方案4】:

    我为学位 (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)));
       }
    };
    

    【讨论】:

      【解决方案5】:

      我喜欢更通用的函数式方法:

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

      希望这会有所帮助!

      【讨论】:

      • 这不是特别实用或通用的。如果它需要两个参数怎么办?如果它返回以弧度表示的东西(例如Math.asin())并且您想获得度数作为输出怎么办?公认的答案是使用适量的函数式编程。将函数不必要地用作参数并不能使其成为函数式编程方法。
      【解决方案6】:

      有一个project with more than a thousand stars on GitHub 提供了从度数转换为弧度和将弧度转换为度数的函数。

      安装:

      npm i @stdlib/math
      

      要导入:

      const rad2deg = require('@stdlib/math/base/special/rad2deg')
      const deg2rad require('@stdlib/math/base/special/deg2rad')
      

      使用方法:

      console.log(Math.sin(deg2rad(90)))
      console.log(rad2deg(Math.asin(1)))
      

      【讨论】: