poj 3082多边形相交 'Roid Rage
题意是判断多边形是否相交
主要的思路就是判断每一个点是否在另外的多变形内
判断一个点是否在另一个多边形内主要思路是:
判断的那个点向左边做射线,如果射线与多边形的交点为奇数个则在多边形内,偶数个则不在,其中有特殊情况:
1.如果判断的点与所要判断的边在平行且在所要判断的边上,则在多边形上
2.如果向左做射线恰好在某一点上,不特殊处理会计算两次,因为在两条边上,判断射线与多变形的交点数目,所以要在一个情况下忽略
3.就是判断点是否在多边形的左边了
but:WA了好久因为一个多边形可能包涵另一个多边形所以要全部遍历^!!!
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <map>
#include <cmath>
#include <cstring>
#include <string>
#include <queue>
#include <stack>
#include <cctype>
#include <set>
#define ALL(x) x.begin(),x.end()
#define INS(x) inserter(x,x.begin())
const int maxn = ;
typedef long long LL;
struct Point{
double x,y;
};
using namespace std;
Point point[][];
int t[];
bool flag[][]; //参数:
// POINT p 指定的某个点
// LPPOINT ptPolygon 多边形的各个顶点坐标(首末点可以不一致)
// int nCount 多边形定点的个数
bool PtInPolygon (Point p, int num)
{
int nCross = ;
for(int i = ; i < t[num]; i++){
Point p1 = point[num][i];
int tt = (i+) % t[num];
Point p2 = point[num][tt];
double x1 = min(p1.x,p2.x);
double x2 = max(p1.x,p2.x);
double y1 = min(p1.y,p2.y);
double y2 = max(p1.y,p2.y);
if((p.y-p1.y)*(p.x-p2.x) == (p.y-p2.y) * (p.x - p1.x)){
if(p.x >= x1 && p.x <= x2 && p.y >= y1 && p.y <= y2)
return true;
continue;
}
if(p.y < y1)
continue;
if(p.y > y2 || abs(p.y-y2) < 10e-)
continue;
double x = (p.y - p1.y) * (p2.x - p1.x) / (p2.y - p1.y) + p1.x;
if ( x > p.x )
nCross++;
}
return (nCross % == );
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("in.in","r",stdin);
#endif
int tt;
cin >> tt;
for(int cas = ;cas <= tt;cas++){
int n;
cin >> n;
memset(flag,,sizeof(flag));
for(int i = ;i < n;i++){
cin >> t[i];
for(int j = ;j < t[i];j++){
int tmp1,tmp2;
char ch;
cin >> tmp1 >> ch >> tmp2;
point[i][j].x = tmp1;
point[i][j].y = tmp2;
}
}
for(int i = ;i < n;i++){
for(int j = ;j < n;j++){
if(i != j){
bool mark = ;
for(int k = ;k < t[i];k++){
if(PtInPolygon(point[i][k],j)){
mark = ;
break;
}
}
if(mark){
flag[i][j] = flag[j][i] = ;
}
}
}
}
bool aflag = ;
cout << "Data Set #" << cas << endl;
for(int i = ;i < n;i++){
for(int j = ;j < n;j++){
if(flag[i][j]){
flag[i][j] = flag[j][i] = ;
aflag = ;
cout << i+ << " " << j+<< endl;
}
}
}
if(aflag)
cout << "no collisions" << endl;
}
return ;
}
Code
测试用例:
, , , ,
, , , , , , ,
, , ,
, , , , ,
, , , , , , , , , ,
, , ,
, , , , , ,
, , , , , , ,
, , , ,
, , , ,
, , , ,
, , , , , , , ,
, , , , , , , ,
, , , , , , , ,
, , , , , , , ,
, , ,
, , , , , , , , , ,
, , , , , , , , , ,
, , ,
, , , , , , , ,
, , , , ,
, , , , , , , ,
, , , , , , , ,
, , , , , , , ,
, , , , , , , ,
, , , , , , , , , , , , , , , , , , , , , , , ,
, , , ,
ans:
Data Set #
no collisions
Data Set # Data Set #
no collisions
Data Set # Data Set #
no collisions
Data Set # Data Set #
no collisions
Data Set # Data Set # Data Set # Data Set # Data Set # Data Set # Data Set #
no collisions
poj 3082多边形相交 'Roid Rage的更多相关文章
- Inheritance - SGU 129(线段与多边形相交的长度)
题目大意:给一个凸多边形(点不是按顺序给的),然后计算给出的线段在这个凸多边形里面的长度,如果在边界不计算. 分析:WA2..WA3...WA4..WA11...WA的无话可说,总之细节一定考虑清楚, ...
- Geometric Shapes (poj3449多边形相交)
题意:给你一些多边形的点,判断每个多边形和那些多边形相交,编号按照字典序输出 思路:枚举每个多边形的每条边看是否相交,这里的相交是包括端点的,关键是给你正方形不相邻两个点求另外两个点怎么求,长方形给你 ...
- hdu 5130(2014广州 圆与多边形相交模板)
题意:一个很多个点p构成的多边形,pb <= pa * k时p所占区域与多边形相交面积 设p(x,y), (x - xb)^2+(y - yb)^2 / (x - xa)^2+(y ...
- dtIntersectSegmentPoly2D 2D上的线段与多边形相交计算 产生结果:是否相交,线段跨越的开始和结束百分比,相交的边
dtIntersectSegmentPoly2D(startPos, endPos, verts, nv, tmin, tmax, segMin, segMax): http://geomalgori ...
- Geometric Shapes - POJ 3449(多边形相交)
题目大意:给一些几何图形的编号,求出来这些图形都和那些相交. 分析:输入的正方形对角线上的两个点,所以需要求出来另外两个点,公式是: x2:=(x1+x3+y3-y1)/2; y2:=(y1+y3 ...
- POJ 3449 Geometric Shapes 判断多边形相交
题意不难理解,给出多个多边形,输出多边形间的相交情况(嵌套不算相交),思路也很容易想到.枚举每一个图形再枚举每一条边 恶心在输入输出,不过还好有sscanf(),不懂可以查看cplusplus网站 根 ...
- poj 1410 线段相交判断
http://poj.org/problem?id=1410 Intersection Time Limit: 1000MS Memory Limit: 10000K Total Submissi ...
- poj 1066 线段相交
链接:http://poj.org/problem?id=1066 Treasure Hunt Time Limit: 1000MS Memory Limit: 10000K Total Subm ...
- hdu3060Area2(任意多边形相交面积)
链接 多边形的面积求解是通过选取一个点(通常为原点或者多边形的第一个点)和其它边组成的三角形的有向面积. 对于两个多边形的相交面积就可以通过把多边形分解为三角形,求出三角形的有向面积递加.三角形为凸多 ...
随机推荐
- javaScript 网页特效 输出语句
大家好,我是小强老师,今天主要讲解 三个最为常用的输出语句. alert() 弹出警示框 window.alert(‘继续学习’); 完整的写法 效果如下: 因为alert 属于window 对象 ...
- 敲入url到浏览器后会发生什么
浏览器连接DNS服务器,向url服务器请求把url转换为IP地址 DNS服务区返回URL的ip地址 浏览器建立一个TCP链接到web服务器80端口 web服务器发回的html代码 浏览器的渲染器根据h ...
- Arduino 入门程序示例之一排 LED(2015-06-11)
概述 最简单的一个 LED 的实验之后,自然是增加几个 LED,咱排成一排来玩吧.最后,再把一排的 LED 排成一个 8 字来玩——七段数码管. 示例程序 流水灯 第一个出场的肯定是经典的流水灯,也叫 ...
- BZOJ 3505: [Cqoi2014]数三角形( 组合数 )
先n++, m++ 显然答案就是C(3, n*m) - m*C(3, n) - n*C(3, m) - cnt. 表示在全部点中选出3个的方案减去不合法的, 同一行/列的不合法方案很好求, 对角线的不 ...
- 用CentOS,fedora等访问局域网中的Windows共享
来到Linux世界中已有一段时间了,感觉上好像自己的电脑成了一个孤岛.周围的人都还是用Windows系统,能相互共享文件,我用Linux系统,别人的共享文件都还不知道怎么访问?通过网上查资料学习,现在 ...
- (step6.1.5)hdu 1233(还是畅通工程——最小生成树)
题目大意:输入一个整数n,表示有n个村庄,在接下来的n*(n-1)/2中,每行有3个整数beigin.end.weight,分别表示路的起始村庄,结束村庄和村庄之间的距离. 求索要修的路的最短距离 解 ...
- 使用【百度云推送】第三方SDK实现推送功能具体解释
之前介绍过怎样使用shareSDK实现新浪微博分享功能,今天介绍怎样使用百度云推送SDK实现Android手机后台推送功能. 执行效果例如以下 第一步,假设使用百度的SDK,当然要先成为百度的开发人员 ...
- Ch02 从零开始实例学习3
提纲:---------------------------- 演练2-3:添加控制器 知识点2-3:控制器的职责 知识点2-4:控制器的类别与方法 ------------------------- ...
- 使用ssh远程执行命令批量导出数据库到本地(转)
前天正在跟前端的同事调试功能.服务器开好,模拟的玩家登录好,就在倒计时.这时突然运营的同事跑过来说要统计几个服务器玩家的一些情况,也就是需要从几个服的数据库导出部分玩家的数据.好吧,我看了一下时间,1 ...
- 【数位DP】 HDU 4722 Good Numbers
原题直通车: HDU 4722 Good Numbers 题意: 求区间[a,b]中各位数和mod 10==0的个数. 代码: #include<iostream> #include& ...