题意:给出你两条直线,求出这两条直线的关系,平行输出NONE,重合输出LINE, 相交输出交点POINT x y


题解:模板题,理解直线关系的求法即可。


代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
using namespace std;
const double eps=1e-12;
int dcmp(double x){
    if(fabs(x)<eps)return 0;
    return x>0?1:-1;
}
struct Point{
    double x, y;
    Point(){}
    Point(double _x, double _y){x=_x,y=_y;}
    void input(){scanf("%lf%lf", &x, &y);}
    bool operator == (Point b)const{
        return dcmp(x-b.x)==0 &&dcmp(y-b.y)==0;
    }
    bool operator < (Point b)const{
        return dcmp(x-b.x)==0?dcmp(y-b.y)<0:x<b.x;
    }
    Point operator -(const Point &b)const{
        return Point(x-b.x, y-b.y);
    }
    double operator ^(const Point &b)const{
        return x*b.y-y*b.x;
    }
    double operator *(const Point &b)const{
        return x*b.x+y*b.y;
    }
};
struct Line{
    Point s, e;
    Line(){}
    Line(Point _s, Point _e){s=_s, e=_e;}
    int relation(Point p){
        int c=dcmp((p-s)^(e-s));
        if(c<0)return 1;
        else if(c>0)return 2;
        else return 3;
    }
    bool parallel(Line v){
        return dcmp((e-s)^(v.e-v.s))==0;
    }
    int lineCrossLine(Line v){
        if((*this).parallel(v))return v.relation(s)==3;
        return 2;
    }
    Point crossPoint(Line v){
        double a1=(v.e-v.s)^(s-v.s);
        double a2=(v.e-v.s)^(e-v.s);
        return Point((s.x*a2-e.x*a1)/(a2-a1), (s.y*a2-e.y*a1)/(a2-a1));
    }
};
int main()
{
    int T;
    scanf("%d", &T);
    printf("INTERSECTING LINES OUTPUT\n");
    while(T--){
        Line l1, l2;
        l1.s.input();
        l1.e.input();
        l2.s.input();
        l2.e.input();
        int status = l1.lineCrossLine(l2);
        if(status==2){
            Point x=l1.crossPoint(l2);
            printf("POINT %.2f %.2f\n", x.x, x.y);
        }
        else if(status==1)puts("LINE");
        else puts("NONE");
    }
    printf("END OF OUTPUT\n");
    return 0;
}