题目大意:给一些几何图形的编号,求出来这些图形都和那些相交。
 
分析:输入的正方形对角线上的两个点,所以需要求出来另外两个点,公式是:
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 ;
}

Geometric Shapes - POJ 3449(多边形相交)的更多相关文章

  1. POJ 3449 Geometric Shapes --计算几何,线段相交

    题意: 给一些多边形或线段,输出与每一个多边形或线段的有哪一些多边形或线段. 解法: 想法不难,直接暴力将所有的图形处理成线段,然后暴力枚举,相交就加入其vector就行了.主要是代码有点麻烦,一步一 ...

  2. poj 3082多边形相交 'Roid Rage

    题意是判断多边形是否相交 主要的思路就是判断每一个点是否在另外的多变形内 判断一个点是否在另一个多边形内主要思路是: 判断的那个点向左边做射线,如果射线与多边形的交点为奇数个则在多边形内,偶数个则不在 ...

  3. POJ 3449 Geometric Shapes(判断几个不同图形的相交,线段相交判断)

    Geometric Shapes Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 1243   Accepted: 524 D ...

  4. TZOJ 2560 Geometric Shapes(判断多边形是否相交)

    描述 While creating a customer logo, ACM uses graphical utilities to draw a picture that can later be ...

  5. POJ 3449 Geometric Shapes (求正方形的另外两点)

    Geometric Shapes Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 1470   Accepted: 622 D ...

  6. Geometric Shapes (poj3449多边形相交)

    题意:给你一些多边形的点,判断每个多边形和那些多边形相交,编号按照字典序输出 思路:枚举每个多边形的每条边看是否相交,这里的相交是包括端点的,关键是给你正方形不相邻两个点求另外两个点怎么求,长方形给你 ...

  7. poj3449 Geometric Shapes【计算几何】

    含[判断线段相交].[判断两点在线段两侧].[判断三点共线].[判断点在线段上]模板   Geometric Shapes Time Limit: 2000MS   Memory Limit: 655 ...

  8. Inheritance - SGU 129(线段与多边形相交的长度)

    题目大意:给一个凸多边形(点不是按顺序给的),然后计算给出的线段在这个凸多边形里面的长度,如果在边界不计算. 分析:WA2..WA3...WA4..WA11...WA的无话可说,总之细节一定考虑清楚, ...

  9. hdu 5130(2014广州 圆与多边形相交模板)

    题意:一个很多个点p构成的多边形,pb <= pa * k时p所占区域与多边形相交面积 设p(x,y),       (x - xb)^2+(y - yb)^2 / (x - xa)^2+(y ...

随机推荐

  1. web开发基础(同步更新中)

    1/Get与Post的区别 GET是我们都熟悉的.它用于请求网页文本.当你在浏览器输入harvard.edu,它会直接访问Harvard的web服务器,去GET /. 第二个最有名的是POST,它经常 ...

  2. VS2008/MFC —常用控件使用总结 转载

    在公司培训期间,经理给了我们没人10个界面草图,让我们在VS2008下使用MFC设计,因为在经理的帮助和自己的努力下,终于在三天时间内完成,现在就根据在这三天 时间里所用到的控件做出如下总结: 1.D ...

  3. 细介Nigix配置与反向代理

    Nginx(发 音同 engine x)是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,并在一个BSD-like 协议下 发行.由俄罗斯的程序设计师Igor S ...

  4. JS操作SELECT方法

    1.判断select选项中 是否存在Value="paraValue"的Item2.向select选项中 加入一个Item3.从select选项中 删除一个Item4.修改sele ...

  5. JavaScript学习总结【6】、JS BOM

    1.BOM 简介 所谓的 BOM 即浏览器对象模型(Browser Object Model).BOM 赋予了 JS 操作浏览器的能力,即 window 操作.DOM 则用于创建删除节点,操作 HTM ...

  6. Make body have 100% of the browser height

    Try setting the height of the html element to 100% as well. html, body { height: 100%; } Body looks ...

  7. 网页端启动WinForm

    网页端启动WinForm 程序 在逛淘宝或者使用QQ相关的产品的时候,比如淘宝我要联系店家点击旺旺图标的时候能够自动启动阿里旺旺进行聊天.之前很奇怪为什么网页端能够自动启动客户端程序,最近在开发吉特仓 ...

  8. hadoop的一些重要配置参数

    hadoop集群管理内存设置 Mapreduce内存使用设置 hadoop job重要性能参数

  9. 使用expect实现批量操作的自动化

    http://blog.csdn.net/hijk139/article/details/9121345

  10. 关于用xercesImpl包解析xml文件遇中文报错问题

    今天在运行项目时报错: Caused by: org.apache.xerces.impl.io.MalformedByteSequenceException: 3 字节 UTF-8 序列的字节 3 ...