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 ...
随机推荐
- java中Map的用法(HaspMap用法)
public interface Map<K,V> 将键映射到值的对象.一个映射不能包含重复的键:每个键最多只能映射到一个值. import java.util.HashMap; impo ...
- Eclipse快捷键,前几个很实用
F3 :查看实现 F4(或control + T) :继承树 control + F6 :切换文件 control + F7 :切换视图 control + F8 :切换模板 control + O ...
- 使用ArrayList对大小写字母的随机打印
从a~z以及A~Z随机生成一个字母并打印:打印全部的字母 package com.liaojianya.chapter1; import java.util.ArrayList; /** * This ...
- LCS最长公共子序列HDU1159
最近一直在学习算法,基本上都是在学习动态规划以及字符串.当然,两者交集最经典之一则是LCS问题. 首先LCS的问题基本上就是在字符串a,b之间找到最长的公共子序列,比如 YAOLONGBLOG 和 Y ...
- MVVM模式应用 之的RelayCommand的使用
实现MVVM模式Command是立下了汗马功劳.当然ICommand要引用using System.Windows.Input命名空间. 比如: (1)我们在xaml页面有一个Button按钮,我们需 ...
- Windows phone 之独立存储
独立存储命名空间的说明:
- JavaScript 高阶函数 + generator生成器
map/reduce map()方法定义在JavaScript的Array中,我们调用Array的map()方法,传入我们自己的函数,就得到了一个新的Array作为结果: function pow(x ...
- 轻松使用px为单位开发移动端页面
研究移动端页面已经有许久了,一直执着于rem来开发,不谈性能怎么样,单从工作效率上看影响了不少,首先要固定设计稿的宽度,一般都是固定在640px,然后在根据根目录的字体大小来计算出每个元素的rem的值 ...
- Model Thinking1
Why Model Reason # 1: Intelligent Citizen of the World Reason # 2: Clearer Thinker Reason # 3: Under ...
- Sevlet局部变量初始化
//java 代码部分package com.servlet; import java.io.IOException; import java.io.PrintWriter; import java. ...