题目大意:给出两条直线,每个直线上的两点,求这两条直线的位置关系:共线,平行,或相交,相交输出交点。
题目思路:主要在于求交点
F0(X)=a0x+b0y+c0==0;
F1(X)=a1x+b1y+c1==0;
设点(x0,y0)(x1,y1)过直线
解方程:a=y1-y0,b=x0-x1,c=x1y0-x0y1;
联立方程:
X=(b0c1-b1c0)/d;
Y=(a0c1-a1c0)/d;
d=a0b1-a1b0;
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include<iostream> #include<algorithm> #include<cstring> #include<vector> #include<stdio.h> #include<stdlib.h> #include<queue> #include<math.h> #include<map> #define INF 0x3f3f3f3f #define MAX 100005 #define Temp 1000000000 #define MOD 1000000007 using namespace std; int n; int check(int x1,int y1,int x2,int y2,int x3,int y3)//叉积 { return (x3-x2)*(y3-y1)-(x3-x1)*(y3-y2); } void Point(int x1,int y1,int x2,int y2,int x3,int y3,int x4,int y4) { int b0=x2-x1; int b1=x4-x3; int a0=y1-y2; int a1=y3-y4; int c0=x1*y2-x2*y1; int c1=x3*y4-x4*y3; int d=a0*b1-a1*b0; double X=(b0*c1-b1*c0*1.0)/d; double Y=(a1*c0-a0*c1*1.0)/d; printf("POINT %.2f %.2f ",X,Y); } void solve(int x1,int y1,int x2,int y2,int x3,int y3,int x4,int y4) { if(check(x1,y1,x2,y2,x3,y3)==0 && check(x1,y1,x2,y2,x4,y4)==0) printf("LINE ");//共线 else if((y2-y1)*(x3-x4) == (y3-y4)*(x2-x1)) printf("NONE ");//平行 else Point(x1,y1,x2,y2,x3,y3,x4,y4); } int main() { int n,x1,y1,x2,y2,x3,y3,x4,y4; scanf("%d",&n); printf("INTERSECTING LINES OUTPUT "); for(int i=0; i<n; i++) { scanf("%d%d%d%d%d%d%d%d",&x1,&y1,&x2,&y2,&x3,&y3,&x4,&y4); solve(x1,y1,x2,y2,x3,y3,x4,y4); } printf("END OF OUTPUT "); return 0;