设:原点O坐标(0,0),向量A坐标(x1,y1),向量B坐标(x2,y2),直线OA与OB的夹角度数等于 α;
由向量的数量积公式:
A · B = |A| * |B| * cosα
所以:
cosα = (A · B) / (|A| * |B|)
而A · B 和 |A| * |B| 都可由A、B的坐标计算得到,这样就得到了cosα的值,再用arcos函数反求一下cosα的值就能得到度数α是多少。
A · B = x1*x2 + y1*y2
|A| = 根号下(x1的平方 + y1的平方) ( |B| 同理 )
ac不了,懒得排查了,就酱。
#include <iostream>
#include <cmath>
using namespace std;
int main()
{
const double PI = acos(-1.0);
int N;
cin>>N;
int x1,y1,x2,y2;
while (N--)
{
cin>>x1>>y1>>x2>>y2;
double dot_ab = x1*x2 + y1*y2;//数量积 A·B
double abs_ab = sqrt(x1*x1+y1*y1)*sqrt(x2*x2+y2*y2);// |A||B|
double cos_ab = dot_ab/abs_ab;//cos的值
double acos_ab = acos(cos_ab)*180.0/PI;//acos
cout<<acos_ab;
}
}