POJ 3449 Geometric Shapes 判断多边形相交
题意不难理解,给出多个多边形,输出多边形间的相交情况(嵌套不算相交),思路也很容易想到。枚举每一个图形再枚举每一条边
恶心在输入输出,不过还好有sscanf(),不懂可以查看cplusplus网站
根据正方形对角的两顶点求另外两个顶点公式:
x2 = (x1+x3-y3+y1)/2; y2 = (x3-x1+y1+y3)/2;
x4= (x1+x3+y3-y1)/2; y4 = (-x3+x1+y1+y3)/2;
还有很多细节要处理
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <map>
using namespace std; const double eps = 1e-8;
const double PI = acos(-1.0); int sgn(double x)
{
if(fabs(x) < eps) return 0;
return x < 0 ? -1:1;
} struct Point
{
double x,y;
Point() {}
Point(double _x,double _y)
{
x = _x,y = _y;
}
Point operator -(const Point &b)const
{
return Point(x - b.x,y - b.y);
}
//叉积
double operator ^(const Point &b)const
{
return x*b.y - y*b.x;
}
//点积
double operator *(const Point &b)const
{
return x*b.x + y*b.y;
}
}; struct Line
{
Point p,q;
Line() {};
Line(Point _p,Point _q)
{
p = _p,q = _q;
}
}; //*判断线段相交
bool inter(Line l1,Line l2)
{
return
max(l1.p.x,l1.q.x) >= min(l2.p.x,l2.q.x) &&
max(l2.p.x,l2.q.x) >= min(l1.p.x,l1.q.x) &&
max(l1.p.y,l1.q.y) >= min(l2.p.y,l2.q.y) &&
max(l2.p.y,l2.q.y) >= min(l1.p.y,l1.q.y) &&
sgn((l2.p-l1.q)^(l1.p-l1.q))*sgn((l2.q-l1.q)^(l1.p-l1.q)) <= 0 &&
sgn((l1.p-l2.q)^(l2.p-l2.q))*sgn((l1.q-l2.q)^(l2.p-l2.q)) <= 0;
} const int maxn=30; struct Shape
{
char id;
int nump;
Point p[maxn];
} shp[maxn]; bool cmp(Shape a,Shape b)
{
return a.id<b.id;
} char str[20];
int num[maxn];
char inters[maxn][maxn];
map<string,int>mp; int main()
{
// freopen("in.txt","r",stdin);
mp["square"]=2;
mp["line"]=2;
mp["triangle"]=3;
mp["rectangle"]=3;
int cnt=0;
while(scanf("%s",str))
{
if(strcmp(str,".")==0) break;
if(strcmp(str,"-")!=0)
{
shp[cnt].id=str[0];
char str_sh[20];
scanf("%s",str_sh);
int n;
if(mp.count(str_sh)) n=mp[str_sh];
else scanf("%d",&n);
shp[cnt].nump=0;
for(int i=0; i<n; i++)
{
scanf("%s",str);
int x,y;
sscanf(str,"%*c%d%*c%d",&x,&y);
shp[cnt].p[shp[cnt].nump++]=Point(x,y);
}
if(strcmp(str_sh,"rectangle")==0)
{
Point p1=shp[cnt].p[0];
Point p2=shp[cnt].p[1];
Point p3=shp[cnt].p[2];
shp[cnt].p[shp[cnt].nump++]=Point(p1.x+p3.x-p2.x,p1.y+p3.y-p2.y);
}
if(strcmp(str_sh,"square")==0)
{
Point p1=shp[cnt].p[0];
Point p3=shp[cnt].p[1];
shp[cnt].p[shp[cnt].nump++]=Point((p1.x+p3.x-p3.y+p1.y)/2,(p3.x-p1.x+p1.y+p3.y)/2);
shp[cnt].p[shp[cnt].nump++]=Point((p1.x+p3.x+p3.y-p1.y)/2,(-p3.x+p1.x+p1.y+p3.y)/2);
swap(shp[cnt].p[1],shp[cnt].p[2]);
}
cnt++;
continue;
}
sort(shp,shp+cnt,cmp);
memset(num,0,sizeof(num));
for(int i=0; i<cnt; i++)
{
for(int j=i+1; j<cnt; j++)
{
bool flag=false;
int num1=shp[i].nump;
int num2=shp[j].nump;
for(int k1=0; k1<num1 && !flag; k1++)
{
for(int k2=0; k2<num2 && !flag; k2++)
{
if(inter(Line(shp[i].p[k1],shp[i].p[(k1+1)%num1]),Line(shp[j].p[k2],shp[j].p[(k2+1)%num2])))
{
inters[i][num[i]++]=shp[j].id;
inters[j][num[j]++]=shp[i].id;
flag=true;
}
}
}
}
}
for(int i=0; i<cnt; i++)
{
printf("%c ",shp[i].id);
if(num[i]==0)
printf("has no intersections\n");
else if(num[i]==1)
printf("intersects with %c\n",inters[i][0]);
else if(num[i]==2)
printf("intersects with %c and %c\n",inters[i][0],inters[i][1]);
else
{
printf("intersects with ");
for(int j=0;j<num[i]-1;j++)
printf("%c, ",inters[i][j]);
printf("and %c\n",inters[i][num[i]-1]);
}
}
cnt=0;
puts("");
}
return 0;
}
POJ 3449 Geometric Shapes 判断多边形相交的更多相关文章
- 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
题目传送门 题意:给了若干个图形,问每个图形与哪些图形相交 分析:题目说白了就是处理出每个图形的线段,然后判断是否相交.但是读入输出巨恶心,就是个模拟题加上线段相交的判断,我第一次WA不知道输出要按字 ...
- Geometric Shapes (poj3449多边形相交)
题意:给你一些多边形的点,判断每个多边形和那些多边形相交,编号按照字典序输出 思路:枚举每个多边形的每条边看是否相交,这里的相交是包括端点的,关键是给你正方形不相邻两个点求另外两个点怎么求,长方形给你 ...
- POJ 3449 Geometric Shapes (求正方形的另外两点)
Geometric Shapes Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 1470 Accepted: 622 D ...
- POJ 3449 Geometric Shapes --计算几何,线段相交
题意: 给一些多边形或线段,输出与每一个多边形或线段的有哪一些多边形或线段. 解法: 想法不难,直接暴力将所有的图形处理成线段,然后暴力枚举,相交就加入其vector就行了.主要是代码有点麻烦,一步一 ...
- POJ 3449 Geometric Shapes
判断两个多边形是否相交,只需判断边是否有相交. 编码量有点大,不过思路挺简单的. #include<cstdio> #include<cstring> #include< ...
- POJ 3805 Separate Points (判断凸包相交)
题目链接:POJ 3805 Problem Description Numbers of black and white points are placed on a plane. Let's ima ...
- POJ 2653 Pick-up sticks (判断线段相交)
Pick-up sticks Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 10330 Accepted: 3833 D ...
随机推荐
- RHEL高级磁盘管理—Stratis
2. Stratis 本地存储管理工具,通过Stratis可以便捷的使用Thin Provisioning.Snapshots.Pool-based的管理和监控等高级存储功能. Stratis 基于x ...
- WPS 2010 页眉下方添加下划线
我们在使用Word2010编辑文档中时,有时需要在页眉下方删除或添加一条横线.本篇经验就来介绍一下删除和添加横线的方法. 工具/原料 Word 2010 一.删除横线 1 打开Word2010 ...
- 用于监视Linux上的内存使用情况的Bash脚本
用于监视Linux上的内存使用情况的Bash脚本 2019-06-17 11:32:45作者:戴进稿源:云网牛站 在本文中,我们添加了两个shell脚本来监视Linux操作系统上的内存利用率,即用于监 ...
- Linux如何查看文件的创建、修改时间?
Linux如何查看文件的创建.修改时间? 利用stat指令查看文件信息 三种时间的介绍 ATime --文件的最近访问时间 只要读取时间,ATime就会更新 MTime --文件的内容最近修改的时间 ...
- systemd 进程管理详解
systemd进程管理 systemd管理的优势 1.最新系统都采用systemd管理(RedHat7,CentOS7,Ubuntu15...) 2.CentOS7 支持开机并行启动服务,显著提高开机 ...
- python split方法
split方法说明: split方法通过指定分隔符对字符串进行切片,如果参数num有指定值,则分隔num+1个子字符串 split()方法语法: 1 str.split(str="&qu ...
- JMeter36个内置函数及11个新增函数介绍
JMeter内置了36个函数,这些函数可以通过函数助手进行编辑和测试.了解这些函数,不仅能提高JMeter的使用熟练度,也有助于知晓测试工具或测试框架通用的函数有哪些,在自主设计时,作为参考借鉴. J ...
- 【排除解决】System.Runtime.InteropServices.ExternalException (0x80004005): GDI+ 中发生一般性错误
前言: 今天项目发布上线,发布到正式环境验证功能的时候忽然方向之前做的一个图片合成的功能报错了提示:System.Runtime.InteropServices.ExternalException ( ...
- Elasticsearch常用DSL关键字
Elasticsearch常用DSL关键字 query: 用于包含查询使用到的语法 match_all: 最简单的查询,获取索引所有数据,类似搜索 *.如:"query":{&qu ...
- Megengine量化
Megengine量化 量化指的是将浮点数模型(一般是32位浮点数)的权重或激活值用位数更少的数值类型(比如8位整数.16位浮点数)来近似表示的过程. 量化后的模型会占用更小的存储空间,还能够利用许多 ...