java 判断某点是否在给定路径上,某点是否在给定封闭区域内

/**

* <pre>

*    author : jason

*    e-mail : 1170321738@qq.com

*    time  : 2019/03/19

*    desc  : 主要进行几何计算。其中Point是业务中需要的一个类,在这个判断中只需要有x,y坐标就可以了,等同于PointF

*    version: 1.0

* </pre>

*/

public class MathUtil {

    /**

    * 判断某点是否在给定区域内

    *

    * @param pointList

    * @param x

    * @param y

    * @return true在区域内, false不在

    */

    public static boolean pointInArea(List<Point> pointList, float x, float y) {

        int i, j;

        boolean in = false;

        int nPol = pointList.size();

        for (i = 0, j = nPol - 1; i < nPol; j = i++) {

            if ((((pointList.get(i).getY() <= y) && (y < pointList.get(j).getY())) ||

                    ((pointList.get(j).getY() <= y) && (y < pointList.get(i).getY()))) &&

                    (x < (pointList.get(j).getX() - pointList.get(i).getX()) * (y - pointList.get(i).getY()) / (pointList.get(j).getY() - pointList.get(i).getY()) + pointList.get(i).getX()))

                in = !in;

        }

        return in;

    }

    /**

    * 判断某点是否在给定路径上,主要有两种实现方式,我选择了第二种。

    * [1]顺序取出两点,判断当前点是否在这两个点的矩形内。这种方式适合点比较密集的路径。

    * [2]根据两点得到每一段线段的方程,然后将点的坐标带入看是否符合。这种方式判断过于严格,很难点到,需要优化。

    *

    * @param pointList

    * @param x

    * @param y

    * @return

    */

    public static boolean pointInPath(List<Point> pointList, float x, float y) {

        boolean in = false;

        //为了提高选中率,需要做一个近似处理,可以自己调整大小

        float fx = 1;

        float fy = 1;

        for (int i = 0; i < pointList.size() - 1; i++) {

            Point point1 = pointList.get(i);

            Point point2 = pointList.get(i + 1);

            if (point1.getX() == point2.getX()) {//斜率不存在

                if (x >= point1.getX() - fx && x <= point1.getX() + fx && y >= Math.min(point1.getY(), point2.getY()) - fy && y <= Math.max(point1.getY(), point2.getY()) + fy) {

                    in = true;

                    break;

                }

            } else {

                //算出两点之间的斜率

                float k = (point2.getY() - point1.getY()) / (point2.getX() - point1.getX());

                float b = point1.getY() - k * point1.getX();

                float realY = x * k + b;

                if (x >= Math.min(point1.x, point2.x) - fx && x <= Math.max(point1.x, point2.x) + fx && y > realY - fy && y < realY + fy) {

                    in = true;

                    break;

                }

            }

        }

        return in;

    }

}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容