射线法检查一个点在不在多边形内-python 实现

射线法学习记录 射线法的优化1.射线法简述具体处理python代码 1.射线法简述 因为工作需要,所以需要判断某个坐标的点是不是在某个区域范围(单个闭合多边形)内。经过在网上搜索资料,发现射线法能解决我的问题,并且十分巧妙,记录一下。 原理: 1.如果一个点在一个多边形内部,那么以它为起始点,发射一条射线(任意方向),那么它至少会和一条边相交,也就是有一个交点。如图所示 2.如果点在多边形内部出发射线不止和一条... 阅读详情

参考文档:https://www.cnblogs.com/gxcdream/p/7597865.htmlhttps://www.cnblogs.com/muyefeiwu/p/11260366.htmlhttps://blog.youkuaiyun.com/liangzhaoyang1/article/details/51088475

代码:

点击查看代码
# encoding=utf8
import numpy as np
from collections import namedtuple


Point = namedtuple("Point", ["x", "y"])


def isin_poly(p, poly, point_num):
    isin = False
    for i in range(point_num):
        p1 = poly[i]
        p2 = poly[(i + 1) % point_num]
        min_x, max_x = (p1.x, p2.x) if p1.x <= p2.x else (p2.x, p1.x)
        min_y, max_y = (p1.y, p2.y) if p1.y <= p2.y else (p2.y, p1.y)

        # 点积计算
        dot_a = (p.x - p1.x) * (p2.y - p1.y)
        dot_b = (p.y - p1.y) * (p2.x - p1.x)

        # 检查点是否在线段上
        if (
            # (p.x - p1.x) * (p2.y - p1.y) == (p2.x - p1.x) * (p.y - p1.y)  # 点积计算
            dot_a == dot_b  # 点积计算
            and min_x <= p.x <= max_x
            and min_y <= p.y <= max_y
        ):
            return True

        # # 线段与Y轴平行且检测点在线段上
        # if p1.y == p2.y and p.y == p1.y and min_x < p.x < max_x:
        #     return True
        #
        # # 线段与X轴平行且检查点在线段上
        # if p1.x == p2.x and p.x == p1.x and min_y < p.y < max_y:
        #     return True

        if p.y < min_y or p.y >= max_y:
            continue

        # x = (p.y - p1.y) * (p2.x - p1.x) / (p2.y - p1.y) + p1.x
        x = dot_b / (p2.y - p1.y) + p1.x
        if x > p.x:
            isin = not isin

    return isin


def test_isin(p, poly):
    return isin_poly(p, [Point(x, y) for x, y in poly[0]], len(poly[0]))


if __name__ == "__main__":
    # polys = [[
    #     [1,2],[2,3],[4,3],[5,0],[6,2],[7,0],[7,2],[9,3],[7,4],[9,5],[7,7],[6,5], [4,5],[3,7],[1,5]
    # ]]

    # polys = [[
    #     [0,2],[1,0],[3,2],[2,4],[4,4],[4,0],[6,0],[5,2],[6,4],[8,3],[6,2],[7,0],[9,1],[8,4],[9,5],[7,5],[7,6],[9,7],[8,9],[7,7],[6,9],[5,9],[5,7],[3,7],[4,9],[2,9],[3,6],[5,6],[6,5],[2,5],[2,7],[1,9],[0,8],[1,7],[0,6],[1,4],[0,3],[2,2]
    # ]]

    # polys = [[
    #     [9,9],[5,5],[2,9],[7,8],[7,10],[0,10],[0,6],[3,6],[1,4],[3,2],[5,2],[7,0],[9,0],[8,4],[7,1],[6,4],[9,5]
    # ]]

    polys = [[
            [5, 5],[5, 3],[10, 4],[6, 0],[8, 3],[4, 1],[2, 3],[0, 2],[2, 4],[0, 6],[3, 9],[4, 5],[4, 9],[5, 6],[5, 9],[8, 6],[10, 8],[10, 5],
    ]]

    n = 12
    matrix = np.empty((n, n), dtype=np.bool_)
    for x in range(n):
        for y in range(n):
            p = Point(x,y)
            matrix[x, y] = test_isin(p, polys)

    print(matrix)

测试结果:
多边形坐标:
polys = [[
[1,2],[2,3],[4,3],[5,0],[6,2],[7,0],[7,2],[9,3],[7,4],[9,5],[7,7],[6,5], [4,5],[3,7],[1,5]
]]

