5.数据裁剪

本文讨论了通过射线法和matlab的inpolygon函数检测点是否在多边形区域内的方法,指出在处理大量数据时,先用最小外接矩形预剪切数据可提高效率。Matlab的inpolygon在处理边界复杂的情况速度较慢,需后续优化。
摘要由CSDN通过智能技术生成

为了减少计算量,先判定数据是否在该区域的最小外接矩形内,再执行点是否在区域内的算法(在本次毕业设计中,效果并不大,可以不用进行)

方法一:射线法

使用射线法
https://www.cnblogs.com/guogangj/p/5127527.html
https://blog.csdn.net/weixin_42943114/article/details/124645273 (更多的方法,更好的讲解)
一个点引出一根“射线”,与多边形的任意若干条边相交,累计相交的边的数目,如果是奇数,那么点就在多边形内,否则点就在多边形外。
在这里插入图片描述

方法二:调用matlab函数inpolygon

虽然matlab里的示例给出的是凸多边形,但 https://blog.csdn.net/weixin_42943114/article/details/124645273 试验了可以凹多边形也可以使用

clear
clc
close all
%多边形定义(连线必须按照首尾相接的顺序)
BD=[0,0;0,-1;1,0;2,-1;2,0;2,1;2,2;1,2;1,1;0,1];%凹多边形
%BD=[0,-1;0,-2;1,-1;2,-2;2,-1;2,0;2,3;-1,3;-1,1;...
%    3,1;3,1.5;0,1.5;0,2.5;1,2.5;1,0;0,0];%凹多边形,而且自相交
%BD=[0,1;-1,0;-1,-1;0,-1;1,-1;1,0];%凸多边形
%要判断的点
[X,Y]=meshgrid(-5:0.1:5,-5:0.1:5);
xy2=[X(:),Y(:)];

%方法6 matlab自带方法
[IsInPoly,IsOnBD]=inpolygon(xy2(:,1),xy2(:,2),BD(:,1),BD(:,2));

figure()
hold on
plot(BD(:,1),BD(:,2))
scatter(xy2(:,1),xy2(:,2),24,IsInPoly+2*IsOnBD,'Marker','.')
tic
% 第二种方法,用内置函数 inpolygon
flags = inpolygon(P(:,1),P(:,2),Poly(:,1),Poly(:,2));
In_P = P(flags== 1,:)            % 根据判定,找出在判定区域内的点坐标
toc                              %

补充

试验了matlab的inploygon函数,在边界点数少和完全不沾边的文件时,速度很快,其余时候都很慢,大概30~70s,简直无法忍受,现在我打算先用最小外接矩形把原始数据剪切,然后在交叉点时再计算是否在准确边界内。

  • 17
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值