Mercurial > hg > camir-aes2014
diff toolboxes/graph_visualisation/graphViz4Matlab/layouts/Gridlayout.m @ 0:e9a9cd732c1e tip
first hg version after svn
author | wolffd |
---|---|
date | Tue, 10 Feb 2015 15:05:51 +0000 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/toolboxes/graph_visualisation/graphViz4Matlab/layouts/Gridlayout.m Tue Feb 10 15:05:51 2015 +0000 @@ -0,0 +1,80 @@ +classdef Gridlayout < Abstractlayout +% Provides a simple, (naive) grid layout for Graphlayout. +% An uninitialized instance can be created to pass to the GraphLayout +% constructor by just calling Gridlayout without any parameters, e.g. +% Graphlayout('-adjMat',[0 1; 0 0], '-layout',Gridlayout); +% +% Matthew Dunham +% University of British Columbia +% http://www.cs.ubc.ca/~mdunham/ + + properties + xmin; % The left most point on the graph axis in data units + xmax; % The right most point on the graph axis in data units + ymin; % The bottom most point on the graph axis in data units + ymax; % The top most point on the graph axis in data units + adjMatrix; % The adjacency matrix + maxNodeSize; % The maximum diameter of a node in data units + image; % An image for the button that will lanuch this layout + name; % A unique name for instances of this class + shortDescription; % A description for use in the tooltips + nodeSize; % The calculated node size, call dolayout() before accessing + centers; % The calculated node centers in an n-by-2 matrix + end + + methods + function obj = Gridlayout(name) + + % constructor + if(nargin < 1) + obj.name = 'Gridlayout'; + else + obj.name = name; + end + load glicons; + obj.image = icons.grid; + obj.shortDescription = 'Grid Layout'; + end + + end + + + methods(Access = 'protected') + + function calcLayout(obj) + + nnodes = size(obj.adjMatrix,1); + obj.centers = zeros(nnodes,2); + xspacePerNode = (obj.xmax - obj.xmin)/ceil(sqrt(nnodes)); + yspacePerNode = (obj.ymax - obj.ymin)/ceil(sqrt(nnodes)); + obj.nodeSize = min(min([xspacePerNode,yspacePerNode]./2),obj.maxNodeSize); + xstart = obj.xmin + (xspacePerNode)/2; + ystart = obj.ymin + (yspacePerNode)/2; + counter = 1; + for ypos=1:ceil(sqrt(nnodes)) + if(counter > nnodes),break,end + for xpos=1:ceil(sqrt(nnodes)) + obj.centers(counter,1) = xstart + (xpos-1)*xspacePerNode; + obj.centers(counter,2) = ystart + (ypos-1)*yspacePerNode; + positions(ypos,xpos) = counter; %#ok + counter = counter + 1; + end + end + + %swap out the center node for the node with the most edges, + %(total of in and out). + edgeCounts = sum(obj.adjMatrix,1)' + sum(obj.adjMatrix,2); + [vals ndx] = sort(edgeCounts,'descend'); + c = positions(ceil(size(positions,1)/2),ceil(size(positions,2)/2)); + if(c ~= 0) + store = obj.centers(c,:); + obj.centers(c,:) = obj.centers(ndx(1),:); + obj.centers(ndx(1),:) = store; + end + + end + + + end + +end \ No newline at end of file