zoj 1081 Points Within 判断点是否在任意多边形内(模板)

题目来源:

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, 严格在外返回0
int 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;
}

zoj 1081 Points Within 判断点是否在任意多边形内(模板),布布扣,bubuko.com

时间: 2024-10-15 12:00:12

zoj 1081 Points Within 判断点是否在任意多边形内(模板)的相关文章

判断点是否在任意多边形内

最近项目用到:在Google map上判断事发地点,是否在管辖区域内.也就是典型的判断一个点是否在不规则任意多边形内的例子. 但是Google Map没有提供相应的api,找资料发现百度地图提供了一个工具类,肿么办,为了一个工具类,加入百度地图吗,操蛋,这是不可能的! 百度地图api链接:http://wiki.lbsyun.baidu.com/cms/androidsdk/doc/v3_7_0/com/baidu/mapapi/utils/SpatialRelationUtil.html Po

ZOJ 1081 Points Within | 判断点在多边形内

题目: 给个n个点的多边形,n个点按顺序给出,给个点m,判断m在不在多边形内部 题解: 网上有两种方法,这里写一种:射线法 大体的思想是:以这个点为端点,做一条平行与x轴的射线(代码中射线指向x轴正方向) 如果交点个数为奇数的话就在内部,如果为偶数(包括0)就在外部 #include<cstdio> #include<algorithm> #include<cstring> #define N 105 using namespace std; int n,m; stru

如何判断一个点是否在一个多边形内?

提示:对多边形进行分割,成为一个个三角形,判断点是否在三角形内. 一个非常有用的解析几何结论:如果P2(x1,y1),P2(x2,y2), P3(x3,y3)是平面上的3个点,那么三角形P1P2P3的面积等于下面绝对值的二分之一: | x1  y1  1 | | x2 y2  1 | = x1y2 + x3y1 + x2y3 –x3y2 – x2y1 – x1y3 | x3 y3  1 | 当且仅当点P3位于直线P1P2(有向直线P1->P2)的右侧时,该表达式的符号为正.这个公式可以在固定的时

判断点是否任意多边形内的2种方法

导入 判断触摸点是否在一个多边形的内部 方法 1.数学方法 这个方法的好处是任意平台都可以使用,不仅现于Android 算法: 求解通过该点的水平线与多边形各边的交点,单边交点为奇数,则成立 ok我们其实就是需要看这个点的单边射线与多边形的交点,代码实现如下: [java] view plaincopyprint? public boolean isInPolygon(Point point, Point[] points, int n) { int nCross = 0; for (int i

判断一个点是否在多边形内

#转载自:http://blog.csdn.net/u011722133/article/details/52813374 在GIS(地理信息管理系统)/PCL(点云库)中,判断一个坐标是否在多边形内部是个经常要遇到的问题.乍听起来还挺复杂.根据W. Randolph Franklin 提出的PNPoly算法,只需区区几行代码就解决了这个问题 假设多边形的坐标存放在一个数组里,首先我们需要取得该数组在横坐标和纵坐标的最大值和最小值,根据这四个点算出一个四边型,首先判断目标坐标点是否在这个四边型之

如何判断一个点是否在多边形内

原理 如何判断一个点在多边形内还是多边形外,最常见的方法就是射线法,原理就是,从点P开始,做一条任意的射线,如果射线与多边形边的交点个数为偶数个则表明点在多边形外,交点个数为奇数个时则表明点在多边形内.如果点在多边形内部时,无论如何画射线都会有交点,且为奇数个.如下图: 实现(C#) 1 public static bool InsidePolygon(List<Point> polygon, Point p) 2 { 3 if (polygon.Count <= 0) 4 return

POJ 1584 A Round Peg in a Ground Hole 判断凸多边形 点到线段距离 点在多边形内

首先判断是不是凸多边形 然后判断圆是否在凸多边形内 kuangbin的板子,但是有些地方不明白. 判断多边形不是凸多边形后,为什么用判断点是否在凸多边形内的模板交WA了,而用判断点是否在任意多边形内的模板A了 而且判断点是否在任意多边形的注释,返回值为什么又说是凸多边形~~~ POJ 1584 A Round Peg in a Ground Hole(判断凸多边形,点到线段距离,点在多边形内) #include <iostream> #include <cstdio> #inclu

ZOJ 3720 Magnet Darts (计算几何,概率,判点是否在多边形内)

http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3720 题意: 在一个矩形区域投掷飞镖,因此飞镖只会落在整点上,投到每个点的得分是Ax+By.矩形区域里面有个多边形,如果飞镖投在多边形里面则得分,求最终的得分期望. 即:给定一个矩形内的所有整数点,判断这些点是否在一个多边形内 方法: 计算几何的判点是否在多边形内(几何模板),如果在,则令得分加(Ax+By)*以此点为中心边长为1的正方形面积 1 void solve()

判断一个点是否在一个多边形里

“判断一个点是否在一个多边形里”,一开始以为是个挺难的问题,但Google了一下之后发现其实蛮简单,所用到的算法叫做“Ray-casting Algorithm”,中文应该叫“光线投射算法”,这是维基百科的描述:[维基百科] 简单地说可以这么判断:从这个点引出一根“射线”,与多边形的任意若干条边相交,累计相交的边的数目,如果是奇数,那么点就在多边形内,否则点就在多边形外. 如图,A点引一条射线,与多边形3条边相交,奇数,所以A点在多边形内,而从B点引一条射线,与多边形的2条边相交,偶数,所以B点