zoukankan      html  css  js  c++  java
  • POJ 1269 Intersecting Lines(简单判断直线关系)

    题目大意:给出两条直线(由4个点确定),要求判断出这两条直线的关系:平行,同线,相交。如果相交还要求出交点坐标。

    思路:

    先判断两条直线是不是同线,不是的话再判断是否平行,再不是的话就只能是相交的,求出交点。

    ​如何判断是否同线?如果p1,p2,p3共线,p1,p2,p4共线,那么两条p1p2,p3p4直线共线。即求(p1,p2,p3)以及(p1,p2,p4)的叉积,叉积都为0说明共线。

    如何判断是否平行?由向量可以判断出两直线是否平行。如果两直线平行,那么向量p1p2、p3p4也是平等的。即((p1.x-p2.x)(p3.y-p4.y)-(p1.y-p2.y)(p3.x-p4.x))==0说明向量平等。

    如何求出交点?用到叉积的原理。假设交点为p0(x0,y0)。则有:

    (p1-p0)X(p2-p0)=0

    (p3-p0)X(p2-p0)=0

    展开后即是

    (y1-y2)x0+(x2-x1)y0+x1y2-x2y1=0

    (y3-y4)x0+(x4-x3)y0+x3y4-x4y3=0

    将x0,y0作为变量求解二元一次方程组。

    假设有二元一次方程组

    a1x+b1y+c1=0;

    a2x+b2y+c2=0

    那么

    x=(c1*b2-c2*b1)/(a2*b1-a1*b2);

    y=(a2*c1-a1*c2)/(a1*b2-a2*b1);

    因为此处两直线不会平行,所以分母不会为0。

    具体代码实现:

    #include <iostream>
    #include <cmath>
    using namespace std;
    
    struct Point{
        double x;
        double y;   
    };
    
    Point p1,p2,p3,p4;
    
    const double eps=1e-8;
    
    double mult(Point p1, Point p2, Point p3){  
        return (p2.x - p1.x)*(p3.y - p1.y) - (p3.x - p1.x)*(p2.y - p1.y);
    }
    int main()
    
    {
        int n = 0;
        scanf("%d", &n);    
        printf("INTERSECTING LINES OUTPUT
    ");
        for (int i = 0; i < n; ++i) {
            scanf("%lf %lf %lf %lf %lf %lf %lf %lf", &p1.x, &p1.y, &p2.x, &p2.y, &p3.x, &p3.y, &p4.x, &p4.y);
            if (fabs(mult(p1,p2,p3)) <= eps && fabs(mult(p1,p2,p4)) <= eps){
                printf("LINE
    ");
            }
            else if ((p2.x - p1.x) * (p4.y - p3.y) == (p4.x - p3.x) * (p2.y - p1.y)){
                printf("NONE
    ");
            }
            else{
                double a1 = p1.y - p2.y;
                double b1 = p2.x - p1.x;
                double c1 = p1.x*p2.y - p2.x*p1.y;
                double a2 = p3.y - p4.y;
                double b2 = p4.x - p3.x;    
                double c2 = p3.x*p4.y - p4.x*p3.y;
                double x = (b1*c2 - b2*c1)/(a1*b2 - a2*b1);
                double y = (a2*c1 - a1*c2)/(a1*b2 - a2*b1);
                printf("POINT %.2lf %.2lf
    ", x, y);
            }   
        }
        printf("END OF OUTPUT
    ");
        return 0;   
    }
    
    
    

    版权声明:本文为博主原创文章,未经博主允许不得转载。

  • 相关阅读:
    Zabbix5 Frame 嵌套
    Zabbix5 对接 SAML 协议 SSO
    CentOS7 安装 Nexus
    CentOS7 安装 SonarQube
    GitLab 后台修改用户密码
    GitLab 查看版本号
    GitLab Admin Area 500 Error
    Linux 安装 PostgreSQL
    Liger ui grid 参数
    vue.js 是一个怪东西
  • 原文地址:https://www.cnblogs.com/wanglaoda/p/4937170.html
Copyright © 2011-2022 走看看