zoukankan      html  css  js  c++  java
  • 判断点是否任意多边形内的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.         }  


    以上。

    路漫漫其修远兮 吾将上下而求索
  • 相关阅读:
    SpringBoot条件注解@Conditional
    IDEA远程Debug
    聊一聊Java如何接入招行一网通支付功能
    IDEA中使用lombok插件
    使用Java类加载SpringBoot、SpringCloud配置文件
    Java项目启动时执行指定方法的几种方式
    Java定时任务解决方案
    04 Python并发编程(守护进程,进程锁,进程队列)
    03 初识并发编程
    02 网络编程协议(TCP和UDP协议,黏包问题)以及socketserver模块
  • 原文地址:https://www.cnblogs.com/hudabing/p/4027740.html
Copyright © 2011-2022 走看看