描述
有兩條直線,AB和CD,A、B、C、D的座標已知,求這兩條直線的所成夾角中較小的一個。
輸入
輸入包括多組數據,第一行爲測試數據的組數n,接下來後面有n行,每一行有8個整數,依次代表A點的x座標、A點的y座標,B點的x座標、B點的y座標,C點的x座標、C點的y座標,D點的x座標、D點的y座標。
輸出
輸出夾角的近似值(角度值而非弧度值,保留1位小數)。
樣例輸入
0 0 0 1 0 0 1 0
0 0 1 1 1 1 1 0
樣例輸出
45.0
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<string.h>
#define Pi acos(-1)
using namespace std;
int main()
{
int t;
int a[8];
cin>>t;
double num1,num2;
while(t--)
{
for(int i=0;i<8;i++)
cin>>a[i];
int t1,t2,t3,t4;
t1=a[2]-a[0];
t2=a[3]-a[1];
t3=a[6]-a[4];
t4=a[7]-a[5];
num1=(t1*t3+t2*t4)/((sqrt(t1*t1+t2*t2))*(sqrt(t3*t3+t4*t4)));
num2=acos(num1);
if(num2*(180.0/Pi)>=90)
printf("%.1lf\n",180-(num2*(180.0/Pi)));
else
printf("%.1lf\n",num2*(180.0/Pi));
}
return 0;
}
這裏使用到了三角函數的定義以及向量的知識,將題目給出的點轉化成向量,通過向量求出cos的值,再通過反三角函數的知識求出角度,由於兩條直線可以形成兩對角,題目要求求出最小的那個角度,在求出求出反三角函數後,由於題目要求的是角度,所以要進行轉換乘以180/Pi,我們可以知道,一對角是互餘的,判斷是否大於90度,如果大於就拿180減去求出來的度數,就得到比較小的角的度數。