function [nextarray,first,open1,nextlist]=Link(heart,r,x,y,group)
total=[x;y];
[a1,a]=size(total); %所有的点
[b1,b]=size(heart); %汇聚点
jump(1,1)=0;
%group中第n个数的枝节点是2n-1,2n行的数,第一列是汇聚点,第2列数以后是分支点;
%寻找最小值,也就是最靠近原点的值,采用两边向中间靠拢的方法,第一个点
k=b; %k个汇聚点
i=1;
while i<k
s1=heart(1,i)^2+heart(2,i)^2;
s2=heart(1,k)^2+heart(2,k)^2;
if s1>s2
i=i+1;
else
k=k-1;
end
end
site=k; %找出最小值的位置
%找出支节点中最适合做跳转的节点,新想法:中心点
[g1,g]=size(group);
zong=group(2*site-1,1)^2+group(2*site,1)^2; %zong汇聚点到原点的距离
if zong<=r^2
plot([0,heart(1,site)],[0,heart(2,site)],'r-');
end
%open2全都是汇聚节点
count=1; %进入循环前,先赋值count
pp=1; %定义邻接矩阵
%先定义open2,后面再判断;
open2(1,1)=0;
open2(2,1)=0;
open2(3,1)=0;
if zong>r^2
o=1;
%计算第一汇聚点到原点的中心点
kmiddle(1)=heart(1,site)/2;
kmiddle(2)=heart(2,site)/2;
for i=2:g
%判断第一个汇聚点的所有分支点
if group(2*site-1,i)~=0&&group(2*site,i)~=0
add=(group(2*site,i)-kmiddle(2))^2+(group(2*site-1,i)-kmiddle(1))^2;
branchmote(o)=add; %branch分支距离中心点的值,相差越小证明越是在一条直线上
o=o+1;
end
end
[ad1,ad]=size(branchmote); %ad列,代表着ad个分支节点
for i=1:ad
if branchmote(i)==min(branchmote)
t=i; %代表第i个数最靠近中间点
plot([0,group(2*site-1,i+1)],[0,group(2*site,i+1)],'r-');
%open2定义了一个中转节点???
open2(1,count)=group(2*site-1,i+1);
open2(2,count)=group(2*site,i+1);
count=count+1; %count是为了计算另外的中转分支点
%根据中间跳转点,来连接两边,则建立一个跳转矩阵,第一列代表跳转点,后面代表连接的两边主点
jump(1,1)=group(2*site-1,i+1);
jump(2*pp,1)=group(2*site,i+1);
jump(2*pp-1,2)=0; %第一个连接点是原点
jump(2*pp,2)=0;
jump(2*pp-1,3)=group(2*site-1,1);
jump(2*pp,3)=group(2*site,1);
pp=pp+1;
plot([group(2*site-1,i+1),group(2*site-1,1)],[group(2*site,i+1),group(2*site,1)],'r-');
end
end
end %判断第一个主汇点到原点的距离大于r的时候,选择跳转点
heart(3,site)=1;
open(:,1)=heart(:,site); %open已经除掉的点,第一列代表原点,无论距离是否大于r
j=1;
for i=1:b
if heart(3,i)~=1
close(:,j)=heart(:,i); %还没加入的点close,已经作为叶子节点的点是open
j=j+1;
end
end
[a1,a]=size(open);
[b1,b]=size(close);
while b~=0
dist=[];
for i=1:a
for j=1:b
dist(i,j)=sqrt((open(1,i)-close(1,j))^2+(open(2,i)-close(2,j))^2);%计算距离
end
end
mindist=min(min(dist));
for i=1:a
for j=1:b
if dist(i,j)<=r&&dist(i,j)==mindist
plot([open(1,i),close(1,j)],[open(2,i),close(2,j)],'r-');
jump(2*pp-1,1)=open(1,i);
jump(2*pp,1)=open(2,i);
jump(2*pp-1,2)=close(1,j);
jump(2*pp,2)=close(2,j);
pp=pp+1;
open(:,a+1)=close(:,j);
close(:,j)=[]; %因为只有一次符合条件,所以可以直接为空,不会影响循环
else if dist(i,j)>r&&dist(i,j)==mindist
[open2,count,pp,jump]=skip(open,close,i,j,group,open2,count,pp,jump);
open(:,a+1)=close(:,j);
close(:,j)=[]; %因为只有一次符合条件,所以可以直接为空,不会影响循环
end
end
end
end
%下一次循环可以用,同时为了形成判别条件
[a1,a]=size(open);
[b1,b]=size(close);
end %while的循环
%一定要写成num2str(i)才能显示出i
%标注编号
open1=[open open2];
[o,o1]=size(open); %o1代表多少个汇聚主点,o1以后的点都是中间跳转点
[g1,g]=size(open1);
for i=1:g
x=open1(1,i);
y=open1(2,i)-1;
text(x,y,num2str(i),'Color','red','FontWeight','bold');
%表示在[0.5,0.5]的位置上标注数字5
end
o=g;
%定义一个邻接表,第一列代表主点,第二列以后代表与主点相邻的点nextlist
%定义一个邻接矩阵,nextarray(i,j)=1代表i与j相连
[nextarray,first]=nextmote(open1,jump,g);
msgbox('组网成功!')
end