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

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

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

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

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 = 10005;
typedef long long LL;
struct Point{double x,y;
};
using namespace std;
Point point[12][22];
int t[12];
bool flag[21][21];//参数:
// POINT p 指定的某个点
// LPPOINT ptPolygon 多边形的各个顶点坐标(首末点可以不一致)
// int nCount 多边形定点的个数
bool PtInPolygon (Point p, int num)
{int nCross = 0;for(int i = 0; i < t[num]; i++){Point p1 = point[num][i];int tt =  (i+1) % 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-6)continue;double  x = (p.y - p1.y) * (p2.x - p1.x) / (p2.y - p1.y) + p1.x;if ( x > p.x )nCross++;}return (nCross % 2 == 1);
}
int main()
{
#ifndef ONLINE_JUDGEfreopen("in.in","r",stdin);
#endifint tt;cin >> tt;for(int cas = 1;cas <= tt;cas++){int n;cin >> n;memset(flag,0,sizeof(flag));for(int i = 0;i < n;i++){cin >> t[i];for(int j = 0;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 = 0;i < n;i++){for(int j = 0;j < n;j++){if(i != j){bool mark = 0;for(int k = 0;k < t[i];k++){if(PtInPolygon(point[i][k],j)){mark = 1;break;}}if(mark){flag[i][j] = flag[j][i] = 1;}}}}bool aflag = 1;cout << "Data Set #" << cas << endl;for(int i = 0;i < n;i++){for(int j = 0;j < n;j++){if(flag[i][j]){flag[i][j] = flag[j][i] = 0;aflag = 0;cout << i+1 << " "  << j+1<< endl;}}}if(aflag)cout << "no collisions" << endl;}return 0;
}

Code

测试用例:

14
2
4 0,0 1,0 1,1 0,1
4 2,2 3,2 3,3 2,3
4
3 2,1 1,2 2,3
3 2,1 3,2 2,3
5 2,0 4,2 2,4 5,4 5,0
4 3,3 1,3 1,5 3,5
1
3 0,0 1,1 1,0
3
3 0,0 1,1 2,0
3 2,0 0,0 1,1
3 4,4 3,3 5,4
2
3 0,0 1,1 2,0
3 4,4 3,3 5,4
10
4 1,1 1,5 5,5 5,1
4 2,4 2,2 4,2 4,4
4 3,2 2,2 2,4 3,4
4 3,4 4,4 4,2 3,2
8 1,5 1,1 3,1 3,2 2,2 2,4 3,4 3,5
8 5,5 5,1 3,1 3,2 4,2 4,4 3,4 3,5
8 5,5 3,5 3,4 2,4 2,2 3,2 3,1 5,1
8 1,5 3,5 3,4 4,4 4,2 3,2 3,1 1,1
3 1,5 1,1 2,3
3 4,3 5,5 5,1
2
7 1,1 1,5 4,5 2,4 4,3 2,2 4,1
7 6,5 5,5 3,4 5,3 3,2 5,1 6,1
3
3 0,0 100,100 50,49
3 1,1 2,0 1,0
3 2,1 3,2 3,1
3
5 1,2 2,5 3,5 5,2 4,1
5 7,2 8,3 7,5 10,5 10,2
4 0,0 0,75 80,5 99,1
2
4 4,2 3,3 4,5 5,3
4 7,3 5,0 2,3 4,6
2
4 4,2 3,3 4,5 5,3
4 4,6 2,3 5,0 7,3
2
4 5,3 4,5 3,3 4,2
4 4,6 2,3 5,0 7,3
2
4 5,3 4,5 3,3 4,2
4 7,3 5,0 2,3 4,6
2
20 0,0 9,0 9,11 0,11 0,2 7,2 7,9 2,9 2,4 5,4 5,5 3,5 3,8 6,8 6,3 1,3 1,10 8,10 8,1 0,1
4 4,6 4,7 5,7 5,6

View Code

ans:

Data Set #1
no collisions
Data Set #2
1 2
1 4
2 4
3 4
Data Set #3
no collisions
Data Set #4
1 2
Data Set #5
no collisions
Data Set #6
1 2
1 3
1 4
1 5
1 6
1 7
1 8
1 9
1 10
2 3
2 4
2 5
2 6
2 7
2 8
2 9
2 10
3 4
3 5
3 6
3 7
3 8
3 9
4 5
4 6
4 7
4 8
4 10
5 6
5 7
5 8
5 9
6 7
6 8
6 10
7 8
7 9
7 10
8 9
8 10
Data Set #7
no collisions
Data Set #8
1 2
Data Set #9
1 3
2 3
Data Set #10
1 2
Data Set #11
1 2
Data Set #12
1 2
Data Set #13
1 2
Data Set #14
no collisions

