zoukankan      html  css  js  c++  java
  • 推断是否在多边形内的随机点2途径

    输入

    推断触摸点是一个多边形内

    办法

    1、数学

    这种方法的优点是任意的平台可用于。不仅现在Android

    算法:

    解决水平线的穿过多边形的各边的点的交点,单侧单路口,成立

    ok我们事实上就是须要看这个点的单边射线与多边形的交点。代码实现例如以下:

    public boolean isInPolygon(Point point, Point[] points, int n) {
    		int nCross = 0;
    		for (int i = 0; i < n; i++) {
    			Point p1 = points[i];
    			Point p2 = points[(i + 1) % n];
    			// 求解 y=p.y 与 p1 p2 的交点
    			// p1p2 与 y=p0.y平行
    			if (p1.y == p2.y)
    				continue;
    			// 交点在p1p2延长线上
    			if (point.y < Math.min(p1.y, p2.y))
    				continue;
    			// 交点在p1p2延长线上
    			if (point.y >= Math.max(p1.y, p2.y))
    				continue;
    			// 求交点的 X 坐标
    			double x = (double) (point.y - p1.y) * (double) (p2.x - p1.x)
    					/ (double) (p2.y - p1.y) + p1.x;
    			// 仅仅统计单边交点
    			if (x > point.x)
    				nCross++;
    		}
    		return (nCross % 2 == 1);
    	}

    经典算法,通用实现

    2、Android

    借用Android开发中的碰撞检測的思想。我们使用Region来推断,Region的具体资料稍后会有总结:

    充分借助Android的api来实现:

    RectF rectF = new RectF();
            path.computeBounds(rectF, true);
            Region region = new Region();
            region.setPath(path, new Region((int) rectF.left,
                            (int) rectF.top, (int) rectF.right,
                            (int) rectF.bottom));
            if (region.contains(point.x, point.y)) {
                    
            }

    以上。





    版权声明:本文博主原创文章,博客,未经同意不得转载。

  • 相关阅读:
    【bzoj1029】[JSOI2007]建筑抢修
    【bzoj2748】[HAOI2012]音量调节
    【bzoj1041】[HAOI2008]圆上的整点
    【bzoj2743】[HEOI2012]采花
    【bzoj1034】[ZJOI2008]泡泡堂BNB
    【bzoj1260】[CQOI2007]涂色paint
    【bzoj2728】[HNOI2012]与非
    【bzoj2003】[Hnoi2010]Matrix 矩阵
    【bzoj1028】[JSOI2007]麻将
    利用adb截屏
  • 原文地址:https://www.cnblogs.com/hrhguanli/p/4804606.html
Copyright © 2011-2022 走看看