poj3449 多边形的相交问题,输入输出比较麻烦

这是一个关于解决多边形相交问题的程序,包含点、直线、三角形和多边形的输入输出处理。程序通过结构体表示点,判断相交的函数为inter(),并使用了jiao()函数来检测两个多边形是否相交。主要算法包括线段与线段、多边形与多边形的相交判断。
摘要由CSDN通过智能技术生成
#include<iostream>
#include<stdio.h>
#include<string.h>
#include<string>
#include<stdlib.h>
#include<cmath>
#include<queue>
#include<algorithm>
using namespace std;
#define rd(x) scanf("%d",&x)
#define rdd(x,y) scanf("%d%d",&x,&y)
#define rddd(x,y,z) scanf("%d%d%d",&x,&y,&z)
#define rdddd(x,y,z,w) scanf("%d%d%d%d",&x,&y,&z,&w)
#define rds(s) scanf("%s",s)
#define rep(i,n) for(int i=0;i<n;i++)
#define LL long long
const int N = 1e5+10;
const int M=5e5+10;
const int inf=1e9;
const double eps=1e-8;
const int MOD=1e9+7;
int n,m,k;
struct Point{
    double x,y;
    Point(){}
    Point(double _x,double _y){
        x=_x;y=_y;
    }
};
int sgn(double x) {return x<-eps?-1:x<eps?0:1;}
double cross(Point a,Point b,Point c){
    return (b.x-a.x)*(c.y-a.y)-(b.y-a.y)*(c.x-a.x);
}
struct node{
    char ch;
    int n;
    Point point[100];
    bool operator<(const node&o) const{
        return ch<o.ch;
    }
    void print(){
        cout<<ch<<" "<<"n: "<<n<<endl;
        for(int i=1;i<=n;i++) cout<<point[i].x<<" "<<point[i].y<<endl;
    }
}p[30];
bool inter(Point a,Point b,Point c,Point d){
    if( max(a.x,b.x)>=min(c.x,d.x) &&
         max(c.x,d.x)>=min(a.x,b.x) &&
         max(a.y,b.y)>=min(c.y,d.y) &&
         max(c.y,d.y)>=min(a.y,b.y) &&
         sgn(cross(a,b,c))*sgn(cross(a,b,d))<=0 &&
         sgn(cross(c,d,a))*sgn(cross(c,d,b))<=0) return true;
    return false;
}
bool jiao(node a,node b){
    for(int i=1;i<=a.n;i++){
        for(int j=1;j<=b.n;j++){
            Point p1,p2,p3,p4;
            p1=a.point[i];
            if(i==a.n) p2=a.point[1];
            else p2=a.point[i+1];

            p3=b.point[j];
            if(j==b.n) p4=b.point[1];
            else p4=b.point[j+1];
            if(inter(p1,p2,p3,p4)) return true;

        }
    }
    return false;
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("aaa","r",stdin);
#endif
    int T;
    char ch;
    char s[20];
    while(cin>>ch,ch!='.'){
        int i=0;
        while(ch!='-'){
            i++;
            scanf("%s",s);
            p[i].ch=ch;
            if(s[0]=='s'){
                p[i].n=4;
                double a,b,c,d;
                scanf(" (%lf,%lf) (%lf,%lf)",&a,&b,&c,&d);
                p[i].point[1]=Point(a,b);
                p[i].point[2]=Point((a+c+b-d)/2.0,(b+d+c-a)/2.0);
                p[i].point[3]=Point(c,d);
                p[i].point[4]=Point((a+c+d-b)/2.0,(b+d+a-c)/2.0);
            }else if(s[0]=='l'){
                p[i].n=2;
                double u,v,w,z;
                scanf(" (%lf,%lf) (%lf,%lf)",&u,&v,&w,&z);
                p[i].point[1]=Point(u,v);
                p[i].point[2]=Point(w,z);
            }else if(s[0]=='t'){
                  p[i].n=3;
                double u,v,w,z;
                scanf(" (%lf,%lf) (%lf,%lf)",&u,&v,&w,&z);
                p[i].point[1]=Point(u,v);
                p[i].point[2]=Point(w,z);
                 scanf(" (%lf,%lf) ",&u,&v);
                 p[i].point[3]=Point(u,v);
            }else if(s[0]=='p'){
                 scanf("%d",&p[i].n);
                 for(int j=1;j<=p[i].n;j++){
                    double u,v;
                    scanf(" (%lf,%lf)",&u,&v);
                    p[i].point[j]=Point(u,v);
                 }
            }else if(s[0]=='r'){
                double a,b,c,d,e,f;
                scanf(" (%lf,%lf) (%lf,%lf) (%lf,%lf)",&a,&b,&c,&d,&e,&f);
                p[i].n=4;
                p[i].point[1]=Point(a,b);
                p[i].point[2]=Point(c,d);
                p[i].point[3]=Point(e,f);
                p[i].point[4]=Point(a+e-c,f+b-d);
            }
            cin>>ch;
        }
        int cnt=i;
        sort(p+1,p+1+cnt);
        int ans[100];
        int tot=0;
        for(int i=1;i<=cnt;i++){
             tot=0;
              for(int j=1;j<=cnt;j++) if(i!=j){
                   if(jiao(p[i],p[j])) ans[tot++]=j;
              }
             // cout<<tot<<endl;
              printf("%c ",p[i].ch);
              if(tot==0) puts("has no intersections");
              else{
                printf("intersects with ");
                if(tot==1)  printf("%c\n",p[ans[0]].ch);
                else if(tot==2) printf("%c and %c\n",p[ans[0]].ch,p[ans[1]].ch);
                else for(int j=0;j<tot;j++){
                    if(j==tot-1) printf("and %c\n",p[ans[j]].ch);
                    else printf("%c, ",p[ans[j]].ch);
                }
              }
        }
        puts("");

    }




    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值