求兩直線的夾角

描述

有兩條直線,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位小數)。

樣例輸入

2
0 0 0 1 0 0 1 0
0 0 1 1 1 1 1 0

樣例輸出

90.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減去求出來的度數,就得到比較小的角的度數。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章