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 = 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相关推荐
- 平面图形原理总结(3):多边形相交
前言 继续总结关于图形学的问题,这次总结下多边行的相交问题,同样可以自行阅读参考文献了解,以下是本人的自行总结内容. 参考文献:<计算机图形学--用OpenGL实现(第2版)> 清华大学出 ...
- POJ 3082 'Roid Rage 笔记
m个多边形,给出多边形顶点数V,和每个顶点坐标.求相交的多边形对,每对按升序给出多边形序号.
- Geometric Shapes - POJ 3449(多边形相交)
题目大意:给一些几何图形的编号,求出来这些图形都和那些相交. 分析:输入的正方形对角线上的两个点,所以需要求出来另外两个点,公式是: x2:=(x1+x3+y3-y1)/2; y2:=(y1+y3 ...
- POJ 1584 A Round Peg in a Ground Hole(点到直线距离,圆与多边形相交,多边形是否为凸)...
题意:给出一个多边形和一个圆,问是否是凸多边形,若是则再问圆是否在凸多边形内部. 分3步: 1.判断是否是凸多边形 2.判断点是否在多边形内部 3.判断点到各边的距离是否大于等于半径 上代码: #in ...
- 判断两个多边形相交的面积_聊聊3D模型组件—顶点,边,多边形
3D模型设计 什么是3D模型? 3D模型是3D软件环境中任何三维对象(真实或虚构)的数学表示.与此不同,可以在专用软件套件中从任何角度查看3D模型,并且可以缩放,旋转或自由修改3D模型.创建和成形3D ...
- poj 1269 直线相交情况
链接:http://poj.org/problem?id=1269 题意:给两条直线,判断它们是重合.平行还是相交,相交则求交点. #include<iostream> #include& ...
- 牛客网暑期ACM多校训练营(第三场) J Distance to Work 计算几何求圆与多边形相交面积模板...
链接:https://www.nowcoder.com/acm/contest/141/J 来源:牛客网 Eddy has graduated from college. Currently, he ...
- golang求多边形相交面积
直接上代码, 根据网上c++版本翻译 package mainimport ("fmt""math" )const maXn int = 300 const e ...
- cesium turf.js展示两多边形相交区域
1. 安装turf图形辅助插件和turf求相交插件 npm install @turf/helpers //所有的基础图形 npm install @turf/intersect//用法 import ...
最新文章
- LeetCode实战:删除排序数组中的重复项
- HTML5+CSS学习心得
- freeRtos学习笔(3)临界区管理
- error C1189: #error : WINDOWS.H already included. MFC apps must not #include windows.h
- shell 定时删除制定目录下过期文件
- html中使浮动的字为行排列,CSS布局:float浮动
- python getattr_详解 Python 的二元算术运算,为什么说减法只是语法糖?
- leetcode 26 --- removeDuplicates
- springboot2 配置redis报错 redis timeout Value not a valid duration解决办法
- 初探SQL Server 2008商业智能
- 请画出使用mapreduce对英文句子_「Postgresql架构」用MapReduce的方式思考,但使用SQL...
- 防统方系统服务器的拼音,横渡医院防统方系统软件技术参数(最新)
- 有多少人欠网贷,往后的日子你打算怎么过?
- 关于runc漏洞CVE-2019-5736的修复公告 1
- Hadoop学习之hadoop安装、JDK安装、集群启动(完全分布式)
- 产品经理——跨境电商订单跟进邮件模板
- 随记:STM32L053LL库LPUART串口DMA接收数据
- 数学小故事之 柯西的故事
- 两张图看清英伟达RTX 20系列显卡的新变化
- 北京 上海 天津 河北 融资性担保机构经营许可证