http://acm.hdu.edu.cn/showproblem.php?pid=1086

判断两线段是否相交,用向量搞了

View Code
#include <iostream>
using namespace std ;
struct point{
    double x,y ;
} ;
typedef struct L{
    point p1,p2 ;
}L ;
L kk[110] ;
double direction(point p1,point p2,point p)
{
    return (p.x-p1.x)*(p1.y-p2.y)-(p1.x-p2.x)*(p.y-p1.y) ;
}
bool online(point p1,point p2,point p)
{
    return (p.x<=max(p1.x,p2.x) && p.x>=min(p1.x,p2.x) && p.y<=max(p1.y,p2.y) && p.y>=min(p1.y,p2.y)) ;
}
bool intersect(point p1,point p2,point p3,point p4)
{
    double d1=direction(p3,p4,p1) ;
    double d2=direction(p3,p4,p2) ;
    double d3=direction(p1,p2,p3) ;
    double d4=direction(p1,p2,p4) ;
    if(d1*d2<0 && d3*d4<0)
        return true ;
    if(d1==0 && online(p3,p4,p1)) 
        return true ;
    if(d2==0 && online(p3,p4,p2))
        return true ;
    if(d3==0 && online(p1,p2,p3))
        return true ;
    if(d4==0 && online(p1,p2,p4))
        return true ;
    return false ;
}
int main()
{
    int n ;
    while(scanf("%d",&n),n)
    {
        int ans=0 ;
        for(int i=0;i<n;i++)
            scanf("%lf%lf%lf%lf",&kk[i].p1.x,&kk[i].p1.y,&kk[i].p2.x,&kk[i].p2.y) ;
        for(int i=0;i<n;i++)
            for(int j=i+1;j<n;j++)
                if(intersect(kk[i].p1,kk[i].p2,kk[j].p1,kk[j].p2))
                    ans++ ;
        printf("%d\n",ans) ;
    }
    return 0 ;
}