• 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
    ",x,y);
    67         }
    68     }
    69     cout<<"END OF OUTPUT"<<endl;
    70 
    71     return 0;
    72 }
    他坐在湖边,望向天空,她坐在对岸,盯着湖面
  • 相关阅读:
    [转载]读史札记21:出局依然是英雄
    关于 Delphi 中窗体的停靠
    关于 Indy 的发送与接收 及 不定长度流的见解
    基于Indy10 ,TCPIP 聊天示例
    opera 去除标题栏,最大化窗口代码
    第二篇 《XML 类化生成工具》
    第一篇《后缀表达式》
    多线程操作一例:查找 pas dfm 里的中文
    关于批量执行SQL语句
    Erlang 学习笔记 (一)
  • 原文地址:https://www.cnblogs.com/Inkblots/p/4730800.html
Copyright © 2020-2023  润新知