首页 > 代码库 > poj 3082多边形相交 'Roid Rage

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_JUDGE    freopen("in.in","r",stdin);#endif    int 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

测试用例:

技术分享
1424 0,0 1,0 1,1 0,14 2,2 3,2 3,3 2,343 2,1 1,2 2,33 2,1 3,2 2,35 2,0 4,2 2,4 5,4 5,04 3,3 1,3 1,5 3,513 0,0 1,1 1,033 0,0 1,1 2,03 2,0 0,0 1,13 4,4 3,3 5,423 0,0 1,1 2,03 4,4 3,3 5,4104 1,1 1,5 5,5 5,14 2,4 2,2 4,2 4,44 3,2 2,2 2,4 3,44 3,4 4,4 4,2 3,28 1,5 1,1 3,1 3,2 2,2 2,4 3,4 3,58 5,5 5,1 3,1 3,2 4,2 4,4 3,4 3,58 5,5 3,5 3,4 2,4 2,2 3,2 3,1 5,18 1,5 3,5 3,4 4,4 4,2 3,2 3,1 1,13 1,5 1,1 2,33 4,3 5,5 5,127 1,1 1,5 4,5 2,4 4,3 2,2 4,17 6,5 5,5 3,4 5,3 3,2 5,1 6,133 0,0 100,100 50,493 1,1 2,0 1,03 2,1 3,2 3,135 1,2 2,5 3,5 5,2 4,15 7,2 8,3 7,5 10,5 10,24 0,0 0,75 80,5 99,124 4,2 3,3 4,5 5,34 7,3 5,0 2,3 4,624 4,2 3,3 4,5 5,34 4,6 2,3 5,0 7,324 5,3 4,5 3,3 4,24 4,6 2,3 5,0 7,324 5,3 4,5 3,3 4,24 7,3 5,0 2,3 4,6220 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,14 4,6 4,7 5,7 5,6
View Code

ans:

技术分享
Data Set #1no collisionsData Set #21 21 42 43 4Data Set #3no collisionsData Set #41 2Data Set #5no collisionsData Set #61 21 31 41 51 61 71 81 91 102 32 42 52 62 72 82 92 103 43 53 63 73 83 94 54 64 74 84 105 65 75 85 96 76 86 107 87 97 108 98 10Data Set #7no collisionsData Set #81 2Data Set #91 32 3Data Set #101 2Data Set #111 2Data Set #121 2Data Set #131 2Data Set #14no collisions
View Code

 

poj 3082多边形相交 'Roid Rage