利用Matlab判断某些点是否在多边形区域内

目录

 1. 代码作用及实现效果

 2. 技术分析:        

  3. 程序

1. 代码作用及实现效果

        先给各位看看具体效果,如下所示,其中红色的点表示需要判断的点,是否在蓝色区域内,从图中可知,有两个点在蓝色区域内,一个点在边界线上,一个在蓝色区域外。

 2. 技术分析:        

       

原理:射线法;从该点假想一条通向无穷远的射线,通过判断射线与多边形交点的个数奇偶来确定点与多边形的位置关系。具体原理详解可自行百度;

 可以利用Matlab内置的函数inpolygon,也可以写一个函数,加强自己的理解;

inpolygon函数用法:

   in = inpolygon(xq,yq,xv,yv)[in,on] = inpolygon(xq,yq,xv,yv)

  3. 程序

        下面是我根据射线法写的代码:该代码可以判断点是否在这个区域(包含边界线)上,是则输出1;反之则输出0。然后提取输出为1的索引,并找出对应的点坐标;

function Flags = inPoly(Site_Ponit,Area)
%==================================说明====================================
%   判定点目标是否在区域内函数
%   函数作用:判断点坐标是否在所需的区域内
%
%   作者:胡礼珍
%   单位:厦门大学联合遥感接收站
%   邮件:hulizhen@xmu.edu.cn
%
%   输入:
%       Site_Ponit      需要判断的点的位置坐标,n×2矩阵;
%       Area            面状区域,多边形各个顶点位置坐标(可以是经纬度),n×2矩阵;
%   输出:
%       OutImage    输出一个二维矩阵
%       ImageName   将输出的矩阵保存为文件
%
%   语法:
%   flags = inPoly(Site_Ponit,Area):
%           Site_Ponit表示需要判断的点的位置坐标,n×2矩阵;Area表示面状区域,
%           多边形各个顶点位置坐标(可以是经纬度),m×2矩阵;
%--------------------------------------------------------------------------
%   参考博客:https://blog.csdn.net/ye_xiao_yu/article/details/72765726
%==========================================================================
if ~(Area(1,:) == Area(end,:))errordlg('首尾点不相等,请确认区域是否为面状区域。如果是,请忽略;否则,请核对重新运行;','警告:输入可能有误')Area = [Area;Area(1,:)];
endNum_Piont = size(Site_Ponit,1);     % Site_Ponit的行数,也表示检测点的个数
Num_Area = size(Area,1);            % Area的行数,也表示多边形顶点数+1
Flags = zeros(1,Num_Piont);         % 新建存储空间,存放判定结果0和1,初始全为0
% h = waitbar(0,'运行……');          % 新建进度条
for i=1:Num_Piont% 添加一个进度条,显示进展
%    per = fix(i/Num_Piont*10000)/100;                  % 完成度
%    str=['点目标判断函数-完成: ',num2str(per),' % '];  % 进度条上显示的内容
%    waitbar(i/Num_Piont,h,str);if ~isempty(find(Area(:,1)==Site_Ponit(i,1)& ...Area(:,2)==Site_Ponit(i,2), 1))             % 判定点是否在顶点上Flags(i) = 1;               % 符合要求,判定为1continue;                   % 结束本次循环,进行下一次循环end% 射线法:从该点假想一条通向无穷远的射线,通过判断射线与多边形交点的个数奇偶来确定点与多边形的位置关系。% 参考:https://blog.csdn.net/bitcarmanlee/article/details/60591192for j=2:Num_Area% 条件A= 条件01 或 条件02%      = (条件11 与 条件12)% 条件01 = (条件11 与 条件12) 或%        = (Area(j,2)<=Site_Ponit(i,2)) && (Site_Ponit(i,2) < Area(j-1,2))% 条件11:(Area(j,2)<=Site_Ponit(i,2))% 条件12:(Site_Ponit(i,2) < Area(j-1,2))% 条件02 = (条件21 与 条件22)%        = ((Area(j-1,2) <= Site_Ponit(i,2)) && (Site_Ponit(i,2) < Area(j,2)))% 条件21:(Area(j-1,2) <= Site_Ponit(i,2))% 条件22:(Site_Ponit(i,2) < Area(j,2))% 条件B:Site_Ponit(i,1) < (Area(j-1,1) - Area(j,1)) * (Site_Ponit(i,2) - Area(j,2))/(Area(j-1,2)-Area(j,2)) + Area(j,1);if (...(...        % 判断:条件A = 条件01 或 条件02 (...        % 判断:条件01 =(条件11 与 条件12)(Area(j,2)<=Site_Ponit(i,2)) && (Site_Ponit(i,2) < Area(j-1,2))...)...||...   % ********************“或”*******************(...        % 判断:条件02 = (条件21 与 条件22)(Area(j-1,2) <= Site_Ponit(i,2)) && (Site_Ponit(i,2) < Area(j,2))...)...)...   % ----------------------条件A----------------------&& ...  % **********************“与”*********************(...Site_Ponit(i,1) < ...(Area(j-1,1) - Area(j,1)) * (Site_Ponit(i,2) - Area(j,2))/...(Area(j-1,2)-Area(j,2)) +...Area(j,1)...)...   % ----------------------条件B----------------------)Flags(i) = Flags(i) + 1;    % 交点数累加,最后根据奇偶判定是否在其中endend
end
% close(h);               % 关闭进度条
Flags = mod(Flags,2);   % 分裂后剩余,判断奇数偶数,奇数则表示在,偶数则表示不在
end

        调用验证上面函数的代码如下:

