zoukankan      html  css  js  c++  java
  • POJ1269:Intersecting Lines(判断两条直线的关系)

    题目:POJ1269

    题意:给你两条直线的坐标,判断两条直线是否共线、平行、相交,若相交,求出交点。

    思路:直线相交判断、如果相交求交点。

    首先先判断是否共线,之后判断是否平行,如果都不是就直接求交点了。

    #include <iostream>
    #include <string.h>
    #include <stdio.h>
    #include <algorithm>
    #include <math.h>
    #include <queue>
    #define inf 0x3f3f3f3f
    #define eps 1e-9
    typedef long long ll;
    using namespace std;
    int n;
    struct Point
    {
        double x,y;
    };
    struct Line
    {
        Point a,b;
    } line[3];
    double xmult(Point p1,Point p2,Point p)//叉积
    {
        return (p1.x-p.x)*(p2.y-p.y)-(p1.y-p.y)*(p2.x-p.x);
    }
    int parallel(Line u,Line v)
    {
        return ((u.a.x-u.b.x)*(v.a.y-v.b.y)-(v.a.x-v.b.x)*(u.a.y-u.b.y));
    }
    Point intersection(Line u,Line v)
    {
        Point ret=u.a;
        double t=((u.a.x-v.a.x)*(v.a.y-v.b.y)-(u.a.y-v.a.y)*(v.a.x-v.b.x))/((u.a.x-u.b.x)*(v.a.y-v.b.y)-(u.a.y-u.b.y)*(v.a.x-v.b.x));
        ret.x+=(u.b.x-u.a.x)*t;
        ret.y+=(u.b.y-u.a.y)*t;
        return ret;
    }
    int main()
    {
        while(scanf("%d",&n)!=EOF)
        {
            cout<<"INTERSECTING LINES OUTPUT"<<endl;
            for(int i=0; i<n; i++)
            {
                scanf("%lf%lf%lf%lf%lf%lf%lf%lf",&line[1].a.x,&line[1].a.y,&line[1].b.x,&line[1].b.y,&line[2].a.x,&line[2].a.y,&line[2].b.x,&line[2].b.y);
                if(fabs(parallel(line[1],line[2]))<=eps&&fabs(xmult(line[1].a,line[1].b,line[2].a))<=eps)
                {
                    printf("LINE
    ");
                }
                else if(fabs(parallel(line[1],line[2]))<=eps)
                {
                    printf("NONE
    ");
                }
                else
                {
                    Point tt=intersection(line[1],line[2]);
                    printf("POINT %.2f %.2f
    ", tt.x,tt.y);//poj只能输出f
                }
            }
            printf("END OF OUTPUT
    ");
        }
        return 0;
    }

     转载:

    给你两条直线,判断这两条直线是否共线,相交,不相交(即平行),相交的话输出交点。

    判断平行,然后通过叉积判断是否共线。

    平行判断可以判断两条直线的斜率是否相等。

    交点的话,相当于联立方程组求解了。

    这些方程看模板理解的,刚才搜了下,有人讲得比较清楚,借鉴下http://blog.csdn.net/dreamvyps/archive/2011/01/25/6162690.aspx

    如何判断是否同线?由叉积的原理知道如果p1,p2,p3共线的话那么(p2-p1)X(p3-p1)=0。因此如果p1,p2,p3共线,p1,p2,p4共线,那么两条直线共线。direction()求叉积,叉积为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。//就是斜率,已懂

  • 相关阅读:
    2016年中国大学生程序设计竞赛(杭州)解题报告
    HNOI2017滚粗记
    BZOJ4515 SDOI2016 游戏
    BZOJ2157 旅行 模拟
    codevs2019 Uva10029 递变阶梯
    POJ 2585 Window Pains 题解
    linux 下 打包 和解压缩
    php 分页
    js 四舍五入
    angularjs 过滤多组数据
  • 原文地址:https://www.cnblogs.com/zhangmingcheng/p/4278507.html
Copyright © 2011-2022 走看看