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


    导入

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

    方法

    1、数学方法

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

    算法:

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

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

    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来实现:

    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.         }  


    以上。

    路漫漫其修远兮 吾将上下而求索
  • 相关阅读:
    selenium重定项
    软件测试
    Flask中的session机制
    pythony--运算符
    笨办法学Python记录--习题18 变量 函数 help的由来;if语句,循环和列表,冒泡排序,判断输入字符串的方法
    笨办法学Python记录--习题15-17 开始读写文件啦
    笨办法学Python记录--习题12-14 主要是pydoc用法,raw_input,argv
    笨办法学Python记录--习题1-11
    随意从Android端抓取一些数据包看到的协议
    Git Learning Part II
  • 原文地址:https://www.cnblogs.com/hudabing/p/4027740.html
Copyright © 2020-2023  润新知