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

测试用例:

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值