atan函数和atan2函数求角度的区别:
已知两点坐标求角度时,atan函数求角度时无方向(矢量),atan2函数求角度时有方向(矢量)。
atan:-90~90度
atan2:-180~180度
例如:a(3,1),b(4,2) 方向ab
求直线角度(与水平坐标线),atan:45°
atan2:45°
b(4,2),a(3,1) 方向ba
求直线角度(与水平坐标线),atan:45°
atan2:-135°
程序如下:
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#define pi 3.1415926
void LineAngle1();
void LineAngle2();
typedef struct
{
double X;
double Y;
}point;
typedef struct
{
point A;
point B;
double deg;
}line;
line lineA;
line lineB;
double tmp;
double angle;
int main( )
{
LineAngle1();
LineAngle2();
printf( "两条直线角度差:%lf\n", fabs(lineA.deg-lineB.deg));
return 0;
}
void LineAngle1()
{
printf("请输点坐标(x,y)构造第一条直线\n");
printf("第一点x与y:");
scanf( "%lf%lf", &lineA.A.X, &lineA.A.Y );
printf("第二点x与y:");
scanf( "%lf%lf", &lineA.B.X, &lineA.B.Y );
//求角度
tmp=(lineA.B.Y-lineA.A.Y)/(lineA.B.X-lineA.A.X);
lineA.deg=atan(tmp); //弧度
lineA.deg=lineA.deg*(double)180/pi;
angle=atan2((lineA.B.Y-lineA.A.Y),(lineA.B.X-lineA.A.X))*(double)180/pi; //atan 无方向,atan2 有方向 (矢量)
printf( "第一条直线斜线角度:%lf,%lf\n", tmp,lineA.deg );
printf( "angle:%lf\n", angle);
}
void LineAngle2()
{
printf("请输点坐标(x,y)构造第二条直线\n");
printf("第一点x与y:");
scanf( "%lf%lf", &lineB.A.X, &lineB.A.Y );
printf("第二点x与y:");
scanf( "%lf%lf", &lineB.B.X, &lineB.B.Y );
//求角度
tmp=(lineB.B.Y-lineB.A.Y)/(lineB.B.X-lineB.A.X);
lineB.deg=atan(tmp);
lineB.deg=lineB.deg*(double)180/pi;
printf( "第二条直线斜线角度:%lf,%lf\n", tmp,lineB.deg );
}