题目链接:
UVALive 7004 Inside, Outside or On
题意:
顺时针给出多边形的顶点,另给出一点,判断额外点是在多边形边上还是多边形内部,还是多边形外部?
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <climits>
#include <cmath>
#include <ctime>
#include <cassert>
#define IOS ios_base::sync_with_stdio(0); cin.tie(0)
using namespace std;
const double eps = 1e-8;
const int MAX_N=1010;int T,n,m;//判断浮点数x的符号
int sgn(double x)
{if(fabs(x) < eps) return 0;else if(x < 0) return -1;else return 1;
}
struct Point{double x,y;Point () {}Point (double x,double y) : x(x),y(y) {}Point operator + (const Point& rhs) const {return Point(x+rhs.x,y+rhs.y);}Point operator - (const Point& rhs) const {return Point(x-rhs.x,y-rhs.y);}Point operator * (const double d) const {return Point(d*x,d*y);}bool operator == (const Point& rhs) const {if(sgn(x - rhs.x) == 0 && sgn(y - rhs.y) == 0) return true;else return false;}double dot(const Point& rhs) const {return x*rhs.x+y*rhs.y;}double cross(const Point& rhs) const{return (x*rhs.y-y*rhs.x);}
}point[MAX_N];bool on_seg(Point p1,Point p2,Point p) //判断p是否在线段p1--p2上
{return (p1 - p).cross(p2 - p) == 0 && (p1 - p).dot(p2 - p) <= 0;
}//判断多边形和点的关系: 3点在顶点上,2在边上,1在内部,0在外部
int relation_with_point(Point q, int n)
{for(int i = 1; i <= n; i++){if(q == point[i]) return 3;}point[n + 1] = point[1];for(int i = 1; i <= n; i++){if(on_seg(point[i], point[i + 1], q)) return 2;}int cnt = 0;for(int i = 1; i <= n; i++){int j = i + 1;int k = sgn((q - point[j]).cross(point[i] - point[j]));int u = sgn(point[i].y - q.y);int v = sgn(point[j].y - q.y);if(k > 0 && u < 0 && v >= 0) cnt++;if(k < 0 && v < 0 && u >= 0) cnt--;}return cnt != 0;
}int main()
{//freopen("000.in", "r", stdin);scanf("%d",&T);while(T--){scanf("%d%lf%lf",&m, &point[0].x, &point[0].y);for(int i = 0; i < m; i++){if(i) printf(" ");scanf("%d",&n);for(int j = 1; j <= n; j++){scanf("%lf%lf", &point[j].x, &point[j].y);}int ans = relation_with_point(point[0], n);if(ans == 3 || ans == 2) printf("0");else if(ans == 1) printf("1");else printf("2");}printf("\n");}return 0;
}