image

多边形坐标:
polys = [[
[0,2],[1,0],[3,2],[2,4],[4,4],[4,0],[6,0],[5,2],[6,4],[8,3],[6,2],[7,0],[9,1],[8,4],[9,5],[7,5],[7,6],[9,7],[8,9],[7,7],[6,9],[5,9],[5,7],[3,7],[4,9],[2,9],[3,6],[5,6],[6,5],[2,5],[2,7],[1,9],[0,8],[1,7],[0,6],[1,4],[0,3],[2,2]
]]

image

多边形坐标
polys = [[ [5,5],[5,3],[10,4],[6,0],[8,3],[4,1],[2,3],[0,2],[2,4],[0,6],[3,9],[4,5],[4,9],[5,6],[5,9],[8,6],[10,8],[10,5] ]]

image

python表面多边形_[算法]Python判断一个点是否在多边形内部 题目: 代码:# -*- coding:utf-8 -*-def rayCasting(p, poly):px = p['x']py = p['y']flag = Falsei = 0l = len(poly)j = l - 1#for(i = 0, l = poly.length, j = l - 1; i < l; j = i, i++):while i < l:sx = poly... 阅读详情

相关推荐

【Python】计算几何:向量叉积和凸包 | 引射线法 | 判断点是否在多边形内部 | 葛立恒扫描法 | Cross Product and Convex Hul

本篇博客是关于经典的Cross Product and Convex Hull (向量叉积和凸包)的,我们将介绍引射线法,葛立恒扫描法。在讲解之前我会对前置知识做一个简单的介绍,比如向量叉积,如何确定直线是在顺时针上还是逆时针上等。算法讲解部分是为后面练习题做准备的,比如如何判断内点是否在多边形内,,如何计算多边形面积等,还将简单介绍一下葛立恒扫描法,在提供的练习题中就能碰到。

有道无术, 术尚可求。有术无道, 止于术。 2460

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

本文实例为大家分享了python3射线法判断点是否在多边形内的具体代码,供大家参考,具体内容如下#!/usr/bin/python3.4# -*- coding:utf-8 -*-def isPointinPolygon(point, rangelist): #[[0,0],[1,1],[0,1],[0,0]] [1,0.8]# 判断是否在外包矩形内,如果不在,直接返回falselnglist =...

weixin_39861627的博客 497

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

# -*- coding: UTF-8 -*- def isInsidePolygon(pt, poly): c = False i = -1 l = len(poly) j = l - 1 while i &lt; l - 1: i += 1 print(i, poly[i], j, poly[j]) if...

jacke121的专栏 5553

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

python3射线法判断点是否在多边形内 射线法 首先我们要先理解什么是射线法。射线法的意思是:在随机点上做一条平行于x轴的射线,方向是x轴正方向,看这条射线与多边形区域的交点个数,如果是偶数,那么这个随机点不在该区域内,如果是奇数,则这个点在该区域内。 核心算法 该方法的核心算法是:求得射线与边界的交点横坐标,如果横坐标大于随机点的横坐标,则将计数器+1,表示有一个交点。 如何求这个横坐标呢? 其实就是使用了三角形的一条定理,如下图所示: (A,E)之间的距离L1,(A,B)之间的距离L2,(B,C)之

qq_20997219的博客 1226

高速串行信号仿真避坑指南:为什么你的SIwave Xnet设置了却不出结果?

本文深入解析SIwave中Xnet功能在高速串行信号仿真中的常见问题,包括模型缺失、网络不完整和端口设置错误等关键误区。通过详细的电路元件模型验证、网络完整性检查及端口配置指南,帮助工程师有效解决仿真不出结果的问题,提升信号完整性分析效率。

weixin_29218963的博客 252

Windows 11下JDK 21与JMeter 5.6.3环境配置全攻略

环境变量是操作系统管理软件路径与执行权限的核心机制,它通过预设的键值对,指引系统在调用命令时定位可执行文件。理解其工作原理,是解决软件安装后“命令未找到”等问题的关键。对于Java生态而言,正确配置JAVA_HOME和Path变量,不仅能让java、javac等基础命令全局可用,更是Maven、Gradle乃至JMeter等众多工具链顺畅运行的基石。JMeter作为一款基于Java开发的经典性能测试与接口测试工具,其稳定运行高度依赖健全的Java环境。本文聚焦于在Windows 11系统上,为JDK 21与

