zoukankan      html  css  js  c++  java
  • poj 3449 Geometric Shapes

    http://poj.org/problem?id=3449

    在平面上给定一些几何图形,求任一个图形会和其它的哪些图形相交。

    本题并不难,线段相交判断即可。在求解正方形时,已知正方形的两个对角点(x0,y0),(x2,y2)时可由下面的方程求出(x1,y1),(x3,y3)。

    x1 + x3 = x0 + x2;

    x1 - x3 = y2 - y0;

    y1 + y3 = y0 + y2;

    y3 - y1 = x2 - x0;

    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    #include<math.h>
    #include<iostream>
    #include<algorithm>
    using namespace std;
    int n;
    struct point
    {
     double x,y;
    };
    struct pic
    {
     char a;
     char b[20],ans[30];
     point p[25];
     int s,m;
    }it[30];
    double multi(point p0,point p1,point p2)
    {
     return (p1.x-p0.x)*(p2.y-p0.y)-(p2.x-p0.x)*(p1.y-p0.y);
    }
    bool is(point s1,point e1,point s2,point e2)
    {
     return  (max(s1.x,e1.x)>=min(s2.x,e2.x))&&
          (max(s2.x,e2.x)>=min(s1.x,e1.x))&&
         (max(s1.y,e1.y)>=min(s2.y,e2.y))&&
         (max(s2.y,e2.y)>=min(s1.y,e1.y))&&
         (multi(s1,s2,e1)*multi(s1,e1,e2)>=0)&&
          (multi(s2,s1,e2)*multi(s2,e2,e1)>=0);
    }

    void input(int i)
    {
     int j,n;
     char b[30],c[30];
     cin>>b;
     if(strcmp(b,"square")==0||strcmp(b,"line")==0)
     {
      for(j=0;j<2;j++)
      {
       getchar();
       scanf("(%lf,%lf)",&it[i].p[j].x,&it[i].p[j].y);
      }
      it[i].s=2;
      if(strcmp(b,"square")==0)
      {
       it[i].p[2]=it[i].p[1];
       it[i].p[1].x=(it[i].p[0].x+it[i].p[2].x-it[i].p[0].y+it[i].p[2].y)/2;
       it[i].p[1].y=(it[i].p[0].x-it[i].p[2].x+it[i].p[0].y+it[i].p[2].y)/2;
       it[i].p[3].x=(it[i].p[0].x+it[i].p[2].x+it[i].p[0].y-it[i].p[2].y)/2;
       it[i].p[3].y=(-it[i].p[0].x+it[i].p[2].x+it[i].p[0].y+it[i].p[2].y)/2;
       it[i].p[4]=it[i].p[0];
       it[i].s=5;
      }
     }
     else if(strcmp(b,"triangle")==0||strcmp(b,"rectangle")==0)
     {
      for(j=0;j<3;j++)
      {
       getchar();
       scanf("(%lf,%lf)",&it[i].p[j].x,&it[i].p[j].y);
      }
      it[i].p[3]=it[i].p[0];
      it[i].s=4;
      if(strcmp(b,"rectangle")==0)
      {
       
       it[i].p[3].y=it[i].p[0].y-it[i].p[1].y+it[i].p[2].y;
       it[i].p[3].x=it[i].p[0].x-it[i].p[1].x+it[i].p[2].x;
       it[i].p[4]=it[i].p[0];
       it[i].s=5;
      }
     }
     else if(strcmp(b,"polygon")==0) 
     {
      cin>>n;
      for(j=0;j<n;j++)
      {
       getchar();
       scanf("(%lf,%lf)",&it[i].p[j].x,&it[i].p[j].y);
      }
      it[i].p[n]=it[i].p[0];
      it[i].s=n+1;
     }
    }
    bool judge(int a,int b)
    {
     int i,j;
     for(i=0;i<it[a].s-1;i++)
     for(j=0;j<it[b].s-1;j++)
     {
      if(is(it[a].p[i],it[a].p[i+1],it[b].p[j],it[b].p[j+1]))
      return true;
     }
     return false;
    }
    bool cmp(pic a,pic b)
    {
     return a.a<b.a;

    int main()
    {
     char a;
     int i,j,num;
     while(cin>>a,a!='.')
     {
      i=0;
      it[i].a=a;
      input(i);
      it[i++].m=0;
      while(cin>>a,a!='-')
      {
       it[i].a=a;
       input(i);
       it[i++].m=0;
      }
      num=i;
      sort(it,it+num,cmp);
      for(i=0;i<num;i++)
      for(j=0;j<num;j++)
      {
       if(i==j)
       continue;
       if(judge(i,j))
        it[i].ans[it[i].m++]=it[j].a;
      }
      for(i=0;i<num;i++)
      {
       printf("%c ",it[i].a);
       if(it[i].m==0)
        printf("has no intersections\n");
       else
       {
        printf("intersects with %c",it[i].ans[0]);
        //printf(".%d.",it[i].m);
        for(j=1;j<it[i].m-1;j++)
        printf(", %c",it[i].ans[j]);
        if(it[i].m>2)
        printf(",");
        if(it[i].m>1)
        printf(" and %c",it[i].ans[it[i].m-1]);
        printf("\n");
       }
      }
      printf("\n"); 
     }
     return 0;
    }
        
        
       
      
       
       
       
      
      

  • 相关阅读:
    linux of函数实例
    Linux libenv 编译移植
    OpenTracing简单了解
    Byte Buddy简单学习
    JavaAgent简单学习
    TB2安装ubuntu16.04+kinetic的ROS包
    常用工具传送门
    ROS传送门
    结对第二次—文献摘要热词统计及进阶需求
    结对第一次—原型设计(文献摘要热词统计)
  • 原文地址:https://www.cnblogs.com/zxj015/p/2740218.html
Copyright © 2011-2022 走看看