View Code

转载于:https://www.cnblogs.com/hanbinggan/p/4251164.html

poj 3082多边形相交 'Roid Rage相关推荐

  1. 平面图形原理总结(3):多边形相交

    前言 继续总结关于图形学的问题,这次总结下多边行的相交问题,同样可以自行阅读参考文献了解,以下是本人的自行总结内容. 参考文献:<计算机图形学--用OpenGL实现(第2版)> 清华大学出 ...

  2. POJ 3082 'Roid Rage 笔记

    m个多边形,给出多边形顶点数V,和每个顶点坐标.求相交的多边形对,每对按升序给出多边形序号.

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

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

  4. POJ 1584 A Round Peg in a Ground Hole(点到直线距离,圆与多边形相交,多边形是否为凸)...

    题意:给出一个多边形和一个圆,问是否是凸多边形,若是则再问圆是否在凸多边形内部. 分3步: 1.判断是否是凸多边形 2.判断点是否在多边形内部 3.判断点到各边的距离是否大于等于半径 上代码: #in ...

  5. 判断两个多边形相交的面积_聊聊3D模型组件—顶点,边,多边形

    3D模型设计 什么是3D模型? 3D模型是3D软件环境中任何三维对象(真实或虚构)的数学表示.与此不同,可以在专用软件套件中从任何角度查看3D模型,并且可以缩放,旋转或自由修改3D模型.创建和成形3D ...

  6. poj 1269 直线相交情况

    链接:http://poj.org/problem?id=1269 题意:给两条直线,判断它们是重合.平行还是相交,相交则求交点. #include<iostream> #include& ...

  7. 牛客网暑期ACM多校训练营(第三场) J Distance to Work 计算几何求圆与多边形相交面积模板...

    链接:https://www.nowcoder.com/acm/contest/141/J 来源:牛客网 Eddy has graduated from college. Currently, he ...

  8. golang求多边形相交面积

    直接上代码, 根据网上c++版本翻译 package mainimport ("fmt""math" )const maXn int = 300 const e ...

  9. cesium turf.js展示两多边形相交区域

    1. 安装turf图形辅助插件和turf求相交插件 npm install @turf/helpers //所有的基础图形 npm install @turf/intersect//用法 import ...

最新文章

  1. LeetCode实战:删除排序数组中的重复项
  2. HTML5+CSS学习心得
  3. freeRtos学习笔(3)临界区管理
  4. error C1189: #error : WINDOWS.H already included. MFC apps must not #include windows.h
  5. shell 定时删除制定目录下过期文件
  6. html中使浮动的字为行排列,CSS布局:float浮动
  7. python getattr_详解 Python 的二元算术运算,为什么说减法只是语法糖?
  8. leetcode 26 --- removeDuplicates
  9. springboot2 配置redis报错 redis timeout Value not a valid duration解决办法
  10. 初探SQL Server 2008商业智能
  11. 请画出使用mapreduce对英文句子_「Postgresql架构」用MapReduce的方式思考,但使用SQL...
  12. 防统方系统服务器的拼音,横渡医院防统方系统软件技术参数(最新)
  13. 有多少人欠网贷,往后的日子你打算怎么过?
  14. 关于runc漏洞CVE-2019-5736的修复公告 1
  15. Hadoop学习之hadoop安装、JDK安装、集群启动(完全分布式)
  16. 产品经理——跨境电商订单跟进邮件模板
  17. 随记:STM32L053LL库LPUART串口DMA接收数据
  18. 数学小故事之 柯西的故事
  19. 两张图看清英伟达RTX 20系列显卡的新变化
  20. 北京 上海 天津 河北 融资性担保机构经营许可证

热门文章

  1. 从零点五开始用Unity做半个2D战棋小游戏(四)
  2. 游戏音乐是游戏内涵的补充
  3. Oracle分区表 (二)
  4. 51Nod 1102 面积最大的矩形 +1272 最大距离 单调栈
  5. STM32 ADC 采样 频率的确定
  6. Android学习记录1--布局的类型
  7. int string java 呼转
  8. Redis快速入门:安装、配置和操作
  9. windows python3.2 shell环境(python叫做解释器)
  10. When.js 1.8.0 发布,Promises/A 的实现