c语言atan2函数赋值程序,实例讲解C语言atan和atan2函数

使用时需要预包含#include

(1)atan(x) 不包括角度的象限信息,返回值在[-pi/2,pi/2]

The atan function computes the principal value of the arc tangent of x, returning a value in the range [-pi/2, pi/2]. 由于tan函数是以pi为周期的tanθ=tan(θ+pi),所以radAngle=atan(slope)实际上返回的是数学上atan(slope)的在[-pi/2, pi/2]之间的主值部分,注意radAngle以弧度为单位。例如pi/4的正切值为1,pi/4 + pi = 5pi/4的正切值也是1,此时C语言中计算的atan(1)=pi/4仅仅是位于tan函数在[-pi/2,pi/2]的部分,也就是说atan丢失了角度的象限信息,不能通过radAngle=atan(slope)来判断radAngle位于哪个象限。

#include

#include

#define PI 3.14159

int main(int argc, char *argv[])

{

float radAngle,degAngle;

radAngle = atan(1);  //atan(x) returns a value in the range [-pi/2, pi/2]

degAngle = radAngle*180/PI;

printf("arctangent in radians %f\n",radAngle); // 仅仅给出了第一象限的结果,第三象限的角度值不可能通过atan求出

printf("arctangent in degrees %f\n",degAngle);

radAngle = atan(-1);

degAngle = radAngle*180/PI;

printf("arctangent in radians %f\n",radAngle); //仅仅给出了第四象限的结果,不可能给出第二象限的结果

printf("arctangent in degrees %f\n",degAngle);

return 0;

}

(2)atan2(y,x) 包含角度的象限信息,返回值在[-pi,pi]

The atan2 function computes the principal value of the arc tangent of y / x, using the signs of both arguments to determine the quadrant of the return value. 由于atan2包含角度的象限信息所以用的比atan多。

1)一个比较实用的功能就是将直角坐标系下的点(x,y)转换为极坐标系下的点(rho,theta)。x = rho * cos(theta); y = rho * sin(theta),rho = sqrt( x^2 + y^2); theta = atan2(y,x)。

2)atan2计算两点间连线的倾斜角,这种方法非常的有用。在OpengL中视角fovy的计算就用到了atan2如下所示

// Calculating Field of View

#define PI 3.1415926535

double calculateAngle(double size, double distance)

{

double radtheta, degtheta;

radtheta = 2.0 * atan2 (size/2.0, distance);

degtheta = (180.0 * radtheta) / PI;

return degtheta;

}

atan2(y,x)函数返回点(x,y)和原点(0,0)之间直线的倾斜角.那么如何计算任意两点间直线的倾斜角呢?只需要将两点x,y坐标分别相减得到一个新的点(x2-x1,y2-y1).然后利用他求出角度就可以了.使用下面的一个转换可以实现计算出两点间连线的夹角.

atan2(y2-y1,x2-x1)不过这样我们得到的是一个弧度值,在一般情况下我们需要把它转换为一个角度.

下面我们用一段代码来测试一下这样的转换.

//测试,计算点(3,3)和(5,5)构成的连线的夹角

x=atan2(5-3,5-3)//输出0.785398

x=x*180/pi//转换为角度,输出45.000038

#include

#include

#define PI 3.14159

int main(int argc, char *argv[])

{

float radAngle,degAngle;

radAngle = atan2(7,7);  //atan(x) returns a value in the range [-pi/2, pi/2]

degAngle = radAngle*180/PI;

printf("in the fist quadrant,arctangent in radians %f\n",radAngle);

printf("in the fist quadrant,arctangent in degrees %f\n",degAngle);

radAngle = atan2(-7,7);

degAngle = radAngle*180/PI;

printf("in the second quadrant,arctangent in radians %f\n",radAngle);

printf("in the second quadrant,arctangent in degrees %f\n",degAngle);

radAngle = atan2(-7,-7);

degAngle = radAngle*180/PI;

printf("in the third quadrant,arctangent in radians %f\n",radAngle);

printf("in the third quadrant,arctangent in degrees %f\n",degAngle);

radAngle = atan2(7,-7);  degAngle = radAngle*180/PI;  printf("in the fourth quadrant,arctangent in radians %f\n",radAngle);  printf("in the fourth quadrant,arctangent in degrees %f\n",degAngle);  return 0; }

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值