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

导入

判断触摸点是否在一个多边形的内部

方法

1、数学方法

这个方法的好处是任意平台都可以使用,不仅现于Android

算法:

求解通过该点的水平线与多边形各边的交点,单边交点为奇数,则成立

ok我们其实就是需要看这个点的单边射线与多边形的交点,代码实现如下:

[java] view plaincopyprint?

  1. public boolean isInPolygon(Point point, Point[] points, int n) {
  2. int nCross = 0;
  3. for (int i = 0; i < n; i++) {
  4. Point p1 = points[i];
  5. Point p2 = points[(i + 1) % n];
  6. // 求解 y=p.y 与 p1 p2 的交点
  7. // p1p2 与 y=p0.y平行
  8. if (p1.y == p2.y)
  9. continue;
  10. // 交点在p1p2延长线上
  11. if (point.y < Math.min(p1.y, p2.y))
  12. continue;
  13. // 交点在p1p2延长线上
  14. if (point.y >= Math.max(p1.y, p2.y))
  15. continue;
  16. // 求交点的 X 坐标
  17. double x = (double) (point.y - p1.y) * (double) (p2.x - p1.x)
  18. / (double) (p2.y - p1.y) + p1.x;
  19. // 只统计单边交点
  20. if (x > point.x)
  21. nCross++;
  22. }
  23. return (nCross % 2 == 1);
  24. }

经典算法,通用实现

2、Android

借用Android开发中的碰撞检测的思想,我们使用Region来判断,Region的详细资料稍后会有总结:

充分借助Android的api来实现:

[java] view plaincopyprint?

  1. RectF rectF = new RectF();
  2. path.computeBounds(rectF, true);
  3. Region region = new Region();
  4. region.setPath(path, new Region((int) rectF.left,
  5. (int) rectF.top, (int) rectF.right,
  6. (int) rectF.bottom));
  7. if (region.contains(point.x, point.y)) {
  8. }

以上。

时间: 2024-08-25 12:06:13

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

判断点是否在多边形内

有一个n边形,顶点为p1,p2,...,pn;给定一个已知点p,判断p在此多边形内还是外. 预备知识: 两线段相交的定义,如果一条线段的两端分别处在另一条线段的两端,则此两线段相交 判断2点在线段的两侧可以用向量的叉乘实现! 基本步骤: 1,过p点垂直向上作一条射线 2,判断此射线与n边形n条边的交点 3,把所有交点相加,如果是奇数则说明在多边形内,否则在多边形外 思路非常的简单,另外说明一下几种特殊的情况: 1,射线与多边形的顶点相交:比如射线过多边形的Pi点,则如果Pi-1和Pi+1在此射线

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

题目来源: http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=81 分析: 从p点出发做平行于x轴的射线 l. 求射线与 多边形 线段的交点数num, 若是偶数 , 该点 在外, 若为奇数, 该点在内. 注意: 两个特判, 1:   一个是 射线 l 与 多边形的边  重合 , 若该p点在 线段上, 返回1, 否则 交点 记为 0 个 2: 一个是 射线与 线段的交点 ,为线段的端点, 则我们 对线段的 较低交点 不计算. 代码

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

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

C# 判断点是否在多边形内

/// <summary>/// 判断点是否在多边形内/// </summary>/// <param name="pnt">点</param>/// <param name="pntlist">区域的点集</param>/// <returns></returns>public static bool PointInFeaces(PointF pnt, List<

百度地图 判断marker是否在多边形内

昨天画了圆形,判marker是否存在圆形内.今天来画多边形,判断marker在多边形内. 百度地图API覆盖物多边形类 http://developer.baidu.com/map/reference/index.php?title=Class:%E8%A6%86%E7%9B%96%E7%89%A9%E7%B1%BB/Polygon http://developer.baidu.com/map/reference/index.php?title=Class:%E8%A6%86%E7%9B%96%

poj1584——判断凸包,判断点是否在多边形内

poj1584——判断凸包,判断点是否在多边形内 A Round Peg in a Ground Hole Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 5441   Accepted: 1729 Description The DIY Furniture company specializes in assemble-it-yourself furniture kits. Typically, the pieces o

JavaScript实现判断图片是否加载完成的3种方法整理

JavaScript实现判断图片是否加载完成的3种方法整理 有时候我们在前端开发工作中为了获取图片的信息,需要在图片加载完成后才可以正确的获取到图片的大小尺寸,并且执行相应的回调函数使图片产生某种显示效果.本文主要整理了几种常见的javascipt判断图片加载完成时的方法,并通过代码与实际应用相结合进行解释与说明. onload方法 通过向img标签添加onload属性,并填入相应的函数来执行后续的javascipt代码.如下代码例子中img元素默认是不显示的,通过onload判断加载完成后再将

sharepoint 判断用户是否存在某个组中三种方法

1.思路:查找用户所有的组来匹配是否在特定的组(推荐) 不用担心组不存在而报错. public static bool IsUserMemberOfGroup(SPUser user, string groupName) { bool result = false; if (!String.IsNullOrEmpty(groupName) && user != null) { foreach (SPGroup group in user.Groups) { if (group.Name =

【代码笔记】判断中英文混合的字符长度的两种方法

一,代码. - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view. //第一种方法 NSLog(@"--first-%i",[self convertToInt:@"123我爱你"]); //第二种方法 NSLog(@"--second--%ld",[self getToInt:@"123我爱你"