求两直线间夹角

偶遇HDU上的2080,觉得有必要整理下求解的过程。

给出平面上任意两点的坐标,求两个点和原点的连线夹角,0<夹角<180。

这是高中数学题啊,想了想公式,于是想到了余弦定理,(由于数学很渣)想了好一会又,写了好一会,写出了公式。但最后要怎么办呢?得到的是余弦值,而所求的是角度,再想便想到了反三角。在程序中写作:“acos()”。

按照题解中。。。。。。接下来就是考虑角度问题了,利用余弦值求出的角度可能会大于180。再进行一些小处理,即可。

但AC后我又没去管越界,又叫了一发,结果也A了。再想一想,根本不存在什么越界吗。。。。我们所关注的角度一旦超够了180,那所求角度就会变为360-180那一部分。

(我一定要克制住自己搜题解的坏毛病,自己动脑,自己动脑,自己动脑~~~~) 事实证明题解有题解的思路,我自己有我自己的,题解也不一定适合我。

#include<bits/stdc++.h>
int main(){
	int n;
	double x,y,xx,yy,j;
	while(scanf("%d",&n)==1){
		for(int i=0;i<n;i++){
			scanf("%lf %lf %lf %lf",&x,&y,&xx,&yy);
			j=(x*x+y*y) + (xx*xx+yy*yy) - ((xx-x)*(xx-x)+(yy-y)*(yy-y));
			j/=2.0*sqrt(x*x+y*y)*sqrt(xx*xx+yy*yy);
			printf("%.2lf\n",acos(j)*180.0/3.1415926);
		}
	}
	return 0;
}

再附上百度到的一个大神的做法

他使用了向量的点乘公式 看起还十分简便 x1*x2+y1*y2;

#include<bits/stdc++.h>
int main(){
	int n;
	double x,y,xx,yy,j;
	while(scanf("%d",&n)==1){
		for(int i=0;i<n;i++){
			scanf("%lf %lf %lf %lf",&x,&y,&xx,&yy);
			j=(x*xx+y*yy)/(sqrt(x*x+y*y)*sqrt(xx*xx+yy*yy));
			printf("%.2lf\n",acos(j)*180.0/3.1415926);
		}
	}
	return 0;
}

 在交一发 依旧AC

 

原文地址:https://www.cnblogs.com/gjy963478650/p/7256861.html