clear;close all;clc;
% 设置3个点,第1个点和第二个点在区域内,第三个点不在区域内,第四个点在边界线上
P = [116.5412066049,25.2741767057;116.2906735589,25.4947457375;115.5006735589,24.4947457375;117.9292952035,26.1752619468];      % 需要检测的点
Poly = [118.0562474131,25.521042552;117.9292952035,26.1752619468;115.4280709351,25.7592188999;115.7898649526,24.0756121845;117.7748394579,24.4133199012;117.5551745295,25.4373847646;118.0562474131,25.521042552];   % 判定区域的范围  
% 第一种方法,自己编写函数
tic
flags = inPoly(P,Poly);                 % 判定点目标是否在区域内函数
In_P = P(flags== 1,:)            % 根据判定,找出在判定区域内的点坐标
tocfigure('Name','效果图1')fill(Poly(:,1),Poly(:,2),'b');
title('判断点目标是否在该区域范围内')
hold on
scatter(P(:,1),P(:,2),'r.')
hold offtic
% 第二种方法,用内置函数 inpolygon
flags = inpolygon(P(:,1),P(:,2),Poly(:,1),Poly(:,2));
In_P = P(flags== 1,:)            % 根据判定,找出在判定区域内的点坐标
toc                              % 
% 自己写的,速度差不多,说明还是成功的

不足之处,敬请斧正!

转载请说明出处!

路漫漫其修远兮,吾将上下而求索

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/246502.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

spark1.0和2.0的区别_【系统】华为正式发布鸿蒙OS 2.0手机Beta版:UI界面、交互无区别...

今天上午&#xff0c;华为正式发布了鸿蒙OS 2.0手机开发者Beta版本&#xff0c;HarmonyOS 是面向万物互联时代的全场景分布式操作系统&#xff0c;华为希望和合作伙伴、开发者一起打造面向万物互联时代的超级终端体验。目前也已经开启了公测招募活动&#xff0c;不过报名还是有…

Matlab 纯代码进行GUI界面编程

Matlab界面编程传统的有guide&#xff0c;现在matlab朝着appdesigner方向发展。这两种方法都是非常简单适合新手的&#xff0c;如果是一个未接触这方面的&#xff0c;我建议直接学APPdesigner&#xff0c;如果想了解更深入&#xff0c;可以尝试利用纯代码进行编程。 编程要点…

深入到系统组件是否白盒测试_2019年系统集成项目管理工程师:第一章 信息化知识(三)要点?...

