3 given points, get the angle between two lines

该函数包含三个点的位置参数,

点A(x1,y1)    点B(x2,y2)  点C(x3,y3)  

从A点到B点连线成边L1,从C点到B点连线成边L2。 公式CountAngle返回的结果就是从L1顺时针转到L2的夹角度数,以DOUBLE类型返回。 

double CMapRender::CountAngle(double x1, double y1, double x2, double y2, double x3, double y3)

{   
if(0 == ((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2)) )
return -1;
double sin1 = (y1 - y2) / sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2));//第一个坐标点和第二个坐标所在直线与X坐标正半轴逆时针所成角的正弦值
double cos1 = (x1 - x2) / sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2));//第一个坐标点和第二个坐标所在直线与X坐标正半轴逆时针所成角的余弦值
double sin2 = (y3 - y2) / sqrt((x3 - x2) * (x3 - x2) + (y3 - y2) * (y3 - y2));//第三个坐标点和第二个坐标所在直线与X坐标正半轴逆时针所成角的正弦值
double cos2 = (x3 - x2) / sqrt((x3 - x2) * (x3 - x2) + (y3 - y2) * (y3 - y2));//第三个坐标点和第二个坐标所在直线与X坐标正半轴逆时针所成角的余弦值
double angle11 = (double)asin(sin1);//第一个坐标点和第二个坐标所在直线与X坐标正半轴逆时针所成角正弦值的反正弦值
double angle22 = (double)asin(sin2);//第三个坐标点和第二个坐标所在直线与X坐标正半轴逆时针所成角正弦值的反正弦值
double angle1,angle2;
double angle;
double PI = 3.1415926 ;
//第一个坐标点和第二个坐标所在直线与X坐标正半轴逆时针所成角
if(sin1 >= 0 && cos1 >= 0)
angle1 = angle11;
else
{
if(sin1 >= 0 && cos1 < 0)
angle1 = PI - angle11;
else
if(sin1 < 0 && cos1 <= 0)
angle1 = PI - angle11;
else
angle1 = 2 * PI + angle11;
}
//第三个坐标点和第二个坐标所在直线与X坐标正半轴逆时针所成角
if(sin2 >= 0 && cos2 >= 0)
angle2 = angle22;
else
{
if(sin2 >= 0 && cos2 < 0)
angle2 = PI - angle22;
else
if(sin2 < 0 && cos2 <= 0)
angle2 = PI - angle22;
else
angle2 = 2 * PI + angle22;
}
//第一个坐标点和第二个坐标所在直线到第三个坐标点和第二个坐标所在直线的顺时针的角
if(angle1 >= angle2)
angle = (180 / PI) * (angle1 - angle2);
else
angle = 360 - (180 / PI) * (angle2 - angle1);
return angle;
}
posted @ 2009-04-15 13:05  RayG  阅读(257)  评论(0编辑  收藏  举报