C语言学习笔记---三角函数

x33g5p2x  于2022-02-17 转载在 其他  
字(2.6k)|赞(0)|评价(0)|浏览(458)

在C语言标准库里面提供了常用的三角函数,在头文件math.h里面可以看到函数的相关定义。

double __cdecl sin(double _X);
  double __cdecl cos(double _X);
  double __cdecl tan(double _X);
  double __cdecl asin(double _X);
  double __cdecl acos(double _X);
  double __cdecl atan(double _X);
  double __cdecl atan2(double _Y,double _X);

其中sincostan 函数的参数是一个用弧度表示的角度,分别返回这个角度的正弦、余弦、正切值。

度和弧度都是衡量角的大小的单位。度用 ° 来表示,弧度用rad表示。

弧度的定义

在一个圆中,弧长等于半径的弧,其所对的圆心角就是 1rad。也就是说,两条射线从圆心向圆周射出,形成一个夹角和夹角正对的一段弧。当这段弧的长度正好等于圆的半径时,两条射线的夹角的弧度为 1。

度的定义

两条射线从圆心向圆周射出,形成一个夹角和夹角正对的一段弧。当这段弧长正好等于圆周长的360分之一时,两条射线的夹角的大小为1度。

由此可知:

1度=π/180 弧度 ( ≈0.017453弧度 )

因此,得到 把度化成弧度的公式:

弧度=度×π/180
例如:

  • 30°=30×π/180 =π/6 弧度
  • 45°=45×π/180 =π/4 弧度
  • 60°=60×π/180 =π/3 弧度
  • 90°=90×π/180 =π/2 弧度
  • 120°=120×π/180 =2π/3 弧度
  • 180°=180×π/180 =π 弧度

反过来,弧度化成度怎么算?

因为 π弧度=180°

所以 1弧度=180°/π (≈57.3°)

因此,可得到 把弧度化成度的公式:

度=弧度×180°/π

例如:

  • π/2 弧度=π/2 ×180°/π =90°
  • 4π/3 弧度=4π/3 ×180°/π =240°

sincostan 函数定义如下:

  • 在直角三角形 ABC 中(其中角 C 为 90°),角 A 的正弦就是它的对边长度和三角形斜边长度的比值,sinA = a / c
  • 在直角三角形 ABC 中(其中角 C 为 90°),角 A 的余弦就是它的临边长度和三角形斜边长度的比值,cosA = b / c
  • 在直角三角形 ABC 中(其中角 C 为 90°),角 A 的正切就是它的对边长度和临边长度的比值,tanA = a / b

下面就通过一段简单的代码来演示一下这几个三角函数的用法。

#include <stdio.h>
#include <math.h>

#define PI 3.14159265

int main ()
{
   double x, ret, val;

   x = 30.0;
   val = PI / 180;
   ret = sin(x*val);
   printf("%lf 的正弦是 %lf 度\n", x, ret);
   
   ret = cos(x*val);
   printf("%lf 的余弦是 %lf 度\n", x, ret);   
   
   ret = tan(x*val);
   printf("%lf 的正切是 %lf 度\n", x, ret);
   
   return(0);
}

输出结果如下:

asin()acosatan 函数分别返回它们的参数的反正弦、反余弦、反正切值。功能刚好和
sincostan 函数相反。

sin() 是已知一个角的弧度值 x,求该角的正弦值 y;而 asin() 是已知一个角的正弦值 y,求该角的弧度值 xx 的取值必须位于区间 [-1, 1] 中,如果 x 的值超出此区间,将会产生错误。

测试代码如下:

#include <stdio.h>
#include <math.h>

#define PI 3.14159265

int main ()
{
   double x, ret, val;
   x = 1.0;
   val = 180.0 / PI;

   ret = asin(x) * val;
   printf("%lf 的反正弦是 %lf 度\n", x, ret);
   
   ret =acos(x) * val;
   printf("%lf 的反余弦是 %lf 度\n", x, ret);   
   
   ret = atan(x) * val;
   printf("%lf 的反正切是 %lf 度\n", x, ret);
   
   return(0);
}

输出结果为:

最后还有一个反正切函数atan2atan2()atan() 的增强版,能够确定角度所在的象限。它返回以弧度表示的 y/x 的反正切。yx 的值的符号决定了正确的象限。

它的两个参数:

  • x – 代表 x 轴坐标的浮点值。
  • y – 代表 y 轴坐标的浮点值。

弧度区间为 [-π,+π]
当 (x, y) 在象限中时:

  • 当 (x, y) 在第一象限,0 < θ < π/2
  • 当 (x, y) 在第二象限,π/2 < θ ≤ π
  • 当 (x, y) 在第三象限,-π < θ < -π/2
  • 当 (x, y) 在第四象限,-π/2 < θ < 0

当 (x, y) 在象限的边界(也就是坐标轴)上时:

  • 当 y 是 0,且 x 为非负值,θ = 0
  • 当 y 是 0,且 x 是负值,θ = π
  • 当 y 是正值,且 x 是 0,θ = π/2
  • 当 y 是负值,且 x 是 0,θ = -π/2

测试代码如下:

#include <stdio.h>
#include <math.h>

#define PI 3.14159265

int main ()
{
   double x, y, ret, val;

   val = 180.0 / PI;
   
   x = 1.0;
   y = 1.0;
   ret = atan2 (y,x) * val;
   printf("x = %lf, y = %lf 的反正切", x, y);
   printf("是 %lf 度\n", ret);
   
   x = 1.0;
   y = -1.0;
   ret = atan2 (y,x) * val;
   printf("x = %lf, y = %lf 的反正切", x, y);
   printf("是 %lf 度\n", ret);
   
   x = -1.0;
   y = 1.0;
   ret = atan2 (y,x) * val;
   printf("x = %lf, y = %lf 的反正切", x, y);
   printf("是 %lf 度\n", ret);
   
   x = -1.0;
   y = -1.0;
   ret = atan2 (y,x) * val;
   printf("x = %lf, y = %lf 的反正切", x, y);
   printf("是 %lf 度\n", ret);
     
   return(0);
}

输出结果如下:

相关文章