今天幸福哥助理继续为大家分享第一章 第三节 信息化知识(二) 信息系统设计、软件工程及面向对象系统分析与设计等复习知识要点&#xff0c;备考笔记知识点的分享会不定期整理&#xff0c;如果你正好参加这个考试&#xff0c;可以关注我&#xff0c;收藏&#xff0c;或者转发。一…

IDL 文本编码、代码补全快捷方式、IDL doc、格式器、行号显示设置

目录 1. 文本文件编码设置 2. 自动补全设置 3. IDL doc设置 4. 格式器设置 5. 显示行号 每种编程语言的某些设置&#xff08;快捷键、显示风格&#xff09;都大相径庭&#xff0c;因此需要需要对一些显示&#xff0c;使得更符合自己的编程习惯&#xff0c;方便用起来得心…

IDL学习(对象):IDLffShape

目录 一、描述 二、创建 三、属性 3.1 ATTRIBUTE_INFO 3.2 ATTRIBUTE_NAMES 3.3 DBF_ONLY 3.4 ENTITY_TYPE 3.5 FILENAME 3.6 IS_OPEN 3.7 N_ATTRIBUTES 3.8 N_ENTITIES 3.9 N_RECORDS 3.10 UPDATE 四、方法&#xff1a; 4.1 IDLffShape::AddAttribute 4.2 IDLff…

tablueau地图标记圆形_30天30张中国风地图,从青绿山水到秦砖汉瓦

本文来自#30天制图挑战#的GISer November_阿瑜瑜瑜瑜&#xff0c;完成了30幅中国风专辑地图&#xff0c;唯美又有韵味&#xff0c;十分赏心悦目&#xff0c;简直把中国风玩出了花~接下来&#xff0c;快来跟着小编一起细品30幅中国风地图吧~~~ 01day 1千里江山图《千里江山图》是…

语言省考安徽考区_安徽省中小学新任教师公开招聘统一笔试 中学信息技术学科考试大纲...

一、考试性质安徽省中小学新任教师公开招聘考试为全省统一组织的公开性选拔考试&#xff0c;是落实“省考、县管、校用”教师管理体制的基础工作。其目的是吸引有志于从事基础教育事业的优秀人才到中小学任教&#xff0c;进一步规范中小学新任教师公开招聘工作&#xff0c;把好…

IDL学习:语法基础-指针、链表

本博客将介绍IDL语法基础中的指针、链表的创建及相关的用法。记录自己的学习整理理解 。 1. 指针 指针也就是内存地址&#xff0c;是用来存放内存地址的变量&#xff0c;指针可以理解为通讯地址&#xff0c;可以通过通讯地址查询具体的信息&#xff0c;而指针可以查询所指向的…

IDL学习:语法基础-对象、哈希表

本博客将介绍IDL语法基础中的对象、哈希表的创建及相关的操作发法。哈希表、链表都可以看做对象&#xff0c;包含了add、reserve、Sort等方法。记录自己的学习整理理解 。 1. 对象 对象是数据&#xff08;属性&#xff09;和程序&#xff08;方法&#xff09;封装在一起的实体…

茶苑机器人怎么看出来_小儿脑瘫怎么看出来?出现4个异常,该早点去看医生...

小儿脑瘫表现出来的症状是多种多样的&#xff0c;一般儿童三个月就能够展现出来&#xff0c;家长应该多观察孩子的一些异常情况&#xff0c;及时去医院做诊断&#xff0c;做到防患于未然。小儿脑瘫的表现有哪些&#xff1f;1、运动发育明显落后正常的儿童3个月能抬头&#xff0…

itil 容量管理流程_探索ITIL和DevOps的边界

其实在今天的运维领域&#xff0c;ITIL和DevOps之间的冲突还是蛮明显的&#xff0c;有些是表现在产品上&#xff0c;有些是表现在思维/理念上。ITIL在产品上以流程为核心目标的设计&#xff0c;很难满足自动化的要求&#xff0c;DevOps极力推崇工具/平台/自服务文化&#xff1b…

