数据点排序算法:针对数据点在获取的时候有一定的顺序(如沿着某一曲线),但实际得到的数据点的顺序是错乱的,本算法可以将数据点排序。

文章提供了一个MATLAB脚本,用于解决UG软件中封闭曲线数据点的排序问题。当按照等弧长导出1000个点时,数据点按X值排序,而非沿曲线方向。脚本通过Y值大小进行初始排序,然后利用距离最小化策略调整点顺序,确保它们沿着曲线方向排列。最终目的是优化NURBS曲线拟合过程。
摘要由CSDN通过智能技术生成

解决的实际问题是:UG中的一条轮廓曲线(封闭曲线),使用等弧长导出1000点时,导出的igs文件中的数据点是按照X的大小进行排序的,而不是沿着曲线的某一方向排序, 使用下面的matlab算法可以将数据点按照某一方向进行排序。排好序后的数据点方便进行NURBS曲线拟合。


%matlab脚本
%多个数据排序
%只考虑截面2 4 6 8 10 12
clc
clear
% close all

for a=2:2:12
    str1='截面';
    str2=num2str(a);
    str3='/半理论截面';%可以在 '/理论截面'    '/包络截面'    '/半理论截面'    '/半包络截面'   等之间切换
    str4='.dat';
    str5=[str1 str2 str3 str2 str4];%输入文件的格式
    str6='sort.dat';
    str7=[str1 str2 str3 str2 str6];%输出文件的格式
    point=load(str5);
    [m,n]=size(point);

    %排序
    Y=point(:,2);%根据Y的大小进行排序
    [big,y]=max(Y);
    sortpoint=[];
    sortpoint(1,:)=point(y,:);
    point(y,:)=zeros;%将统计过的point中的元素置为零,根据实际情况调整,0或inf无穷
    t=0;
    while t<m-1
        mpoint=sortpoint(end,:);
        S=[];
        for i=1:m
            s=sqrt((point(i,1)-mpoint(1))^2+(point(i,2)-mpoint(2))^2+(point(i,3)-mpoint(3))^2);
            S=[S;s];
        end
        [T,r]=min(S);
        sortpoint=[sortpoint;point(r,:)];
        point(r,:)=zeros;
        t=t+1;
    end
    
    %去掉重复的点,在实际过程中可能会有重复的点
    for i=1:m-1%将重复的点置为零向量
        for j=i+1:m
            if sortpoint(i,:)==sortpoint(j,:)
                sortpoint(j,:)=zeros;
            end
        end
    end
    %去除sortpoint中的零向量%
    zero_rows = find(all(sortpoint==0,2));
    sortpoint(zero_rows,:) = [];
      
    dlmwrite(str7,sortpoint);%导出排序后的点集
    plot3(sortpoint(:,1),sortpoint(:,2),sortpoint(:,3));%画出排序后的点
    hold on
    %     axis equal;
end


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值