题意是判断多边形是否相交

主要的思路就是判断每一个点是否在另外的多变形内

判断一个点是否在另一个多边形内主要思路是:

判断的那个点向左边做射线,如果射线与多边形的交点为奇数个则在多边形内,偶数个则不在,其中有特殊情况:

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的更多相关文章

  1. Inheritance - SGU 129(线段与多边形相交的长度)

    题目大意:给一个凸多边形(点不是按顺序给的),然后计算给出的线段在这个凸多边形里面的长度,如果在边界不计算. 分析:WA2..WA3...WA4..WA11...WA的无话可说,总之细节一定考虑清楚, ...

  2. Geometric Shapes (poj3449多边形相交)

    题意:给你一些多边形的点,判断每个多边形和那些多边形相交,编号按照字典序输出 思路:枚举每个多边形的每条边看是否相交,这里的相交是包括端点的,关键是给你正方形不相邻两个点求另外两个点怎么求,长方形给你 ...

  3. hdu 5130(2014广州 圆与多边形相交模板)

    题意:一个很多个点p构成的多边形,pb <= pa * k时p所占区域与多边形相交面积 设p(x,y),       (x - xb)^2+(y - yb)^2 / (x - xa)^2+(y ...

  4. dtIntersectSegmentPoly2D 2D上的线段与多边形相交计算 产生结果:是否相交,线段跨越的开始和结束百分比,相交的边

    dtIntersectSegmentPoly2D(startPos, endPos, verts, nv, tmin, tmax, segMin, segMax): http://geomalgori ...

  5. Geometric Shapes - POJ 3449(多边形相交)

    题目大意:给一些几何图形的编号,求出来这些图形都和那些相交.   分析:输入的正方形对角线上的两个点,所以需要求出来另外两个点,公式是: x2:=(x1+x3+y3-y1)/2; y2:=(y1+y3 ...

  6. POJ 3449 Geometric Shapes 判断多边形相交

    题意不难理解,给出多个多边形,输出多边形间的相交情况(嵌套不算相交),思路也很容易想到.枚举每一个图形再枚举每一条边 恶心在输入输出,不过还好有sscanf(),不懂可以查看cplusplus网站 根 ...

  7. poj 1410 线段相交判断

    http://poj.org/problem?id=1410 Intersection Time Limit: 1000MS   Memory Limit: 10000K Total Submissi ...

  8. poj 1066 线段相交

    链接:http://poj.org/problem?id=1066 Treasure Hunt Time Limit: 1000MS   Memory Limit: 10000K Total Subm ...

  9. hdu3060Area2(任意多边形相交面积)

    链接 多边形的面积求解是通过选取一个点(通常为原点或者多边形的第一个点)和其它边组成的三角形的有向面积. 对于两个多边形的相交面积就可以通过把多边形分解为三角形,求出三角形的有向面积递加.三角形为凸多 ...

随机推荐

  1. USACO Milk2 区间合并

    这题WA了四次,后来发现不能用所谓的桶排来写 虽然空间上是可以的,但是存在这样一个问题 比如两组数据[15,20]和[21,30] 在20 和 21这两个时刻之间没有milking,但是用桶排的方法写 ...

  2. zk leader选举自动完成

    server 1: [root@wx03 bin]# ./zkServer.sh status ZooKeeper JMX enabled by default Using config: /zook ...

  3. MFC的消息映射机制揭秘

    MFC的设计者们在设计MFC时,紧紧把握一个目标,那就是尽可能使得MFC的代码要小,速度尽可能快.为了这个目标,他们使用了许多技巧,其中很多技巧体现在宏的运用上,实现MFC的消息映射的机制就是其中之一 ...

  4. 动态规划——最长公共子序列(LCS)

    /** * @brief longest common subsequence(LCS) * @author An * @data 2013.8.26 **/ #include <iostrea ...

  5. iframe,window,滚动栏的一些问题

    1.Iframe不显示边框:frameborder=0 2.Iframe不显示横向滚动栏:在iframe所指向的页面增加: <style> html{overflow-x:hidden;} ...

  6. linux指令(目录类操作指令)

    pwd 显示当前所在的工作目录 cd 目标目录    例如cd  /boot/grub 从当前目录切换到某个目录 cd  切换到根目录 cd.. 切换到当前目录的上层目录 ls  显示当前目录下的内容 ...

  7. 三种LVS负载均衡技术的优缺点----负载均衡调度算法

    三种LVS负载均衡技术的优缺点归纳以下表: VS/NATVS/TUNVS/DR 服务器操作系统任意支持隧道多数(支持Non-arp) 服务器网络私有网络局域网/广域网局域网 服务器数目(100M网络) ...

  8. httplib,urllib和urllib2

    一.httplib实现了HTTP和HTTPS的客户端协议,一般不直接使用,在python更高层的封装模块中(urllib,urllib2)使用了它的http实现. import httplib con ...

  9. Http报头Accept与Content-Type的差别

    1.Accept属于请求头. Content-Type属于实体头. Http报头分为通用报头,请求报头,响应报头和实体报头. 请求方的http报头结构:通用报头|请求报头|实体报头 响应方的http报 ...

  10. 嵌入jetty到Java代码

    在做Demo实例时,使用的jetty版本号为8.x. 为了避免麻烦,将全部的包都导入到MyEclipse的lib文件夹下. 实例1:自己定义handler的服务器 package com.jetty. ...