数学库包含许多有用的数学函数。头文件math.h提供这些函数的函数声明或原型。表16.4列举了-些 math.h中声明的函数。注意角度的单位为弧度(1弧度=l80/3.14=57.296度)。
我们用数学库来解决一个常见问题:把x/y坐标转换为长度和角度。例如,在栅格上画了一条线,该 线条水平穿过4个单元(x的值),垂直穿过3个单元(y的值)。那么,该线的长度(或称大小,magnitude) 和方向如何呢?从三角知识可得到下面两个式子:
magnitude = square root (x2 + y2) angle = arctangent (y/x)
数学库提供了平方根函数和一对反正切函数。因此,可以用c程序解决这个问题。平方根函数S£Jrt() 接受一个double参数并返回该参数的平方根,返回值类型也是double。
函数atan ()接受一个double参数(正切值),并返回角度值(该角度的正切值等于参数值)。但是, 当线条的x和y值均为-5时,atan ()函数会产生混淆。因为(-5) / (-5)等于1,所以atan ()返回45 °该值与x和y均为5时的返回值相同。换句话说,atan ()不能区分角度相同但方向相反的线(实际上, atan ()返回弧度,而非度;我们很快将讨论两者的转换)。
幸运的是,C库还提供atan2 ()函数。它接受两个参数:x的值和y的值。这样,通过检査x和y的 符号就可得出正确的角度值。atan2 ()和atan ()均返回弧度值。要将弧度转化为度,只需将弧度值乘以 180,再除以pi。pi的值可通过计算表达式4*atan (1)得到。程序清单16.13说明了这些步骤。另外,学 习该程序清单还能复习结构和typedef工具。
/* rect_pol.c --把直角坐标转换为极坐标*/
#include<stdio.h>
#include<math.h>
#define RAD_TO_DEG (180/(4*atan(1)))
typedef struct polar_v{
double magnitude;
double angle;
}POLAR_V;
typedef struct rect_v{
double y;
double x;
}RECT_V;
POLAR_V rect_to_polar(RECT_V);
int main(void)
{
RECT_V input;
POLAR_V result;
puts("Enter x,y coordinates:Enter q to quit:");
while(scanf("%lf %lf",&input.x,&input.y)==2)
{
result=rect_to_polar(input);
printf("magnitude=%.2f. angle=%.2f\n",result.magnitude,result.angle);
}
puts("Bye.");
return 0;
}
POLAR_V rect_to_polar(RECT_V rv){
POLAR_V pv;
pv.magnitude=sqrt(rv.x*rv.x+rv.y*rv.y);
if(pv.magnitude==0)
pv.angle=0.0;
else
pv.angle=RAD_TO_DEG*atan2(rv.y,rv.x);
return pv;
}
下面是一个运行示例:
Enter x, y coordinates; enter q to quit:
10 10
• magnitude = 14.14, angle = 45.00 -12-5
magnitude = 13.00t angle = -157.38
q
Bye.