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)) {
                    
            }

    以上。





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

  • 相关阅读:
    hdu5714 拍照[2016百度之星复赛C题]
    hdu5715 XOR 游戏 [2016百度之星复赛D题]
    AFO
    BZOJ 3566 概率充电器
    BZOJ 3427 Bytecomputer
    BZOJ 4513 储能表
    BZOJ 3667 Miller_Rabin
    BZOJ 4557 侦察守卫
    BZOJ 3894 文理分科
    SUOI #69 奔跑的Aqua
  • 原文地址:https://www.cnblogs.com/hrhguanli/p/4804606.html
Copyright © 2011-2022 走看看