题目大意:给一些几何图形的编号,求出来这些图形都和那些相交。
 
分析:输入的正方形对角线上的两个点,所以需要求出来另外两个点,公式是:
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. BearSkill实用方法之UITextField限制输入的字符数量

    原文:http://blog.csdn.net/xiongbaoxr/article/details/51525061      

  2. PL/SQL常见设置--Kevin的专栏

    body { font-family: "Microsoft YaHei UI","Microsoft YaHei",SimSun,"Segoe UI ...

  3. spring源码_下载以及转入eclipse (2016-11-08)

    本例spring源码版本是4.3.0的, 所以jdk需要准备1.8的(不同版本源码要求的jdk不一样) 1.8版本myeclipse10无编译环境,只有运行环境,出现点问题,下载最新版本的Eclips ...

  4. python中的“引用”和C++的引用

    python并不刻意区分“按值传递”和“按引用传递”. 在底层,python将值分为不可变对象(比如int,str)和可变对象(比如列表).所有的变量都是对某个对象的引用,赋值(=)和函数参数传递,都 ...

  5. 理解MySQL——索引与优化(转)

    写 在前面:索引对查询的速度有着至关重要的影响,理解索引也是进行数据库性能调优的起点.考虑如下情况,假设数据库中一个表有10^6条记录,DBMS的页 面大小为4K,并存储100条记录.如果没有索引,查 ...

  6. 从外国html5网站上扒来一个鼠标经过的css3 效果,感觉很不错

    鼠标经过的时候,感觉有点像一张纸卷上去的感觉. 下面是代码 <div class="main-container types"> <div class=" ...

  7. Zend Studio 11.0.2 破解和汉化

    本方法适用于Zend Studio 11.0.2,亲测,其他版本未知. 破解方法:覆盖安装目录 plugins 里同名文件,启动任意输入即可注册. Windows版下载地址:http://downlo ...

  8. AS3的数据类型和定义

    AS3的数据类型分: 基元数据类型:Boolean  int(整数)  Number(长的浮点数)  unit(很大的正整数)  String 复杂数据类型:Arrary  Date  Error   ...

  9. ecshop安装程序源码阅读-安装脚本(2)

    检查环境变量: 程序目录:图片目录,数据目录,临时目录 模板目录下模板文件 数据库连接函数 数据库配置: 读取数据库列表 创建配置文件(数据库,语言,session有效期等) 创建数据表 创建初始化数 ...

  10. PHP 关于 $GLOBALS['HTTP_RAW_POST_DATA']

    PHP 关于 $GLOBALS['HTTP_RAW_POST_DATA'] 最近用微信api写接口时用到了这个,记录,下面转载开始: —————————— 这是手册里写的 总是产生变量包含有原始的 P ...