首页 > 其他分享 >判断点与多边形的关系(4):射线法

判断点与多边形的关系(4):射线法

时间:2023-07-21 13:33:41浏览次数:33  
标签:判断 多边形 polygon pt int 射线 交点

https://blog.csdn.net/ezhchai/article/details/78867367

终极大招来了,射线法是解决这一问题的最优方法,其他方法仅具有理论意义,如果工程应用的话,知道这个方法就够了。
射线法的思想是:以目标点为端点引一条射线,计算这条射线和多边形所有边的交点数目。如果交点个数为奇数,则点在多边形部,反之则在多边形外部。
图例说明,如下图所示:

 

 

所谓射线法,关键在于单向发射,为简化问题,以水平线为例,程序实现中也是这么处理的。O点向右发出射线,与多边形的交点是B、C、D,向左发出射线,交点是A,均为奇数个。P点在多边形外,无论想哪方向发出摄像,都有2个交点。

 

 

对于带内岛的形状,射线法同样适用,如上图所示。在实际应用中,射线法会有很多特殊情况需要讨论,全部都讨论会比较复杂,但结论是一样的。这里不做过多讨论了,不过可以给大家结论:射线法适用于所有类型的多边形进行点与多边形关系的判断,且实现相对简单,速度较快,是工程应用的不二之选。要注意的是,计算中所有数值都要选择浮点数类型,以保证计算精度。
参考代码如下:

int InPolygon_Ray(const CZPolygon& polygon, CZPoint_t pt) {
    int itNumPt = polygon.size();
    CZPoint_t pt_1, pt_2;
    int itJunctionCount = 0;
    for (int i = 0; i < (itNumPt - 1); i++) {
        pt_1 = polygon[i];
        pt_2 = polygon[i + 1];
        if (((pt.y >= pt_1.y) && (pt.y <= pt_2.y)) || ((pt.y >= pt_2.y) && (pt.y <= pt_1.y))) {
            double duT = (pt.y - pt_1.y) / (pt_2.y - pt_1.y);
            double duXT = pt_1.x + duT * (pt_2.x - pt_1.x);
            if (pt.x == duXT)
                return ONSIDE;
            if (pt.x > duXT)
                itJunctionCount++;
        }
    }
    return itJunctionCount % 2 ? INSIDE : OUTSIDE;
}

https://www.cnblogs.com/luxiaoxun/p/3722358.html
https://blog.csdn.net/MQLCSDN/article/details/90106406 ---unity 应用 

标签:判断,多边形,polygon,pt,int,射线,交点
From: https://www.cnblogs.com/porter/p/17571049.html

相关文章

  • python123判断闰年函数
    判断闰年的原理和问题在格里高利历中,闰年是指能被4整除但不能被100整除的年份,或者能被400整除的年份。判断一个年份是否为闰年是一个常见的问题,本文将介绍如何使用Python编写一个判断闰年的函数。在编写判断闰年函数之前,我们需要了解一个问题,即公元纪年法在历史上的改革。人们最......
  • 9Java中如何判断一个字符串是否包含另一个子串
    在Java中,我们经常会遇到需要判断一个字符串是否包含另一个子串的情况。对于这个问题,我们可以使用一些简单而有效的方法来解决。本文将介绍几种常见的方法,以及它们的优缺点。方法一:使用contains方法Java中的String类提供了一个contains方法,可以很方便地判断一个字符串是否包含另......
  • sql server判断类型
    SQLServer判断数据类型在SQLServer中,可以使用不同的方法来判断数据的类型。这对于开发人员来说非常重要,因为在处理数据时需要了解其类型以进行正确的操作。在本文中,我们将介绍一些常用的方法和示例来帮助您判断数据的类型。使用系统函数SQLServer提供了一些内置的系统函数,可......
  • 计算凸多边形的重叠面积(原理解析)
    版权声明:遵循CC4.0BY-SA版权协议,转载请附上原文出处链接和本声明。参考文章:https://blog.csdn.net/xuyin1204/article/details/107768030本文主要是参考了CSDN博主xuyin1204关于计算两个多边形的重叠面积的文章,并做了原理的相关分析。代码放在文末首先将两个多边形分解为......
  • java 互斥条件判断
    Java互斥条件判断作为一名经验丰富的开发者,我将教你如何在Java中实现互斥条件判断。在这篇文章中,我将向你展示实现步骤,并提供每个步骤所需的代码和注释。实现步骤以下是实现互斥条件判断的整个流程。我们将按照这个步骤逐步进行实现。步骤描述步骤1定义一个对象作为......
  • java时间戳判断
    Java时间戳判断时间戳(Timestamp)是一种表示时间的方式,它通常是一个长整型数值,表示自1970年1月1日00:00:00以来的毫秒数。在Java中,我们可以使用时间戳来处理日期和时间的计算、比较和转换。获取当前时间戳在Java中,可以使用System.currentTimeMillis()方法来获取当前时间的时间戳。......
  • 百度2015年笔试题:简述大端小端的概念并写出一个小程序来判断是大端还是小端
    首先我们来说一下大端小端的概念:大端存储和小端存储是计算机中数据存储的两种不同方式。在大端存储中,数据的高位字节被存储在内存的低地址处,而数据的低位字节被存储在内存的高地址处。这种存储方式类似于书写方式,先写高位字节,后写低位字节。例如,十六进制数0x12345678在大端存储中被......
  • JavaScript实现,判断一个点是否在多边形内
    //定义点的结构体functionpoint(){this.x=0;this.y=0;}//计算一个点是否在多边形里,参数:点,多边形数组functionPointInPoly(pt,poly){for(varc=false,i=-1,l=poly.length,j=l-1;++i<l;j=i)((poly[i].y<=pt.y&&pt.y<p......
  • 关于用JS判断PC客户端是否安装某个软件的方法
    开发过程中,我们经常会碰到这样的需求:在web网页上,检测电脑上是否安装了某个软件。由于浏览器的安全机制,js没有办法通过浏览器去访问注册表信息,除非用浏览器扩展。 如果想在web网页中判断PC客户端是否安装了某个软件,可以试用标准的浏览器特性:检查浏览器是否支持自定义协议处理程......
  • android 判断app 通知栏系统开关
    Android判断App通知栏系统开关实现方法1.概述在Android开发中,判断App通知栏系统开关是一个比较常见的需求。本文将介绍一种实现方式,通过使用NotificationManager类和NotificationChannel类来判断App通知栏系统开关是否打开。2.实现步骤下面是整个实现过程的步骤表格:步骤......