ACM/ICPC 之 平面几何-两直线关系(POJ 1269)
题意:给定四点的坐标(x,y),分别确定两直线,求出其交点,若重合or平行则输出相应信息
- 用四个点的坐标算出直线通式(ax+by+c=0)中的a,b,c,然后利用a,b,c计算出交点坐标(其他公式不够通用= =,比如斜率限制)
- 我利用两次平行判定重合
- 公式利用 初高中数学知识或代数知识 在草纸上仔细推导出来= =,让a,b,c为整数,比如可以演算得到a = y2-y1,b = x1-x2这一类公式。
详细Code如下:
1 //给定四点,分别确定两直线,求出其交点,若重合or平行则输出相应信息 2 //Memory 206 K,Time: 0 Ms 3 #include<iostream> 4 #include<cstring> 5 #include<cstdio> 6 using namespace std; 7 8 struct Point{ 9 int x,y; 10 }; 11 12 struct Line{ 13 int a,b,c; 14 }; 15 16 /*Judge s1-s2和s3-s4两条线平行*/ 17 int parallel(Point s1,Point s2,Point s3,Point s4) 18 { 19 if((s1.y-s2.y)*(s3.x-s4.x) == (s1.x-s2.x)*(s3.y-s4.y)) 20 return 1; 21 else 22 return 0; 23 } 24 25 /*构造直线*/ 26 Line lineform(int x1,int y1,int x2,int y2) 27 { 28 Line temp; 29 temp.a = y2 - y1; 30 temp.b = x1 - x2; 31 temp.c = -(temp.a*x1+temp.b*y1); 32 return temp; 33 } 34 35 int main() 36 { 37 int T; 38 Point p[4]; 39 Line l1,l2; 40 int i; 41 42 cin>>T; 43 cout<<"INTERSECTING LINES OUTPUT"<<endl; 44 while(T--) 45 { 46 for(i=0;i<4;i++) 47 scanf("%d%d",&p[i].x,&p[i].y); 48 49 if(parallel(p[0],p[1],p[2],p[3])) //平行 50 { 51 if(parallel(p[0],p[3],p[1],p[2])) //重合 52 cout<<"LINE"<<endl; 53 else 54 cout<<"NONE"<<endl; 55 } 56 else 57 { 58 l1 = lineform(p[0].x,p[0].y,p[1].x,p[1].y); 59 l2 = lineform(p[2].x,p[2].y,p[3].x,p[3].y); 60 61 /* 求交点 */ 62 double x,y,d; 63 d = l2.a*l1.b-l1.a*l2.b; 64 x = -(l1.b*l2.c - l2.b*l1.c)/d; 65 y = (l1.a*l2.c - l2.a*l1.c)/d; 66 printf("POINT %.2lf %.2lf\n",x,y); 67 } 68 } 69 cout<<"END OF OUTPUT"<<endl; 70 71 return 0; 72 }
他坐在湖边,望向天空,她坐在对岸,盯着湖面