本博客IDL 学习目录

本博客非技术博客&#xff0c;而是总结我在学习IDL、编写IDL代码方面的博客&#xff0c;旨在方便各位可以通过我这篇博客直接选感兴趣的部分。本博客将会持续更新&#xff0c;不断补充…… IDL 学习 1. IDL 文本编码、代码补全快捷方式、IDL doc、格式器、行号显示设置 2. ID…

Matlab 中@ 的用法

Matlab 中的用法主要有&#xff1a;函数句柄、函数表达式、调用父类以及类文件夹。 前两种有很多介绍&#xff0c;后两种涉及类&#xff0c;介绍的人很少。前2个例子&#xff0c;参考了其它博客&#xff0c;总感觉用法都写的不全&#xff0c;所以在此基础上&#xff0c;补充了3…

金蝶k3单据编码规则_金蝶K3存货跌价案例教程

目录案例介绍 后台设置 计提存货跌价准备显示计提表计提凭证模板设置计提凭证生成手工结转跌价准备案例介绍关于存货跌价准备&#xff0c;企业会计准则第1号存货相关规定如下&#xff1a;第十五条 资产负债表日&#xff0c;存货应当按照成本与可变现净值孰低计量。存货成本高于…

maven 关联源码插件_繁琐的任务简单化,Maven的插件机制

Maven的生命周期与Maven插件是项目绑定的&#xff0c;生命周期可以理解为项目构建步骤的集合&#xff0c;它定义了各个构建环节的执行顺序&#xff0c;有了这个顺序&#xff0c;Maven 就可以自动化的执行构建命令。Maven 的核心程序中定义了抽象的生命周期&#xff0c;生命周期…

双稳态继电器工作原理图_固态继电器只有单一的作用吗?带你了解不一样的固态继电器...

固态继电器简写SSR(Solid State Relay)&#xff0c;是一种全部又分离的固态电子元件(如光耦合器、晶体管、可控硅、电阻、电容、集成电路等)组成的无触点电阻开关&#xff0c;这里请注意&#xff0c;相比较与继电器、接触器&#xff0c;固态继电器是无触点的耦合开关。因此&…

c++switch实现猜拳_C语言实现人机猜拳游戏,非常适合C++小白练习的项目!

学习迷茫遇到问题了吗&#xff1f;现在关注微信公众号&#xff1a;C程序编程 免费获取进阶指导和学习资料&#xff01;本文福利在文末&#xff01;这是一个简单的猜拳游戏&#xff08;剪子包子锤&#xff09;&#xff0c;让你与电脑对决。你出的拳头由你自己决定&#xff0c;电…

bootstraptable获得所有行_2020广汽本田安全中国行·首届道路安全创新大赛成功举办...

两辆汽车分别搭载了代表着婴儿的红心&#xff0c;当两车相撞&#xff0c;被安全座椅包裹的红心安然无恙&#xff0c;而另一颗没有安全措施的红心直接裂开。画面配文"救救孩子"&#xff0c;让人格外揪心。这是来自2020年广汽本田安全中国行首届道路安全创新大赛公益广…

en55032最新标准下载_大型设备塔吊安装维保、安全检查及案例,94页PPT下载!

提示&#xff1a;点击↑上方"建筑安全技术"关注加入领取&#xff1a; 一级建造师课件&#xff1b; 二级建造师课件&#xff1b;注册安全工程师课件&#xff1b;目录&#xff1a;1、 塔吊的安装流程及使用的常规检查2、 塔吊维修保养3、 使用过程中存在的问题4、 …

六年级下册百分数计算题_小学六年级数学期末考,题量较大,出题全面、灵活...

昨天&#xff0c;我们进行了期末考试&#xff0c;因为是八月中旬开学的&#xff0c;所以&#xff0c;期末考试&#xff0c;也进行地比较早。六年级数学上册人教版&#xff0c;此次期末测试&#xff0c;题量是非常大的&#xff0c;大题共有六道&#xff0c;题型呢&#xff0c;主…