判断线段之间的关系(D - Intersecting Lines POJ - 1269 )

时间:2021-05-27 18:17:08

题目链接:https://vjudge.net/contest/276358#problem/D

题目大意:每一次给你两条直线,然后问你这两条直线的关系(平行,共线,相交(输出交点))。

具体思路:先判断共线,再去判断平行,其次是相交,这些都能通过叉积来判断。

首先输入的是四个点,P1,P2,P3,P4.

共线的话,我们线确定一条直线,P1,P2。然后我们看p1,p2,p3这三个点形成的两条线是不是为0,然后再去看p1,p2,p4形成的两条直线是不是也是0,如果都满足的话,就是共线。

平行的话,就看这两条直线的叉积是不是0就可以了。

共线的话,推公式就可以了。假设交点,然后就是两个两元表达式,就可以把交点求出来了。

AC代码:

 #include<iostream>
#include<stack>
#include<stdio.h>
#include<iomanip>
#include<cmath>
using namespace std;
# define ll long long
const int maxn = +;
const double eps = 1e-;
int cal(int x1,int y1,int x2,int y2){
return x1*y2-x2*y1;
}
int main( ) {
int T;
int x1,y1,x2,y2;
int x3,y3,x4,y4;
double a1,a2,b1,b2,c1,c2;
scanf("%d",&T);
printf("INTERSECTING LINES OUTPUT\n");
while(T--){
scanf("%d %d %d %d %d %d %d %d",&x1,&y1,&x2,&y2,&x3,&y3,&x4,&y4);
if(cal(x2-x1,y2-y1,x3-x1,y3-y1)==&&cal(x2-x1,y2-y1,x4-x1,y4-y1)==) {
printf("LINE\n");
}
else if(cal(x2-x1,y2-y1,x4-x3,y4-y3)==){
printf("NONE\n");
}
else {
a1=y1-y2;
a2=y3-y4;
b1=x2-x1;
b2=x4-x3;
c1=x1*y2-x2*y1;
c2=x3*y4-x4*y3;
printf("POINT %.2lf %.2lf\n",(c1*b2-c2*b1)/(a2*b1-a1*b2),(c1*a2-c2*a1)/(b2*a1-b1*a2));
}
}
printf("END OF OUTPUT\n");
return ;
}