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 }

 

    原文作者:Inkblots
    原文地址: https://www.cnblogs.com/Inkblots/p/4730800.html
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