weixin_30940783的博客 450

python 判断点在随机多边形内_python射线法判断一个点在图形区域内外

# -*-encoding:utf-8 -*-# file:class.py#"""信息楼0 123.425658,41.7741771 123.425843,41.7741662 123.425847,41.7741193 123.42693,41.7740624 123.426943,41.7740995 123.427118,41.7740896 123.427066,41.7735487 ...

weixin_35098081的博客 392

AGV路径规划实战:如何用Python+ROS实现激光SLAM导航(附避障代码)

本文提供了一份基于Python和ROS实现AGV激光SLAM导航的实战指南。内容涵盖从Docker环境搭建、激光雷达数据处理、Gmapping建图,到Move_Base全局/局部路径规划与TEB局部规划器配置的全流程。重点解析了如何通过参数调优实现稳定导航,并附带了紧急避障代码,帮助开发者快速构建具备自主路径规划与实时避障能力的AGV系统。

pepsi的博客 1235

【计算几何】检查某点是否位于凸多边形内

有许多问题需要检查点是否完全位于凸多边形内。在开始解决这个问题之前,让我们首先检查一个点是位于线段的左侧还是右侧。多边形由两个以上的线段组成,线段按顺时针或逆时针顺序排序。如果一个点位于多边形所有边的左侧(或右侧),其边是逆时针(或顺时针)方向,那么我们可以说该点完全在多边形内。

gongdiwudu的专栏 4891

开关电源|控制方式PWM、PFM、混合调制

频率调制器根据误差放大器的输出大小来改变方波信号的频率,若负载电流突然增加,输出电压 Vout随之下降,反馈电压 VFB 减小,此时误 差放大器的输出增高,频率调制器输出方波信号的频率增大,增加电感充电次数;若负载电流突然增加,输出电压Vom随之下降,反馈电压Vr减小,此时误差放大器的输出增高,PWM比较器输出方波信号的占空比增大,增加电感充电时间:若负载电流突然下降,PWM比较器输出方波信号的占空比减小,减少电感充电时间,从而稳定输出电压。它是在固定开关频率下,通过改变脉冲宽度来调节占空比的。

weixin_46969363的博客 1万+

博途 V16(TIA portal V16)安装教程

本文提供了西门子TIA Portal V16软件的完整安装指南。内容包括百度网盘下载链接(提取码kv69)、详细安装步骤(关闭安全保护、典型安装设置)、授权破解方法,以及PLCSIM仿真功能的使用说明。重点演示了S7-1200 PLC程序的仿真过程,解析了仿真界面各元素功能,包括状态指示灯(RUN/STOP/ERROR)、操作按钮(RUN/STOP/MRES)和网络接口状态等。通过图文并茂的方式,完整呈现了从软件安装到PLC程序仿真的全流程操作。

lingchen1906的博客 6720

python 判断点在随机多边形内_python3射线法判断点是否在多边形内

本文实例为大家分享了python3射线法判断点是否在多边形内的具体代码,供大家参考,具体内容如下#!/usr/bin/python3.4# -*- coding:utf-8 -*-def isPointinPolygon(point, rangelist): #[[0,0],[1,1],[0,1],[0,0]] [1,0.8]# 判断是否在外包矩形内,如果不在,直接返回falselnglist =...

weixin_32028965的博客 393

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

本文介绍了使用射线法判断点是否在多边形内的原理和实现方法。射线法通过从待测点引出一条水平向右的射线,计算其与多边形边的交点数量:奇数次交点在内部,偶数次在外部。算法处理了点在顶点/边上、射线经过顶点和水平边等特殊情况。实现步骤包括:初始化多边形顶点和测试点,遍历每条边计算交点,通过inside标志取反记录奇偶性。Python代码示例展示了如何对多个测试点进行判断,输出结果清晰显示每个点是否位于多边形内部。该方法适用于各种凸多边形和凹多边形的包含性检测。

lntu_ling 116

基于ESP32的智能健康监测系统开发

