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