算法小白的第一次尝试---判断点是否在不规则区域范围内(手撕)

判断一个坐标点是否在不规则多边形内部 引射线法:从目标点出发引一条射线,看这条射线和多边形所有边的交点数目。如果有奇数个交点,则说明在内部,如果有偶数个交点,则说明在外部。 引射线法是项目中的常用算法,其他判断一个坐标点是否在不规则多边形内部还有: 面积和判别法:判断目标点与多边形的每条边组成的三角形面积和是否等于该多边形,相等则在多边形内部。 夹角和判别法:判断目标点与所有边的夹角和是否为360度,为360度则在多边形内部。 主要说引射线法,因为项目中有应用到,其它两个方法也好理解。 引射线法的具体做法:将测试点的Y坐标与多边形的每一个点进行 阅读详情
针对如何判断点是否在某一个不规则封闭区域内,主要采用的是向量积法,算法原理参考:

> https://blog.csdn.net/ezhchai/article/details/78864336?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task

向量积计算参考:

> https://blog.csdn.net/qq_15906905/article/details/97074749?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task

向量积法的核心是通过判断相邻边与待定点间的向量叉积(非点积)符号是否相同来判断,但该算法必须要求不规则多边形为凸多变形。但不规则多边形可以剖分成很多个三角形区域。因此,下面的function主要考虑的是三角形,该function针对叉积为0,待定点在边延长线上或在边上,均进行了处理:

  /**
    * 根据向量积法判断一个点是否在不规则区域范围内,向量积采用的方式为叉乘,非点乘
    * @param lon 经度,相当于x轴
    * @param lat 纬度,相当于y轴
    */
  def isInArea(lon: Double, lat: Double): Boolean = {
    //是否在区域范围内的标识
    var isIn = true
    //不规则区域顺时针各顶点坐标
    val area = Array((113.517068, 22.938879), (114.86467, 23.291998), (114.149475, 21.972672))
    //顺时针方向各顶点连接成的向量
    val areaArea = new ArrayBuffer[(Double, Double)]()
    for (i <- 0 until (area.length - 1)) {
      areaArea.append((area(i + 1)._1 - area(i)._1, area(i + 1)._2 - area(i)._2))
    }
    areaArea.append((area.head._1 - area.last._1, area.head._2 - area.last._2))
    //待测点o与各顶点形成的向量
    val vector = new ArrayBuffer[(Double, Double)]()
    for (vertex <- area) {
      vector.append((lon - vertex._1, lat - vertex._2))
    }
    //依次计算待测点o与各顶点向量的向量积
    var vcp_pre = 0.0
    var flag = true
    for (i <- 0 until (area.length - 1) if flag) { //此处i只能取0,1
      vcp_pre = vector(i)._1 * areaArea(i)._2 - vector(i)._2 * areaArea(i)._1
      val vcp = vector(i + 1)._1 * areaArea(i + 1)._2 - vector(i + 1)._2 * areaArea(i + 1)._1
      val cp = vcp_pre * vcp
      if (cp == 0.0) {
        flag = false
        //此时应该判断该点是否在当前边的延长线上,若在延长线上则为false
        if (vcp_pre == 0.0) {
          if ((lon - area(i)._1) * (lon - area(i + 1)._1) > 0) isIn = false //判断是否在第一条边的延长线上
        } else {
          if (i < area.length - 2) {
            if ((lon - area(i + 1)._1) * (lon - area(i + 2)._1) > 0) isIn = false //判断是否在下一条边的延长线上
          } else {
            if ((lon - area.head._1) * (lon - area.last._1) > 0) isIn = false //判断是否在下一条边的延长线上
          }
        }
      } else if (cp < 0) { //前后相乘的结果必须为正,否则没有必要继续查找
        flag = false
        isIn = false
      }
    }
    isIn
  }

unity spine 实现不规则区域的点击 在unity的ui中,美术提供的spine动画可能是不规则形状的,会有很多透明区域。当这种spine作为可点击区域的时候就很容易点到我们不希望响应的地方,特别是当元素比较密集的时候。比如一个世界地图,如果每个版块是用spine来做的,那边界就非常容易误触。 阅读详情

相关推荐

自学QT之不规则窗口和不规则按钮(亲测)