本文介绍了如何基于ESP32开发智能健康监测系统,从硬件选型、系统架构到软件实现的每一个环节。通过ESP32的Wi-Fi功能、传感器模块和云平台的结合,我们实现了实时健康数据监测、远程查看、报警等功能。系统的低功耗特性使得其适用于长期健康监测,能够为用户提供更便捷的健康管理方案。随着技术的不断发展,未来智能健康监测系统将进一步发展。例如,增加更多的传感器,提升数据分析能力,甚至通过人工智能算法来预测用户的健康趋势,为用户提供个性化的健康建议。

2201_76125393的博客 1104

vue2学习笔记2-老规矩,从Hello World开始,了解Vue实例和模板

想要把“Hello,World”放置在页面上,首先需要准备一个HTML的块级元素div,来承接内容。

l_q_l的专栏 1258

python通过射线法判定POI是否在多边形区块内

通过射线法判定POI是否在多边形区块内。

z語默的博客 691

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

python判断点在矩形内_python射线法判断检测点是否位于区域外接矩形内

本文实例为大家分享了python射线法判断点是否位于区域内的具体代码,供大家参考,具体内容如下#!/usr/bin/env python# -*- coding: utf-8 -*-# @Date : 2018-10-07 15:49:37# @Author : Sheldon (thisisscret@qq.com)# @Blog : 谢耳朵的派森笔记# @Link : https://www....

weixin_39597323的博客 385

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

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

def judgeIfInPolygon(polySides, polyX, polyY, point): in_bool = False j = polySides-1 for i in range(polySides): if ((((polyY[i]<point[1])and(polyY[j]>=point[1]))or((polyY[j]<point[1])and(polyY[i]>=point[1]))) \

ephram每天都想下班 597

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

Python判断一个点是否在多边形内部

# -*- coding:utf-8 -*- def rayCasting(p, poly): px = p[‘x‘] py = p[‘y‘] flag = False i = 0 l = len(poly) j = l - 1 #for(i = 0, l = poly.length, j = l - 1; i < l; j = i, i++): while i < l: sx = poly[i][‘x‘] .

n_fly的博客 988

计算机图形学:判断点是否在多边形内部

回转数是指从点P出发,沿着多边形的边界走一圈,回到起点时,点P绕了多少圈。如果回转数为0,则点P在多边形外部;如果回转数不为0,则点P在多边形内部。射线法的基本思想是从待判断的点出发,向任意方向发射一条射线,然后计算这条射线与多边形边界的交点数目。:通过叉乘的符号,我们可以计算出每条边对点P的回转贡献。:遍历多边形的所有边,累加每条边的回转贡献。如果点P在多边形外部,累加的结果将为0。在计算机图形学中,判断点是否在多边形内部是一个常见的问题。:对于多边形的每条边,计算从点P到边的两个端点的向量的叉乘。

jianmo的博客 867

python判断一个点是否在不边形区域内,用PNpoly 算法实现

我曾用在射线法实现过,但是用几个点测试后发现,运算所用时间是PNpoly几百上千倍,不多说,上PNpoly算法实现的代码: def __is_point_in_polygon(self,pointTp, verts): """ - PNPoly算法:判断点是否在不规则区域内(在边界线上也算) """ #is_contains_edge=True x,y=pointTp[0],pointTp[1] ...

songzi2009的博客 1361

Python实现地理围栏检测器

地理围栏技术通过虚拟边界实现区域管控,广泛应用于共享单车、物流配送、疫情防控等领域。其核心是判断点是否在多边形内,常用算法包括: 射线法、 环绕数法。本文介绍了两种算法和1中工具,附有示例代码实现,并能可视化展示。

记录应用与学习笔记,Python、算法、工具、踩坑... 1062

python判断某点是否在某个多边形(区域)内

判断某点是否在某区域内

qq_45612211的博客 4878

python 判断点在随机多边形内_pnpoly算法——判断点是否在多边形内

pnpoly算法原理:从一个目标点引出一条射线,统计这条射线与对变形的交点个数。如果有奇数个交点,则说明目标点在多边形内,若为偶数个交点,则在外。C语言实现:(参考判断点是否在多边形内部的pnpoly算法_geerniya的博客-优快云博客_pnpoly算法​blog.youkuaiyun.com)/** * n:多边形的定点数目 * pos_x:点的x坐标 * pos_y:点的y坐标 * vert:二维数...

weixin_33357508的博客 942
上一篇: 多边形填充-活动边表法
下一篇: DataFrame RHS语法查询语句
Along20210921
博客等级 码龄5年 82粉丝 134原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值