HDU 1086 You can Solve a Geometry Problem too 判断任意两线段是否相交

来源:互联网 发布:淘宝网卖家信用高流量 编辑:程序博客网 时间:2024/05/17 11:05

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1086


题目大意:给出n条线段,求一共有多少个交点,忽略相交于同一点。

解题思路:设有线段AB,CD
判断AB和CD知否有交点:(同时满足,*表示叉乘)
1.C点和D点分别在AB的两侧 ---> 向量(AB*AC)*(AB*AD)<=0
   2.A点和B点分别在CD的两侧 ---> 向量(CD*CA)*(CD*CB)<=0


代码:
#include<iostream>#include<cstdio>using namespace std;#define N 210typedef struct{    double x,y;}Point;Point p[N];///叉乘double Judge(double x1,double y1,double x2,double y2){    return (x1*y2-x2*y1);}int main(){    int n;    while(scanf("%d",&n)&&n)    {        int ans=0;        if(n==1) ;        else{            for(int i=0;i<2*n;i+=2){                scanf("%lf%lf%lf%lf",&p[i].x,&p[i].y,&p[i+1].x,&p[i+1].y);            }            for(int i=0;i<2*n;i+=2){                for(int j=i+2;j<2*n;j+=2){                    if( ( Judge(p[i+1].x-p[i].x, p[i+1].y-p[i].y, p[j].x-p[i].x, p[j].y-p[i].y) * Judge(p[i+1].x-p[i].x, p[i+1].y-p[i].y, p[j+1].x-p[i].x, p[j+1].y-p[i].y) )<=0.0 ){                    if( ( Judge(p[j+1].x-p[j].x, p[j+1].y-p[j].y, p[i].x-p[j].x, p[i].y-p[j].y) * Judge(p[j+1].x-p[j].x, p[j+1].y-p[j].y, p[i+1].x-p[j].x, p[i+1].y-p[j].y) ) <=0.0 )                            ans++;                    }                }            }        }        printf("%d\n",ans);    }    return 0;}


0 0
原创粉丝点击