📄 vis_updt.m
字号:
% Update positions of visualisation nodes
function Gcs = Vis_updt(Gcs)
d = 0.1; % radius of discs
ka=0.1; % attraction constant
kr=0.05; % repulsion coefficient
kipr = 0;%0.005; % coeff for ip space distance repulsive force - 0.015 generally works well
for visiter=1:10
totalipl=0; % total ip distances
totalvisl = 0; % vis total dis
delta = zeros(size(Gcs.wvis));
deltakipr = zeros(size(Gcs.wvis));
visdist = zeros(size(Gcs.C));
ipdist = zeros(size(Gcs.C));
for i=1:(size(Gcs.wvis,1)-1) % for each node
for j=i+1:size(Gcs.wvis,1) % consider all subsequent nodes
e = norm(Gcs.wvis(i,:)-Gcs.wvis(j,:),2);
visdist(i,j) = e;
visdist(j,i) = e;
totalvisl = totalvisl+e;
if e>d % not touching
if Gcs.C(i,j) % if connected calculate attraction
delta(i,:) = delta(i,:)+(e-d)*ka*(Gcs.wvis(j,:)-Gcs.wvis(i,:))./e;
delta(j,:) = delta(j,:)+(e-d)*ka*(Gcs.wvis(i,:)-Gcs.wvis(j,:))./e;
end
end
if e<=3*d & e >2*d % close enough to repel
delta(i,:) = delta(i,:) + 0.2*kr* (Gcs.wvis(i,:)-Gcs.wvis(j,:))./e;
delta(j,:) = delta(j,:) + 0.2*kr* (Gcs.wvis(j,:)-Gcs.wvis(i,:))./e;
elseif e<=2*d & e>d
delta(i,:) = delta(i,:) + 0.5*kr* (Gcs.wvis(i,:)-Gcs.wvis(j,:))./e;
delta(j,:) = delta(j,:) + 0.5*kr* (Gcs.wvis(j,:)-Gcs.wvis(i,:))./e;
elseif e<d
delta(i,:) = delta(i,:) + kr* (Gcs.wvis(i,:)-Gcs.wvis(j,:))./e;
delta(j,:) = delta(j,:) + kr* (Gcs.wvis(j,:)-Gcs.wvis(i,:))./e;
end
% Extra experimental repulsion force based on real link length in ip space
ipdis = norm(Gcs.w(i,:)-Gcs.w(j,:),Gcs.metric); % use metric set by user since this is an actual measurement in ip space
totalipl = totalipl+ipdis;
% simple model
%deltakipr(i,:) = deltakipr(i,:) + kipr* (Gcs.wvis(i,:)-Gcs.wvis(j,:));
%deltakipr(j,:) = deltakipr(j,:) + kipr* (Gcs.wvis(j,:)-Gcs.wvis(i,:));
% push-pull model
ipdist(i,j) = ipdis;
ipdist(j,i) = ipdis;
end
end
Gcs.wvis = Gcs.wvis+delta;
% simple model
%deltakipr = deltakipr./(totalipl/size(Gcs.C,1)); % normalise ip dist repulsive force
%deltakipr = (deltakipr-(totalipl/size(Gcs.C,1)))
% push-pull model
meanvis = totalvisl./(size(Gcs.C,1).^2-size(Gcs.C,1)); % -size(Gcs.C,1) => do not count links to self!
meanip = totalipl./(size(Gcs.C,1).^2-size(Gcs.C,1));
for i=1:(size(Gcs.wvis,1)-1)
for j=i+1:size(Gcs.wvis,1)
deltakipr(i,:) = deltakipr(i,:) + kipr.*( (ipdist(i,j)./meanip)-(visdist(i,j)./meanvis) ) .*( (Gcs.wvis(i,:)-Gcs.wvis(j,:))./visdist(i,j) );
deltakipr(j,:) = deltakipr(j,:) + kipr.*( (ipdist(j,i)./meanip)-(visdist(j,i)./meanvis) ) .*( (Gcs.wvis(j,:)-Gcs.wvis(i,:))./visdist(j,i));
end
end
Gcs.wvis = Gcs.wvis+deltakipr;
end;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -