题目大意:给一些几何图形的编号,求出来这些图形都和那些相交。
分析:输入的正方形对角线上的两个点,所以需要求出来另外两个点,公式是:
x2:=(x1+x3+y3-y1)/2; y2:=(y1+y3+x1-x3)/2;
x4:=(x1+x3-y3+y1)/2; y4:=(y1+y3-x1+x3)/2;
这个是可以推倒出来的,有兴趣的可以推一下,给的矩形三个点,是按照顺序给的,求出来第四个点即可,比较容易求,x4=x1-x2+x3, y4=y1-y2+y3
别的图形的点也都是按照顺序给的,两个图形如果相交一定是边的相交,一个图形把另一个包含不算相交。所以处理完输入输出,还是比较容易做的。
代码如下:
========================================================================================================================
#include<stdio.h>
#include<math.h>
#include<string.h>
#include<algorithm>
using namespace std; const int MAXN = ;
const double EPS = 1e-; int Sign(double t)
{
if(t > EPS)return ;
if(fabs(t) < EPS)return ;
return -;
}
struct Point
{
double x, y;
Point(double x=, double y=):x(x),y(y){}
Point operator - (const Point &tmp)const{
return Point(x-tmp.x, y-tmp.y);
}
double operator ^(const Point &tmp)const{
return x*tmp.y - y*tmp.x;
}
};
struct Segment
{
Point S, E;
Segment(Point S=, Point E=):S(S), E(E){}
bool Intersect(const Segment &tmp)const{
int t1 = Sign((S-E)^(tmp.S-E));
int t2 = Sign((S-E)^(tmp.E-E)); return abs(t1+t2) != ;
}
};
struct Shapes
{
Segment sg[MAXN];
int N;
};
bool Find(int u, int v, Shapes a[])
{
for(int i=; i<a[u].N; i++)
for(int j=; j<a[v].N; j++)
{
if(a[u].sg[i].Intersect(a[v].sg[j]) && a[v].sg[j].Intersect(a[u].sg[i]))
return true;
} return false;
}
void Link(Shapes a[], int k, Point p[])
{
int i, N=a[k].N;
p[N] = p[];
for(i=; i<=N; i++)
a[k].sg[i-] = Segment(p[i-], p[i]);
}
int main()
{
char Id[MAXN], s[MAXN], s1[MAXN], s2[MAXN];
Shapes a[MAXN];
Point p[MAXN]; memset(a, , sizeof(a)); while(scanf("%s", Id) != EOF && Id[] != '.')
{
if(Id[] == '-')
{
for(int i=; i<MAXN; i++)
{
if(a[i].N)
{///如果这个符号的形状存在
int ans[MAXN], k=;
for(int j=; j<MAXN; j++)
{
if(!a[j].N || i==j)
continue;
if(Find(i, j, a) == true)
ans[k++] = j;
} if(k == )
printf("%c intersects with %c\n", i+'A', ans[]+'A');
else if(k == )
printf("%c has no intersections\n", i+'A');
else
{
printf("%c intersects with %c", i+'A', ans[]+'A');
for(int t=; t<k-; t++)
printf(", %c", ans[t]+'A');
if(k == )
printf(" and %c\n", ans[k-]+'A');
else
printf(", and %c\n", ans[k-]+'A');
}
}
}
printf("\n");
memset(a, , sizeof(a));
}
else
{
scanf("%s", s);
int k = Id[] - 'A'; if(strcmp(s, "square") == )
{///正方形
a[k].N = ;
scanf("%s%s", s1, s2);
sscanf(s1, "(%lf,%lf)", &p[].x, &p[].y);
sscanf(s2, "(%lf,%lf)", &p[].x, &p[].y); p[].x = (p[].x+p[].x + p[].y-p[].y)/;
p[].y = (p[].x-p[].x + p[].y+p[].y)/;
p[].x = (p[].x+p[].x + p[].y-p[].y)/;
p[].y = (p[].x-p[].x + p[].y+p[].y)/;
}
else if(strcmp(s, "line") == )
{///直线
a[k].N = ;
scanf("%s%s", s1, s2);
sscanf(s1, "(%lf,%lf)", &p[].x, &p[].y);
sscanf(s2, "(%lf,%lf)", &p[].x, &p[].y);
}
else if(strcmp(s, "rectangle") == )
{///长方形
a[k].N = ;
for(int t=; t<; t++)
{
scanf("%s", s1);
sscanf(s1, "(%lf,%lf)", &p[t].x, &p[t].y);
}
p[].x = p[].x-p[].x+p[].x;
p[].y = p[].y-p[].y+p[].y;
}
else if(strcmp(s, "triangle") == )
{///三角形
a[k].N = ;
for(int t=; t<; t++)
{
scanf("%s", s1);
sscanf(s1, "(%lf,%lf)", &p[t].x, &p[t].y);
}
}
else if(strcmp(s, "polygon") == )
{///多边形
scanf("%d", &a[k].N); for(int t=; t<a[k].N; t++)
{
scanf("%s", s1);
sscanf(s1, "(%lf,%lf)", &p[t].x, &p[t].y);
}
} Link(a, k, p);
}
} return ;
}