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;
}
    
    
   
  
   
   
   
  
  

posted @ 2011-05-05 20:52  CoderZhuang  阅读(186)  评论(0编辑  收藏  举报