POJ 1269 Intersecting Lines 直线交

不知道谁转的计算几何题集里面有这个题...标题还写的是基本线段求交...

结果题都没看就直接敲了个线段交...各种姿势WA一遍以后发现题意根本不是线段交而是直线交...白改了那个模板...

乱发文的同学真是该死...浪费我几个小时的生命...

/********************* Template ************************/
#include <set>
#include <map>
#include <list>
#include <cmath>
#include <ctime>
#include <deque>
#include <queue>
#include <stack>
#include <bitset>
#include <cstdio>
#include <string>
#include <vector>
#include <cassert>
#include <cstdlib>
#include <cstring>
#include <sstream>
#include <fstream>
#include <numeric>
#include <iomanip>
#include <iostream>
#include <algorithm>
#include <functional>
using namespace std;

#define EPS         1e-8
#define MAXN        (int)5e5+5
#define MOD         (int)1e9+7
#define PI          acos(-1.0)
#define LINF        ((1LL)<<50)
#define INF         (1<<30)
#define DINF        (1e10)
#define max(a,b)    ((a) > (b) ? (a) : (b))
#define min(a,b)    ((a) < (b) ? (a) : (b))
#define max3(a,b,c) (max(max(a,b),c))
#define min3(a,b,c) (min(min(a,b),c))
#define BUG         cout<<"BUG! "<<endl
#define LLL         cout<<"--------------"<<endl
#define L(t)        (t << 1)
#define R(t)        (t << 1 | 1)
#define Mid(a,b)    ((a + b) >> 1)
#define lowbit(a)   (a & -a)
#define FIN         freopen("in.txt","r",stdin)
#define FOUT        freopen("out.txt","w",stdout)
#pragma comment     (linker,"/STACK:102400000,102400000")

// typedef long long LL;
// typedef unsigned long long ULL;
// typedef __int64 LL;
// typedef unisigned __int64 ULL;
// int gcd(int a,int b){ return b?gcd(b,a%b):a; }
// int lcm(int a,int b){ return a*b/gcd(a,b); }

/*********************   F   ************************/
struct POINT{
    double x,y;
    POINT(double _x = 0, double _y = 0):x(_x),y(_y){};
};
bool operator == (POINT a,POINT b){
    if(a.x == b.x && a.y == b.y) return true;
    return false;
}
struct LINE{
    POINT a,b;
    double K,B;
    LINE(POINT _a = 0,POINT _b = 0):a(_a),b(_b){
        if((a.x - b.x) == 0){
            K = DINF;
            B = a.x;
        }else{
            K = ((a.y - b.y) / (a.x - b.x));
            B = (- (b.x * a.y - a.x * b.y) / (a.x - b.x));
        }
    }

};
double dist(POINT p1,POINT p2){
    return(sqrt((p1.x-p2.x) * (p1.x-p2.x) + (p1.y-p2.y) * (p1.y-p2.y)));
}
double multiply(POINT sp,POINT ep,POINT op){
    return (sp.x-op.x) * (ep.y-op.y) - (ep.x-op.x) * (sp.y-op.y);
}
bool cross_Judge(LINE a ,LINE b) {
    double x = multiply(a.a,a.b,b.a);
    double y = multiply(a.a,a.b,b.b);
    if(x == 0 && y != 0) return true;
    if(x != 0 && y == 0) return true;
    return (x * y < 0);
}
bool same(LINE a , LINE b) {
    if(a.a == b.a && a.b == b.b) return true;
    if(a.b == b.a && a.a == b.b) return true;
    return false;
}
bool onseg(POINT a,POINT s,POINT e){
    if(multiply(a,s,e) == 0 && a.x <= max(s.x,e.x) && a.x >= min(s.x,e.x)
       && a.y <= max(s.y,e.y) && a.y >= min(s.y,e.y))
        return true;
    return false;
}
bool cover(LINE a , LINE b) {
    if(multiply(a.a,a.b,b.a) == 0 && multiply(a.a,a.b,b.b) == 0){
        if(onseg(a.a,b.a,b.b) || onseg(a.b,b.a,b.b)) return true;
        if(onseg(b.a,a.a,a.b) || onseg(b.b,a.a,a.b)) return true;
    }else return false;
}
bool cross(LINE a , LINE b){
    if(min(a.a.x,a.b.x) > max(b.a.x,b.b.x)) return false;
    if(min(b.a.x,b.b.x) > max(a.a.x,a.b.x)) return false;
    if(min(a.a.y,a.b.y) > max(b.a.y,b.b.y)) return false;
    if(min(b.a.y,b.b.y) > max(a.a.y,a.b.y)) return false;
    return (cross_Judge(a,b) && cross_Judge(b,a));
}
int main()
{
    //FIN;
    int n ;
    cin>>n;
    cout<<"INTERSECTING LINES OUTPUT"<<endl;
    for(int i = 0 ; i < n ; i++){
        double a,b,c,d,e,f,g,h;
        cin>>a>>b>>c>>d>>e>>f>>g>>h;
        LINE x = LINE(POINT(a,b),POINT(c,d));
        LINE y = LINE(POINT(e,f),POINT(g,h));
        if(multiply(x.a,x.b,y.a) == 0 && multiply(x.a,x.b,y.b) == 0){
            cout<<"LINE"<<endl;
            continue;
        }else if(x.K == y.K && x.B != y.B){
            cout<<"NONE"<<endl;
            continue;
        }else{
            cout<<"POINT ";
            if(x.K == DINF){
                printf("%.2lf %.2lf
",x.B,x.B * y.K + y.B);
            }else if(y.K == DINF) {
                printf("%.2lf %.2lf
",y.B,y.B * x.K + x.B);
            }else {
                double cx = (x.B-y.B) / (y.K-x.K);
                double cy = x.K * cx + x.B;
                printf("%.2lf %.2lf
",cx,cy);
            }
            continue;
        }
    }
    cout<<"END OF OUTPUT"<<endl;
    return 0;
}
原文地址:https://www.cnblogs.com/Felix-F/p/3251373.html