zoukankan      html  css  js  c++  java
  • 【POJ 1269】判断两直线相交

    利用叉积解方程

    #include <cstdio>
    #define MAX 1<<31
    #define dd double
    int xmult(dd x1,dd y1,dd x2,dd y2,dd x,dd y){
        return (x1-x)*(y2-y)-(x2-x)*(y1-y);
    }
    int main(){
        int n;
        dd x1,y1,x2,y2,x3,y3,x4,y4;
        scanf("%d",&n);
        puts("INTERSECTING LINES OUTPUT");
        while(n--){
            scanf("%lf%lf%lf%lf%lf%lf%lf%lf",&x1,&y1,&x2,&y2,&x3,&y3,&x4,&y4);
            dd a1=y1-y2;
            dd b1=x2-x1;
            dd c1=xmult(x1,y1,x2,y2,0,0);
            dd a2=y3-y4;
            dd b2=x4-x3;
            dd c2=xmult(x3,y3,x4,y4,0,0);
            if(a1*b2==a2*b1){
                if(xmult(x1,y1,x2,y2,x3,y3)==0)
                    puts("LINE");
                else puts("NONE");
            }
            else {
                dd cx,cy;
                cx=(b1*c2-c1*b2)/(a1*b2-a2*b1);
                cy=(a1*c2-c1*a2)/(b1*a2-b2*a1);
                printf("POINT %.2f %.2f
    ",cx,cy);
            }
        }
        puts("END OF OUTPUT");
    }

    利用点斜式解方程

    #include <cstdio>
    #define MAX 1<<31
    #define dd double
    struct P{
        dd x,y;
        void input(){
            scanf("%lf%lf",&x,&y);
        }
        void output(){
            printf("POINT %.2f %.2f
    ",x,y);
        }
    };
    struct L{
        P s,e;
        void input(){
            s.input(),e.input();
        }
        dd k(){
            if(s.x==e.x)return MAX;
            return (s.y-e.y)/(s.x-e.x);
        }
    }l1,l2;
    int xmult(P a,P b,P o){
        return (a.x-o.x)*(b.y-o.y)-(b.x-o.x)*(a.y-o.y);
    }
    void getCross(L a,L b){
        P c;
        dd ka=a.k(),kb=b.k();
        if(ka==MAX){//a是竖直的
            c.x=a.s.x;
            c.y=(c.x-b.s.x)*kb+b.s.y;
        }
        else{
            if(kb==MAX)
                c.x=b.s.x;
            else
                c.x=(a.s.y-b.s.y-ka*a.s.x+kb*b.s.x)/(kb-ka);
            c.y=(c.x-a.s.x)*ka+a.s.y;
        }
        c.output();
    }
    int main(){
        int n;
        scanf("%d",&n);
        puts("INTERSECTING LINES OUTPUT");
        while(n--){
            l1.input(),l2.input();
            dd ka=l1.k(),kb=l2.k();
            if(ka==kb){
                if(xmult(l1.s,l1.e,l2.s)==0)
                    puts("LINE");
                else puts("NONE");
            }
            else 
                getCross(l1,l2);
        }
        puts("END OF OUTPUT");
    }

      

  • 相关阅读:
    创建数据库链
    redis命令
    redis.conf文件配置信息
    mybatis调用存储过程实现
    oracle游标使用遍历3种方法
    Proud Merchants
    Bag Problem
    Watch The Movie
    Accepted Necklace
    Bone Collector II
  • 原文地址:https://www.cnblogs.com/flipped/p/5723223.html
Copyright © 2011-2022 走看看