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(任意多边形相交面积)
链接 多边形的面积求解是通过选取一个点(通常为原点或者多边形的第一个点)和其它边组成的三角形的有向面积. 对于两个多边形的相交面积就可以通过把多边形分解为三角形,求出三角形的有向面积递加.三角形为凸多 ...
随机推荐
- JMS 企业开发流程实现
关于JMS的一些介绍参见[http://blog.csdn.net/aking21alinjuju/article/details/6051421] [补充] 消息的组成 1. 头(head) 每条J ...
- 四级流水线的8bit加法器
以流水线实现8bit 加法器. //date : 2013/8/23 //designer :pengxiaoen //function : module pipeline ( clock ,rese ...
- centos php扩展开发流程
原文:centos php扩展开发流程 一.安装php centos 默认 yum 安装 php 版本为 5.3, 很多php框架基本上要求5.4以上版本,这时候不能直接 用 yum install ...
- App状态管理-AppDelegate
前面提到AppDelegate的实例在UIApplicationMain函数中被创建并调用. AppDelegate的主要作用,可以从其继承类可以看出 class AppDelegate:UIResp ...
- (十六)JQuery Ready和angularJS controller的运行顺序问题
项目中使用了JQuery和AngularJS框架,近期定位一个问题,原因就是JQuery Ready写在了angularJS controller之前,导致JQuery选择器无法选中须要的元素(由于a ...
- C++ 中mallon动态分配内存大小用法
#include<iostream> using namespace std; int main(){ char *s; int n; cin>>n; s= (char *) ...
- solr4.x设置默认查询字段
1.如果需要同时在title和content中进行查询,可以添加如下字段: <field name="title_content" type="textComple ...
- 开始着手Oracle中Scott用户的管理系统
准备好长时间,一直想把最近所学用于实践,正好想到Oracle的Scott用户的表设计还算合理,且自己也很熟悉,现将整个系统的架构设定如下: 1.数据库不用说,Oracle 11g 的 Scott 用户 ...
- 基于Tire树和最大概率法的中文分词功能的Java实现
对于分词系统的实现来说,主要应集中在两方面的考虑上:一是对语料库的组织,二是分词策略的制订. 1. Tire树 Tire树,即字典树,是通过字串的公共前缀来对字串进行统计.排序及存储的一种树形结构 ...
- POI读入excel文件到Java中
package Poi_Test; //导入java自带的包 import java.io.BufferedInputStream; import java.io.File; import java. ...