⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ccpoints.m

📁 利用MATLAB实现了对测量中的平面网
💻 M
字号:
function cpp=ccpoints(be,en,sd,gd,s)
%余枝搜索法搜索闭合环
%be 起点 en 终点 sd 总点数 gd 观测值 s 距离
cpp=[];                 %存放闭合环点号信息
bee=be;
enn=en;
temp=[];
course=zeros(1,gd);     %标记观测边号
%建立生成树==========================================================
%  while 2
        g=size(bee,1);
        num=zeros(1,sd);
        %计算结点度
        for i=1:g
            num(bee(i))=num(bee(i))+1;
            num(enn(i))=num(enn(i))+1;
        end
        %取出最大度结点,以最大度结点为起始点建立生成树
        [degreenum,pointnum]=max(num);
        been=[bee enn];
        temp1=[];
        i1=0;
        i2=0;
        [i,j]=find(been==pointnum);
        tem=been(i,:);
        tem=reshape(tem,1,prod(size(tem)));
        tem((tem==pointnum))=[];%2级点树枝的点号
        temp=[temp pointnum tem];%已记录的点
        course(i)=1; %标记树枝
        while 1%树是否已包含所有的点
            if size(temp,2)==sd;%首先判断是否所有的点都已记录
                break;
            end
            for i=tem
                [i1,j1]=find(i==been);
                beentem=been(i1,:);
                for j=1:size(beentem,1);
                    xxx=beentem(j,:);
                    newpoint=xxx(xxx~=i);
                    if any(temp==newpoint)==0; %若不是已记录的点
                        temp=[temp newpoint];
                        temp1=[temp1 newpoint];%3级点
                        course(i1(j))=1;%也标记为树枝
                    end
                end
            end
            tem=temp1;
            temp1=[];
            if size(temp,2)==sd;%所有点已记录
                break;
            end
            if isempty(tem)==1;%无新点产生
                break;
            end
        end
%course=1标记树枝;course=0标记余枝
[i j]=find(course==0);


ns=length(i);%余枝数,也即闭合环数
%--------------------------------------------------------------------
if ns>0
       A=[]; 
       B=[];
               for i=1:gd
                   if course(i)==0
                       B=[B;be(i) en(i) s(i)];%余枝边长记录
                   else
                       A=[A;be(i) en(i) s(i)];%树枝边长记录
                   end
               end
       r=ns;
       rr=r;
       site=[];
       m=[];
       for xyt=1:rr%闭合环数
           number=zeros(1,r);
           site1=[];
           dist1=[];
           for ii=1:r
               n=1;%支路数
               course=[];
               been=[];
               i=[];
               j=[];
               st=[];
               dt=[];
               course=zeros(1,gd);%以新点点号标记该观测值
               been=A(:,1:2);
               temp1=[];
               i1=0;
               i2=0;
               [i,j]=find(been==B(ii,2));%从第ii余枝的终点开始找与之相连的树枝点
               tem=been(i,:);
               tem=reshape(tem,1,prod(size(tem)));
               tem((tem==B(ii,2)))=[];%新点点号
               temp=[B(ii,2) tem];%已搜索到的点号
               course(i)=B(ii,2);%标记与该余枝点相连的树枝
           %正向寻找
           while 1
                   n=n+1;          %支路个数
                   for i=tem
                        [i1,j1]=find(i==been);
                        beentem=been(i1,:);
                        for j=1:size(beentem,1);
                            xxx=beentem(j,:);
                            newpoint=xxx(xxx~=i);
                            if any(temp==newpoint)==0;%新点是否已记录
                                temp=[temp newpoint];
                                temp1=[temp1 newpoint];; %存放下一个层次出现的所有新点
                                course(i1(j))=i;        %若为新点,其支路定义为起点的点号,便于后面反向寻找闭合环,在某点上,其支路编号与该点不同的是环上的支路。
                            end
                            if newpoint==B(ii,1)         %若新点为余支的另一端点
                                m=i;                     %存放与余支的另一端点相连的点号
                                t=i1(j);                 %该支路在观测值数组中的序号
                                break;
                            end
                        end
                        if newpoint==B(ii,1)
                            break;
                        end
                   end
                   tem=temp1;
                   temp1=[];
                   if newpoint==B(ii,1)
                        break;
                   end
           end 
           %反向提取闭合环
           st=[ m];
           di=A(t,3);
           while 3
               if length(st)==n;
                   break;
               end
               [i1,j1]=find(been==m);
               tem=i1';
               fl=0;
               for i=tem
                   fl=fl+1;
                   if course(i)~=0 & course(i)~=m
                       m=course(i);
                       st=[st m];%闭合环点号
                       di=di+A(i,3);%闭合路线长
                       break;
                   end
               end
           end
           st=[st B(ii,1)];
           di=di+B(ii,3);
           st=[st st(1)];
           site1{ii}=st;                                       %闭合环点号数组,若干闭合环
           number(ii)=n+1;                                     %闭合环边数
           dis(ii)=di;                                         %闭合环长度
       end
       tem=find(number==min(number));%最终的闭合环要符合边数最少
       [i,j]=min(dis(tem));%边长最短
       site{xyt}=site1{tem(j)};
       distt(xyt)=dis(tem(j));
       r=r-1;
       A=[A;B(tem(j),:)];%余枝化为树枝
       B(tem(j),:)=[];%余枝减少
   end
   cpp=site;
end

return

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -