Matlab程序学习(散点边界线/包络线)

本文介绍了一种用于生成散点数据紧致包络线的算法,该算法能够根据散点分布特点生成既不过度包络也不过于紧致的边界线。通过散点排序与凹凸点判断,结合特定阈值去除不必要的凹点,最终形成所需的包络线。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

针对散点边界线,Matlab重的convhull为凸包络线,往往不能满足实际工作需要。

作散点的紧致包络线,需要考虑到凹凸点,为减少包络线与散点数据的过度紧密(穿过全散点),并不过度包络(类似convhull),从以下思路来实现:

1.散点数据按行走方向排序,并判断点的凹凸;

2.针对凹点,添加阈值,通过夹角判断,去除部分凹点,然后继续此种循环判断,直到所有凹点满足要求;

程序文件:

 
  
function y2=ScatterHull(Data,ang_2)
% Thinking from Dsp Tian 
% http://www.cnblogs.com/tiandsp/p/4006575.html
% y1(:,1)=x;y1(:,2)=y;ang_2:concave min angle
% ang_2=180:conhull;ang_2=0:all scatters
y1=unique(Data,'rows');% Remove duplicate rows 
%%
% sort of scatters
    cen=mean(y1);
    ang=atan2(y1(:,1)-cen(1),y1(:,2)-cen(2)); %每个点到坐标中心极角
    y1=[y1,ang];
    y1=sortrows(y1,3);    %按极角排序
    y1=y1(:,1:2);
%%
y2=y1;
im=1;
[n m]=size(y1);
%%
while length(im)>0
 
im=[];
%向量计算,判断凹点
for i=1:n    
    if i==1  %处理第一个点
        v1=y1(n,:)-y1(1,:);
        v2=y1(2,:)-y1(1,:); 
    elseif i==n %最后一个点
        v1=y1(n-1,:)-y1(n,:);    
        v2=y1(1,:)-y1(n,:);        
    else 
        v1=y1(i-1,:)-y1(i,:);     
        v2=y1(i+1,:)-y1(i,:);
    end
    r=det([v1;v2]);  %叉乘后向量方向
    c=dot(v1,v2)/(norm(v1)*norm(v2));
    ang=rad2deg(acos(c));
        
    if r<=0&(ang<ang_2|isnan(ang)==1)%concave
            ang(ang<ang_2)=[];
            im=[im;i];
    end
end
y2(im,:)=[];
y1=y2;
[n m]=size(y1);
end
%%
y2=[y2;y2(1,:)];%result's curve is closed
end
 
  
 
 

 

 

主程序:

function samplef
%UNTITLED5 Summary of this function goes here
%   Detailed explanation goes here
close all
clear all
clc
t=load('data2.txt');
t(t(:,1)==0|t(:,2)==0,:)=[];
x=t(:,1);
y=t(:,2);
figure(1)
ang=[0 60 120 180];
for i=1:4
t2=ScatterHull(t,ang(i));
t2=[t2;t2(1,:)];%画图使封闭
subplot(2,2,i)
hold on
plot(t(:,1),t(:,2),'ro')
plot(t2(:,1),t2(:,2),'g-')
legend('scatter','HullCurve','Location','NorthWest')
title(num2str(ang(i)))
end
end

 

结果:

 

注意:部分散点极度不规则的情况,效果并不理想,例如散点图明显分区,具有几个明显的聚点中心

 

 

 

转载于:https://www.cnblogs.com/ClownZzb/p/7081830.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值