zoj 1081 Points Within 判断点是否在任意多边形内(模板)
来源:互联网 发布:7u分享网络注册 编辑:程序博客网 时间:2024/05/04 13:39
题目来源:
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=81
分析:
从p点出发做平行于x轴的射线 l。 求射线与 多边形 线段的交点数num, 若是偶数 , 该点 在外, 若为奇数, 该点在内。
注意: 两个特判,
1: 一个是 射线 l 与 多边形的边 重合 , 若该p点在 线段上, 返回1, 否则 交点 记为 0 个
2: 一个是 射线与 线段的交点 ,为线段的端点, 则我们 对线段的 较低交点 不计算。
代码如下:
const double EPS = 1e-12;const int Max_N = 110;double add(double a, double b){ return (fabs(a + b) < EPS * ( fabs(a) + fabs(b) )) ? 0 : (a+ b) ;}struct Point{ double x, y; Point(){} Point(double x , double y):x(x), y(y){} double dist(Point p){ return sqrt( add( (x - p.x)*(x - p.x) , (y - p.y)*(y - p.y) ) ) ; } Point operator - (Point p){ return Point( add(x ,- p.x) , add(y, - p.y)) ; } bool operator ==(Point p){ return (add(x,-p.x) == 0) && (add(y, -p.y) == 0) ; } double operator ^(Point p){ return add(x * p. y , - y * p.x) ; }}po[Max_N];//判断点p0是否在线段p1p2内int on_segment(Point p1, Point p2, Point p0){ if (((p1-p0).x * (p2-p0).x <=0 )&& ((p1-p0).y * (p2-p0).y <=0)) // 中间是 && return 1; return 0;}// 判断线段p1p2与q1是否相交int intersection(Point p1,Point p2, Point q1,Point q2){ double d1=(p2-p1)^(q1-p1); double d2=(p2-p1)^(q2-p1); double d3=(q2-q1)^(p1-q1); //--由于前面的特判,低处的交点不作为计算------ double d4=(q2-q1)^(p2-q1); if((d1==0 && on_segment(p1,p2,q1) ) || (d2==0 && on_segment(p1,p2,q2) ) // ||(d3==0&& on_segment(q1,q2,p1)) //由于前面的特判,低处的交点不作为计算- || (d4==0 && on_segment(q1,q2,p2))) return 1; else if(d1*d2<0 && d3*d4 <0) // 中间是 && return 1; return 0;}// 判断点p是否在线段p1p2上bool in_segment(Point p1, Point p2, Point p){ return ( ((p - p1)^(p2 - p1)) == 0 && on_segment(p1 , p2 , p)) ;}int n , i ;// 判断点p在任意多边形po[Max_n]内, 顶点按顺时针或逆时针给出// 在边上返回2, 严格在内返回1, 严格在外返回0int point_is_inside(Point p){ int i, num = 0; Point q ; q.x = 9999999.0 , q.y = p. y ; //q为平行于x轴 p点射线的终点 for(i = 0 ; i< n; i++){ if(in_segment(po[i] ,po[(i+1 ) % n] , p ) ) return 2; Point p1, p2 ; p1 = po[i], p2 = po[(i+1 ) % n] ; if(p1.y == p2.y) // 特判,射线与重边的处理,交点数为0,不计算 continue ; if(p1.y > p2.y) swap(p1, p2) ; // p1为较小点, 特判,低处的交点不计算 if(intersection( p1 , p2 , p , q )) num ++ ; } return num & 1 ;}int main(){ int m , i, j , k = 1 , t = 0 ; Point a; while(scanf("%d" , & n) && n){ if(t) puts("") ; t++ ; scanf("%d" , &m) ; printf("Problem %d:\n" , k++) ; for(i = 0 ; i < n; i++) scanf("%lf%lf" , &po[i].x, &po[i].y ) ; for(i = 0 ; i< m ; i++){ scanf("%lf%lf" , &a.x , &a.y) ; if(point_is_inside(a)) puts("Within") ; else puts("Outside") ; } } return 0;}
0 0
- zoj 1081 Points Within 判断点是否在任意多边形内(模板)
- ZOJ 1081 Points Within 判断点是否在多边形内
- zoj 1081 Points Within (判断点是否在多边形内)
- zoj 1081 Points Within (判断点是否在多边形内)
- zoj 1081 Points Within[判断点在简单多边形内]
- ZOJ1081 Points Within,判断点是否在多边形 内
- ZOJ 1081 Points Within(点在多边形内判定)
- ZOJ 1081 Points Within(点在多边形内判定)
- ZOJ1081 Points Within(判断点是否在多边形内部)
- 判断点是否在任意多边形内(java)
- 判断点是否在任意多边形内(java)
- 判断一个点是否在任意闭合多边形内
- 判断点是否在多边形内
- 判断点是否在多边形内
- 判断一个点是否在多边形内
- 判断点是否在多边形内
- 判断点是否在多边形内
- 判断点是否在多边形内
- hdu 2147 kiki's game (打表找规律奇偶性规律)棋盘沿固定方向向没有经过的方格走, 直到不能走
- foj 1016 无归之室
- zoj 1010 Area 判断线段是否相交(把线段扩充一倍后 好处理) + 多边形求面积
- 黑马程序员--Java面向对象——IO流其他对象
- zoj 1041 Transmitters 判断一个可以移动的半圆最多可容纳的点的个数
- zoj 1081 Points Within 判断点是否在任意多边形内(模板)
- Objective-C 线性表
- foj 2148 Moon Game 判断n个点有几个凸四边形 + 枚举4个点 + 判断点在三角形外
- poj 1584 A Round Peg in a Ground Hole 判断多边形是否为凸多边形 + 圆心是否在凸多边形内 + 圆是否在凸多边形内部
- zoj 1199 Point of Intersection 求两个圆公切线的交点
- zoj 1439 Area Ratio 计算三角形内接圆面积和外接圆面积之比
- zoj 1608 Two Circles and a Rectangle 判断两个圆是否能放入一个矩形中
- zoj 1806 This Takes the Cake 计算凸四边形和三角形的面积
- zoj 1904 Beavergnaw 计算圆柱和圆台的体积