UVA 11072 - Points(凸包+点在多边形内判定)
2014-06-27 18:33
375 查看
题目:Points
题意:给出两个点集A和B,对于B中每个点,问能否在A中找到不同的三个点组成三角形,使得该点落在这个三角形中。
先对A求凸包,很明显,如果一个点落在A的凸包里,那么肯定能在A中找到一个三角形使得该点在里面,反过来如果不在凸包里,就不可能找到。
点在多边形内的判定有多种方法,这里因为已经先求凸包了,所以可以利用点和线段的位置关系,如果点在所有线段的左边或是线段上(这里点在边上也算在多边形内),则说明点在多边形内。
题意:给出两个点集A和B,对于B中每个点,问能否在A中找到不同的三个点组成三角形,使得该点落在这个三角形中。
先对A求凸包,很明显,如果一个点落在A的凸包里,那么肯定能在A中找到一个三角形使得该点在里面,反过来如果不在凸包里,就不可能找到。
点在多边形内的判定有多种方法,这里因为已经先求凸包了,所以可以利用点和线段的位置关系,如果点在所有线段的左边或是线段上(这里点在边上也算在多边形内),则说明点在多边形内。
#include<cstdio> #include<cstring> #include<algorithm> #include<vector> using namespace std; inline void in(int &x){ x=0; char c=getchar(); bool mk=0; while(c<48 || c>57){ if(c=='-') mk=1; c=getchar(); } while(c>=48 && c<=57){ x = x*10+c-48; c = getchar(); } if(mk) x = -x; } struct Point{ int x, y; Point(){} Point(int x, int y):x(x),y(y){} bool operator < (const Point &tmp)const{ return x<tmp.x || (x==tmp.x&&y<tmp.y); } Point operator - (Point A){ return Point(x-A.x, y-A.y); } }; #define pb push_back int det(Point A, Point B){ return A.x*B.y - A.y*B.x; } vector<Point> V; Point ch[100010]; int m; char ans[2][10]={"inside","outside"}; void ConvexHull(){ m = 0; for(int i=0; i<V.size(); i++){ while(m>1 && det(ch[m-1]-ch[m-2], V[i]-ch[m-2]) <= 0) m--; ch[m++] = V[i]; } int k = m; for(int i=V.size()-2; i>=0; i--){ while(m>k && det(ch[m-1]-ch[m-2], V[i]-ch[m-2]) <= 0) m--; ch[m++] = V[i]; } } bool find(){ int x, y; in(x); in(y); Point P = Point(x,y); for(int i=0; i<m-1; i++){ if(det(ch[i+1]-ch[i], P-ch[i]) < 0) return 1; } return 0; } int main(){ int n, x, y; while(~scanf("%d", &n)){ V.clear(); for(int i=0; i<n; i++){ in(x); in(y); V.pb(Point(x,y)); } sort(V.begin(), V.end()); ConvexHull(); in(n); while(n--){ puts(ans[find()]); } } return 0; }
相关文章推荐
- (beginer) 凸包+点在多边形内 UVA 11072 Points
- UVA 478 Points in Figures: Rectangles…(判定点在多边形内)
- uva 11072 - Points(凸包)
- UVA 10256 The Great Divide(凸包应用 即凸包+线段相交判定+点是否在凸包内判断)
- 17.8.19 校内赛 解题报告【求线段交点+凸包+求多边形面积】【判定点是否在多边形内】【二分答案+半平面交】
- UVALive 6859 Points (凸包)
- 凸包,多边形面积,线段在多边形内的判定。
- poj 1584(凸包+点在凸多边形内+圆在凸多边形内)
- ZOJ 1081 Points Within(点在多边形内判定)
- UVA 10256 The Great Divide (凸包,多边形的位置关系)
- UVALive 6859 Points (凸包)
- ZOJ 1081 Points Within(点在多边形内判定)
- UVA 634 Polygon(模板题:判定点在多边形内)
- UVA 6859 Points(凸包的应用)
- HDU1616计算几何-凸包+点在多边形内+多边形的面积
- 简单几何(向量旋转+凸包+多边形面积) UVA 10652 Board Wrapping
- UVAlive 6859 Points(凸包)
- POJ 1584 A Round Peg in a Ground Hole(凸包判定,多边形计算与判定)
- UVALive 4639 && SPOJ SPOINTS && POJ 3805 && AOJ 1298 Separate Points 求两个凸包是否相交 难度:3
- UVALive 6859 Points (凸包)