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