0001 function e=springxy(g)
0002
0003
0004
0005
0006
0007
0008 tic;
0009 n = nv(g);
0010 con = isconnected(g);
0011
0012 if (hasxy(g))
0013 xy0 = getxy(g);
0014 else
0015 xy0 = 5*randn(n,2);
0016 end
0017
0018
0019 opts = optimset('MaxIter', 10*n,'Display', 'final');
0020
0021
0022
0023
0024 [xy,e] = lsqnonlin(@spring_energy_vec, xy0, [], [], opts);
0025
0026
0027 embed(g,xy);
0028 toc;
0029
0030
0031 function e = spring_energy(xy,g)
0032
0033 vec = spring_energy_vec(xy);
0034 e = sum(vec.^2);
0035
0036 end
0037
0038 function evec = spring_energy_vec(xy)
0039
0040 evec = zeros(n,n);
0041
0042 for u=1:n-1
0043 for v=u+1:n
0044 d = norm(xy(u,:)-xy(v,:));
0045 if has(g,u,v)
0046 evec(u,v) = d;
0047 end
0048 if ~con
0049 d = min(d,n/2);
0050 end
0051 evec(v,u) = 1/sqrt(d);
0052 end
0053 end
0054
0055
0056 end
0057
0058
0059 end