看到很多软件,尤其是游戏软件,有一些炫酷的界面,一直在想,他们究竟是怎么做到的呢?那明明是一张图片啊。 天下有我大QT做不到的事情吗?当然没有! 现在开始:请准备一张带有透明区域的png图片哦。 首先来看自定义不规则窗口的代码吧: Widget::Widget(QWidget *parent) : QWidget(parent) { this->setWindowFla

CN小黑 1万+

判断一个点是否在多边形内部 - 射线法思路

原文链接判断一个点是否在多边形内部 [1] 射线法思路、 判断一个点是否在多边形内部 [2] 射线法实现比如说,我就随便涂了一个多边形和一个点,现在我要给出一种通用的方法来判断这个点是不是在多边形内部(别告诉我用肉眼观察……)。首先想到的一个解法是从这个点做一条射线,计算它跟多边形边界的交点个数,如果交点个数为奇数,那么点在多边形内部,否则点在多边形外。这个结论很简单,那它是怎么来的?下面就简单讲

sherlockreal的博客 2万+

PhyGeoNet一种可用于不规则区域的物理信息极限学习机

主要就是解决了CNN求解域为非规则形状这样问题,同时将物理信息嵌入CNN中,实现了物理数据双驱动。

山里娃的博客 1894

判断某个点是否在不规则图形内

输入:一些点的坐标;一个测试点 输出:是否在多边形内部 思路: (1)面积和判别法:判断目标点与多边形的每条边组成的三角形面积和是否等于该多边形,相等则在多边形内部。 (2)夹角和判别法:判断目标点与所有边的夹角和是否为360度,为360度则在多边形内部。 (3)引射线法:从目标点出发引一条射线,看这条射线和多边形所有边的交点数目。如果有奇数个交点,则说明在内部,如果有偶数个交点,则说明...

weixin_30236595的博客 1976

华为OD面试真题解析:Java核心原理、HBase实战与算法手撕

技术面试考察的不只是记忆,更是对基础原理与工程实践的贯通能力。从Java集合框架的并发安全设计,到JVM内存模型与GC调优,再到线程池参数的合理设定,这些核心知识点构成了后端开发的技术底座。而在海量数据场景下,HBase作为分布式列式存储系统,凭借其稀疏模型与Region扩展能力,成为高频读写方案的典型代表。与此同时,手撕算法环节强调边界处理与复杂度分析,滑动窗口等经典思路往往成为解题关键。本文以华为OD技术面试真题为载体,串联起Java核心机制、HBase实操与算法演练,帮助开发者系统地审视自身技能短板,

weixin_30843121的博客 230

判断一个元素是否在可视区域

本文介绍了三种判断元素是否在可视区域的方法:1. offsetTop 和 scrollTop 适用于简单垂直滚动场景,实现简单但功能有限;2. getBoundingClientRect() 可精确检测元素位置,支持多维度判断但实现较复杂;3. Intersection Observer API 是现代浏览器的高效解决方案,性能优越但对旧版浏览器兼容性差。文章还对比了各方法的优缺点,并提供了代码示例,帮助开发者根据需求选择合适的技术方案。<|end▁of▁sentence|>

2202_75695913的博客 663

java 判断点在不规则区域围栏内

java 判断点在集合点围栏内 判断一个地理坐标是否在一个以多边形的顶点组成的地理围栏里 import java.awt.geom.Point2D; import java.util.ArrayList; import java.util.List; /** * @author fanxinjian * @date 2020/10/30 17:27 */ public class regionUtil { private static double EARTH_RADIUS = 6.

haiyaoyouyou的博客 2464

Mamba-ST实战:用状态空间模型实现艺术风格迁移的5个关键步骤

本文详细介绍了如何使用Mamba-ST状态空间模型实现高效的艺术风格迁移,涵盖环境配置、数据预处理、模型架构、训练策略和推理优化等5个关键步骤。Mamba-ST基于SSM(状态空间模型)构建,在保持生成质量的同时显著降低计算复杂度,为风格迁移领域提供了新的解决方案。

weixin_29163581的博客 355

【算法】计算机图形学的一些经典小题:判断点在多边形内,随机生成三角形内的点,判断两个矩形是否相交等

前几天面试的时候被问到了,如何随机在三角形内生成点,我按照我的想法回答了一遍,但觉得回答的不够好。最后面试官说了一个最优的方法。觉得不错,顺带总结一下最近看到的一些关于计算机图形学方面的经典小题,知乎上看到的还有Leetcode上的 1.判断一个点是否在多边形内首先先说一下输入的内容,多边形的顶点是一个数组输入进来,其中每个相邻点之间对应着多边形上有边相连POINT p1 = ptPolygon[i

haolexiao的专栏 8812

数分实战(01):Global_Superstore数据集解析与商业洞察

本文以Global_Superstore零售数据集为例,手把手指导数据分析实战全流程。从数据清洗、探索性分析到深度商业洞察,详细解析了如何通过Python处理缺失值与异常值,进行销售利润分析、客户细分与地理分析,并探讨了折扣与利润的微妙关系。文章旨在帮助读者建立数据分析思维框架,从数据中挖掘可指导实际业务决策的核心洞察。

weixin_28487433的博客 343

Unreal5从入门到精通之Landscape地形系统

虚幻引擎 5 (UE5) 能够利用其强大的地形编辑工具套件创建大规模的地形世界。使用地形工具可以创建身临其境的户外地形,这些地形经过优化,可在多种不同设备上保持可播放的帧速率。

TxNet 4145

ospf的不规则区域

OSPF的不规则区域 OSPF中区域划分要求:1.区域之间必须存在ABR,2.区域划分按星型拓扑划分。但在现实中应种种不可抗因素,导致不规则区域的出现,常见的不规则区域如下: 在远离骨干的非骨干区域中,area 2和area 1间的ABR由于没有连接到骨干区域,被称为非法ABR,非法ABR可以收集所连区域的lsa

qq_57686163的博客 1025

BP神经网络回归预测+SHAP可解释分析+新数据预测(MATLAB完整源码)

BP神经网络回归预测+SHAP可解释分析+新数据预测(MATLAB完整源码)

机器学习之心的博客,关注并私信文章链接,获取对应文章源码和数据。 393

python计算不规则闭合区域的面积_Python:计算不规则轮廓lin内的面积

我试图在Python2.7中计算等高线内的面积。它是一个不规则区域,如下所示:基本上,我将轮廓的路径保存在以下路径中,并加载它:AoI_saved=np.load('C:\Users\Roberta\Desktop\Analysis\Pilot2\AoI\AoI_Lev1_'+pict[:-4]+'.npy')我可以在同一个文件中保存一个、两个或多个轮廓。对于由等高线定义的每个区域,我都要计算面积...

weixin_42510460的博客 2179

《Zephyr OS 入门与实战》第1章:Zephyr OS 架构与物联网定位

【代码】《Zephyr OS 入门与实战》第1章:Zephyr OS 架构与物联网定位。

2301_79143213的博客 1273

【声纳与人工智能融合——从理论前沿到自主系统实战】第一章 声纳AI的数据基础:仿真、数据集与表征学习

该数据集的特点是包含了多种底质背景(沙地、泥地、碎石区)与噪声条件,适合验证模型的背景抑制能力。Urashima数据集由日本海洋研究开发机构(JAMSTEC)发布,基于自主水下航行器(AUV)采集,包含前视声纳序列数据,主要用于水下导航与避障算法评估,其数据包含了精确的姿态与深度标注,支持三维场景重建算法的训练。北约海洋研究与实验中心(CMRE)发布的CMRE datasets包含侧扫与合成孔径声纳数据,特别适用于跨传感器域自适应研究,数据集中包含了同一区域的多种声纳成像结果,为跨模态学习提供了基准。

u012133341的博客 103

OSPF接口的网络类型和不规则区域

BMA --- 支持广播的多点接入网络NBMA --- 不支持广播的多点接入网络。

m0_73907449的博客 820

Qt6.10 | Qt Bluetooth 蓝牙

本文介绍了QtBluetooth模块的功能和使用方法,包括蓝牙API概述、构建配置(CMake/qmake)、权限管理、平台支持(Linux/macOS特殊处理)、日志设置及许可信息。重点说明Linux平台的后端选择机制,以及macOS上的依赖限制。最后提及蓝牙聊天示例,展示RFCOMM协议通信的实现。全文提供了蓝牙开发的技术要点和注意事项。

Qt历险记,专注Qt技术,三年医疗设备研发经验,1年机器视觉研发经验,半年柔性传感研发经验。 403

js计算点是否在多边形范围内:项目推荐文章

js计算点是否在多边形范围内:项目推荐文章 去发现同类优质开源项目:https://gitcode.com/ 项目介绍 在现代Web开发中,地理位置和空间数据的处理变得日益重要。今天,我要为大家介绍一个开源项目——js计算点是否在多边形范围内。这是一个基于JavaScript的轻量级库,它提供了一个核心功能:判断一个点是否位于多边形内部。这项技术对于地图服务、地理信息系统(GIS)、游戏开发等领域...

gitblog_06798的博客 435

ATECC508A芯片开发笔记(四):自定义配置508功能,规划DataZone数据存储

ATECC508A芯片开发笔记(四):自定义配置508功能,规划DataZone数据存储 508A内部存储区介绍 Data Zone Config Zone 508A Config Zone配置(自定义) - ATECC508A芯片在使用之前,需要自定义配置ConfigZone与DataZone,并同Lock命令将两个区域锁住,否则无法正常使用功能。而一旦锁上就是永久性的,配置区不能够进行解锁

HowieXue 薛永浩的博客 2万+

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

android 扇形点击范围,Android饼图好画,但不规则区域点击如何区分?

前言前阵子帮团队招人,我很喜欢问候选人这个问题。点击区域是不规则的,该如何让手势事件在不规则区域内做出响应?如果候选人的答案是通过数学计算的方式来确定落点。我会微微一笑的反问他,如果是五角星怎么办?本文主要会介绍以下内容1、绘制饼图的几种方式2、不规则区域的点击3、文字居中公式先看一下最终实现的效果,代码地址在文末自定义的饼图如何绘制饼图?基础知识Path类型API描述添加弧形addArc添加弧形...

weixin_39540020的博客 356

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

华为Python面试通关秘籍:从手撕代码到模型调参的避坑指南

本文为准备华为Python开发或算法工程师面试的求职者提供了一份实战指南。文章深入剖析了面试中的核心环节,包括考察工程化思维的“手撕代码”避坑技巧、从原理层面理解机器学习“八股文”的方法,并涵盖了Python并发编程与模型调参等关键技术要点,旨在帮助候选人系统性地提升面试表现和技术深度。

weixin_29095587的博客 444

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

机器学习算法岗面试全记录:大厂考点拆解与手撕代码复盘

机器学习算法是AI领域工程师面试的核心考察点,覆盖监督学习、无监督学习、数据结构与优化算法等多个维度。理解模型推导、适用场景与局限性是夯实基础的关键,而KMP算法、粒子群算法等扩展内容也常成为区分候选人的差异化考点。扎实的算法功底与工程实践能力,直接关系到特征工程、模型评估、线上部署等真实业务问题的解决效率。在腾讯、阿里、网易等大厂算法岗面试中,面试官不仅会追问逻辑回归、SVM、决策树等经典模型的原理细节,还会通过手撕代码、项目深挖、场景设计等环节全面评估候选人的综合能力。以准备面试为契机,系统梳理算法知识

weixin_34416754的博客 443

cesium判断一个点是否在一个范围内

尝试了很多包括:Cesium.PolygonPipeline.isPointInPolygon,Cesium.IntersectionTests.polygonContainmentTest都报错,只好使用外部库了。

weixin_39752673的博客 1391

数学之美--不规则多边形相交计算(1)

数学之美--不规则多边形相交计算前言       我决定写一些技术类的文章,想了半天都不知道从何入手,从编程语言方面来看C#,Java,C++以及python等我的基本功很差;如果从应用角度来完成某些的话,虽然工作流是我的长项,但是如果需要完整来描述工作流的话,我又要死掉无数的脑细胞.无果       最后在看Google的blog的时候突发奇想:我也可以来写写”数学之美”,虽

Sean.Pu的专栏 1万+
上一篇: psql 无法连接数据库,连接超出
下一篇: 提升机器学习数学基础,这7本书一定要读-附pdf资源
小糖宝
博客等级 码龄9年 47粉丝 46原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值