首页 > 代码库 > 判断点是否任意多边形内的2种方法

判断点是否任意多边形内的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.                   
  9.         }  


以上。

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