首页 > 其他分享 >射线法判断点是否在多边形内

射线法判断点是否在多边形内

时间:2023-06-11 18:01:24浏览次数:34  
标签:p2 判断 多边形 point Point 射线 p1 new points

射线法

isPointInPolygon方法用于判断点是否在多边形内部,points表示多边形各个点的坐标,point表示要判断的点的坐标
public class PointInPolygon {
    /**
     * 判断点是否在多边形内部
     *
     * @param points 多边形各个点的坐标
     * @param point  要判断的点的坐标
     * @return true表示在内部,false表示在外部
     */
    public static boolean isPointInPolygon(Point[] points, Point point) {
        // 判断点是否在多边形顶点上
        for (Point p : points) {
            if (p.x == point.x && p.y == point.y) {
                return true;
            }
        }
        // 射线法判断
        int count = 0;
        for (int i = 0; i < points.length; i++) {
            Point p1 = points[i];
            Point p2 = points[(i + 1) % points.length];
            // 如果点在两个顶点的连线上,则直接返回true
            if ((point.x == p1.x && point.y == p1.y) || (point.x == p2.x && point.y == p2.y)) {
                return true;
            }
            // 判断射线与边的交点
            if (p1.y == p2.y) { // 如果边是水平的,则不需要考虑
                continue;
            }
            if (point.y < Math.min(p1.y, p2.y) || point.y >= Math.max(p1.y, p2.y)) { // 如果点的纵坐标不在边的范围内,则不需要考虑
                continue;
            }
            double x = (double) (point.y - p1.y) * (double) (p2.x - p1.x) / (double) (p2.y - p1.y) + p1.x;
            if (x > point.x) { // 如果交点在射线右侧,则统计
                count++;
            }
        }
        return count % 2 == 1; // 判断统计的交点数,奇数则在内部,偶数则在外部
    }

    public static void main(String[] args) {
        Point[] points = new Point[]{new Point(0, 0), new Point(2, 0), new Point(2, 2), new Point(1, 3), new Point(0, 2)};
        Point point = new Point(1, 1);
        boolean result = isPointInPolygon(points, point);
        System.out.println(result); // true
    }
}

class Point {
    int x;
    int y;

    public Point(int x, int y) {
        this.x = x;
        this.y = y;
    }
}

标签:p2,判断,多边形,point,Point,射线,p1,new,points
From: https://blog.51cto.com/u_16085354/6458440

相关文章

  • 架构师如何判断和利用技术趋势
    看技术趋势,甚至看任何发展趋势,都要先找前置量(Leadingindicator)。对于软件发展而言,硬件的革新往往是前置量。首先,硬件技术进化的驱动力是需求规模。计算机硬件技术从巨型机、大型机、小型机,到PC、Mobile的进化过程,就是市场需求规模的增长过程。随着市场需求规模越来越大,就会有越......
  • Java开发技巧-数据结构-使用HashSet判断主键是否存在、使用Pair成对结果返回/Triple三
    场景Java中使用HashSet判断主键是否存在HashSet实现Set接口,由哈希表(实际上是HashMap)实现,但不保证set的迭代顺序,并允许使用null元素。HashSet的时间复杂度跟HashMap一致,如果没有哈希冲突则时间复杂度为O(1),如果存在哈希冲突则时间复杂度不超过O(n)。所以,在日常编码中,可以使用HashSe......
  • Python快速判断若干整数是否互不相同
    让我们先来看一个简单的问题:给定两个整数x和y,如果这两个数不相等就输出Yes,否则输出No。遇到这样的问题,一般都会毫不犹豫地给出类似于下面的代码:如果问题性质不变,简单地增加一下问题规模:给定三个整数x、y和z,如果这三个数互不相等就输出Yes,否则输出No。估计很多人会在上面代码的基础......
  • Python多进程使用队列共享数据协同判断素数
    感谢江西师范大学李雪斌老师提供素材和第一版本代码。问题描述:创建两个队列,qIn用来存储指定范围内的整数,qOut用来存放该范围内的所有素数。创建多个进程,每个进程依次从qIn队列中获取整数,并判断是否为素数,如果是素数则存入qOut。技术要点:1)使用Python标准库multiprocessing创建和管理......
  • 条件判断
    ifelseifelifmatch...casepython3.10增加了match...case的条件判断,不需要再使用一串if-else来判断了match后的对象会一次匹配case后面的内容,如果匹配成功,则执行匹配到的表达式,否则直接跳过,_可以匹配一切语法格式:matchsubject:case<pattern_1>:......
  • 最优的素数判断代码(Python)是这样写出来的
    素数判断是个很经典的问题,各种语言的程序设计课程都会涉及到,按照素数定义(除了1和自身,素数没有其他因数)很容易写出下面的代码:defisPrime1(n):foriinrange(2,n):ifn%i==0:returnFalsereturnTrue功能完全没有问题,就是非常非常非常非常慢。......
  • 判断一个字符串是否由另一个字符串旋转而成
    ifs1="stackoverflow"thenthefollowingaresomeofitsrotatedversions:"tackoverflows""ackoverflowst""overflowstack"whereas"stackoverflwo"isnotarotatedversion. 通常的做法algorithmcheckRot......
  • 不用循环和条件判断打印1-1000
    //z不用循环和条件判断打印1-1000//z2011-05-2419:16:07@is2120#include<iostream>template<intN>structNumberGeneration{staticvoidout(std::ostream&os){NumberGeneration<N-1>::out(os);os<<N<&......
  • LeetCode 2116. 判断一个括号字符串是否有效
    importjava.util.ArrayDeque;importjava.util.Deque;importjava.util.HashMap;importjava.util.Iterator;importjava.util.Map;importjava.util.Set;/***一个括号字符串是只由'('和')'组成的非空字符串。如果一个字符串满足下面任意一个条件,那么它就是有......
  • 使用axios的post方法传输对象数据和后台数据进行解析判断
    使用vue的v-model绑定生成对象数据的通过axios传输数据操作的时候,对象中属性的命名必须和实体中的一致。实体:privateIntegerid;privateStringname;privateStringnickname;privateStringpassword;privateIntegerage;privateStringgend......