Geometric Shapes - POJ 3449(多边形相交)
#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(多边形相交)的更多相关文章
- POJ 3449 Geometric Shapes --计算几何,线段相交
题意: 给一些多边形或线段,输出与每一个多边形或线段的有哪一些多边形或线段. 解法: 想法不难,直接暴力将所有的图形处理成线段,然后暴力枚举,相交就加入其vector就行了.主要是代码有点麻烦,一步一 ...
- poj 3082多边形相交 'Roid Rage
题意是判断多边形是否相交 主要的思路就是判断每一个点是否在另外的多变形内 判断一个点是否在另一个多边形内主要思路是: 判断的那个点向左边做射线,如果射线与多边形的交点为奇数个则在多边形内,偶数个则不在 ...
- POJ 3449 Geometric Shapes(判断几个不同图形的相交,线段相交判断)
Geometric Shapes Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 1243 Accepted: 524 D ...
- TZOJ 2560 Geometric Shapes(判断多边形是否相交)
描述 While creating a customer logo, ACM uses graphical utilities to draw a picture that can later be ...
- POJ 3449 Geometric Shapes (求正方形的另外两点)
Geometric Shapes Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 1470 Accepted: 622 D ...
- Geometric Shapes (poj3449多边形相交)
题意:给你一些多边形的点,判断每个多边形和那些多边形相交,编号按照字典序输出 思路:枚举每个多边形的每条边看是否相交,这里的相交是包括端点的,关键是给你正方形不相邻两个点求另外两个点怎么求,长方形给你 ...
- poj3449 Geometric Shapes【计算几何】
含[判断线段相交].[判断两点在线段两侧].[判断三点共线].[判断点在线段上]模板 Geometric Shapes Time Limit: 2000MS Memory Limit: 655 ...
- Inheritance - SGU 129(线段与多边形相交的长度)
题目大意:给一个凸多边形(点不是按顺序给的),然后计算给出的线段在这个凸多边形里面的长度,如果在边界不计算. 分析:WA2..WA3...WA4..WA11...WA的无话可说,总之细节一定考虑清楚, ...
- hdu 5130(2014广州 圆与多边形相交模板)
题意:一个很多个点p构成的多边形,pb <= pa * k时p所占区域与多边形相交面积 设p(x,y), (x - xb)^2+(y - yb)^2 / (x - xa)^2+(y ...
随机推荐
- PHP 学习笔记 (四)
Wordpress 框架中的一些函数: wp_get_nav_menu($default): 根据条件$default 获取menu, 默认获取所有的menu 其中 $default 默认如下所示: ...
- pgsql与mysql 下 varchar类型的数字文本的排序 区别
两者都有cast函数,但使用方法完全不同. 1.在mysql中,cast( value as type) 将value的数据类型转换成type类型,其type可以为 二进制,同带binary前缀的效果 ...
- PYTHON开发--面向对象基础入门
面向对象 一:面向对象初级 1.思考:首先在python中,以前我们以前用到的几乎都是函数式编程,但是有时候函数式编程其中代码重复利用率太高,我们往往会把这些重复代码写进一个函数日后去调用,所以呢,今 ...
- window scipy install
http://www.lfd.uci.edu/~gohlke/pythonlibs/#numpy whl包,使用pip install xx.whl 安装 1:先安装 numpy+mkl. whl ...
- Swift(一,创建对象,类型推导,基本运算,逻辑,字符串,数组,字典)
swift用起来刚开始感觉有点怪怪的,但用了一段时间觉得还是挺好用的,哈哈.毕竟都是要有一个过程的嘛. 我就写一些自己在使用swift的时候的注意点吧,如有不正之处,还请指正! 一.在开发中优先使用常 ...
- android学习(2) 多线程的理解
多线程操作UI的运行原理: UI线程:首先启动app时,系统会自动启动一个UI线程,然后此线程会创建一个Looper(注:Looper构造函数会实例化一个MessageQueue的消息队列存在变量mQ ...
- python 模块导入
1. 模块导入: 要使用一个模块,我们必须首先导入该模块.Python使用import语句导入一个模块.例如,导入系统自带的模块 math: import math 你可以认为math就是一个指向已导 ...
- bzoj 1034: [ZJOI2008]泡泡堂BNB 貪心
1034: [ZJOI2008]泡泡堂BNB Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1398 Solved: 727[Submit][Sta ...
- Codeforces 731D Funny Game
Description Once upon a time Petya and Gena gathered after another programming competition and decid ...
- html5自定义标签选择器
* E[attr]:只使用属性名,但没有确定任何属性值 * E[attr="value"]:指定属性名,并指定了该属性的属性值.必须和元素的属性完全匹配 * E[attr~=&qu ...