在平面内判断俩直线是否有交点

来源:互联网 发布:女生百搭外套 知乎 编辑:程序博客网 时间:2024/05/22 15:26

http://acm.tzc.edu.cn/acmhome/problemdetail.do?&method=showdetail&id=5068

 

#include <stdio.h>
#include <iostream>
#include <math.h>
#include <cstring>
using namespace std;
#define MIN(x,y)(x<y?x:y)
#define MAX(x,y)(x>y?x:y)
#define esp 1e-8
struct point
{
    double x,y;
}a[120],c[120];
int T;
int b[110];
double len_x(point p1,point p2)
{
    return sqrt((p2.x-p1.x)*(p2.x-p1.x)+(p2.y-p1.y)*(p2.y-p1.y));
}
int bd(point p1,point p2,point p3,point p4)
{
    point tp1,tp2,tp3;
    point tp11,tp21,tp31;

    int a1,b1,a2,b2;
    int a3,a4,b3,b4;
    tp1.x=p1.x-p3.x;
    tp1.y=p1.y-p3.y;
    tp2.x=p4.x-p3.x;
    tp2.y=p4.y-p3.y;
    tp3.x=p2.x-p3.x;
    tp3.y=p2.y-p3.y;
    tp11.x=p4.x-p2.x;
    tp11.y=p4.y-p2.y;
    tp21.x=p1.x-p2.x;
    tp21.y=p1.y-p2.y;
    tp31.x=p3.x-p2.x;
    tp31.y=p3.y-p2.y;
    if((p1.x==p3.x&&p1.y==p3.y)||(p1.x==p4.x&&p1.y==p4.y)||(p2.x==p3.x&&p2.y==p3.y)||(p2.x==p4.x&&p2.y==p4.y))
        return 1;

   //  if((MIN(p1.x,p2.x)<=p3.x&&p3.x<=MAX(p1.x,p2.x)&&MIN(p1.y,p2.y)<=p3.y&&p3.y<=MAX(p1.y,p2.y))||(MIN(p1.x,p2.x)<=p4.x&&p4.x<=MAX(p1.x,p2.x)&&MIN(p1.y,p2.y)<=p4.y&&p4.y<=MAX(p1.y,p2.y)))
       //  ;
     //  else return 0;

    if((tp1.x*tp2.y-tp1.y*tp2.x)*(tp2.x*tp3.y-tp2.y*tp3.x)>=0&&(tp11.x*tp21.y-tp11.y*tp21.x)*(tp21.x*tp31.y-tp21.y*tp31.x)>=0)
    {
        if((tp1.x*tp2.y-tp1.y*tp2.x)*(tp2.x*tp3.y-tp2.y*tp3.x)==0&&(tp11.x*tp21.y-tp11.y*tp21.x)*(tp21.x*tp31.y-tp21.y*tp31.x)==0)
        {
            if(p1.x!=p2.x)
            {
            a1=MIN(p1.x,p2.x);
            a2=MAX(p1.x,p2.x);
            b1=MIN(p3.x,p4.x);
            b2=MAX(p3.x,p4.x);
            if(a1>b2||a2<b1)
                return 0;
            else
                return 1;
            }
            else
            {
            a1=MIN(p1.y,p2.y);
            a2=MAX(p1.y,p2.y);
            b1=MIN(p3.y,p4.y);
            b2=MAX(p3.y,p4.y);
             if(a1>b2||a2<b1)
                return 0;
            else
                return 1;
            }

        }
        else
        return 1;
    }
    return 0;
}
void dfs(int m)
{

    for(int i=0;i<T;i++)
    {
        if(b[i]&&bd(a[m],c[m],a[i],c[i]))
        {
            b[i]=0;
            //printf("%d %d\n",m,i);
            dfs(i);
        }
    }
}
int main()
{
    int n,m,i;
    while(~scanf("%d",&T))
    {
     for(i=0;i<T;i++)
        scanf("%lf%lf%lf%lf",&a[i].x,&a[i].y,&c[i].x,&c[i].y);
        int sum=0;
        memset(b,1,sizeof(b));
      for(i=0;i<T;i++)
       {
         if(b[i])
         {
            // printf("%d\n",i);
             b[i]=0;
             dfs(i);
             sum++;
         }

       }
      //printf("%d.\n",bd(a[4],c[4],a[3],c[3]));
        printf("%d\n",sum);

    }
}

0 0
原创粉丝点击