[Master Index] [Index for Toolbox]

plot_patch

(Toolbox/plot_patch.m in BrainStorm 2.0 (Alpha))


Function Synopsis

plot_patch(FV,varargin);

Help Text

PLOT_PATCH - plots a vertex or face and its neighbors
 function plot_patch(FV,varargin);
 The arguments should be entered in pairs of:
   'faces',indices,
   'vertices',indices,
   'figure', handle,
   'all', ignore

 If 'faces', then each face in the index is painted green with its immediate
 face neighbors.
 If 'vertices', then each vertex in the index is marked green with its
   immediate face neighbors.
 if 'figure', then the figure handle is used, otherwise a new one is made.
 If 'all', then the entire FV is displayed as a semitransparent gray
   background, and indices are ignored
 
 See also TESSELLATION_STATS

Listing of function C:\BrainStorm_2001\Toolbox\plot_patch.m

function plot_patch(FV,varargin);
%PLOT_PATCH - plots a vertex or face and its neighbors
% function plot_patch(FV,varargin);
% The arguments should be entered in pairs of:
%   'faces',indices,
%   'vertices',indices,
%   'figure', handle,
%   'all', ignore
%
% If 'faces', then each face in the index is painted green with its immediate
% face neighbors.
% If 'vertices', then each vertex in the index is marked green with its
%   immediate face neighbors.
% if 'figure', then the figure handle is used, otherwise a new one is made.
% If 'all', then the entire FV is displayed as a semitransparent gray
%   background, and indices are ignored
% 
% See also TESSELLATION_STATS

%<autobegin> ---------------------- 26-May-2004 11:34:08 -----------------------
% --------- Automatically Generated Comments Block Using AUTO_COMMENTS ---------
%
% CATEGORY: Visualization
%
% At Check-in: $Author: Mosher $  $Revision: 6 $  $Date: 5/26/04 10:02a $
%
% This software is part of BrainStorm Toolbox Version 2.0 (Alpha) 24-May-2004
% 
% Principal Investigators and Developers:
% ** Richard M. Leahy, PhD, Signal & Image Processing Institute,
%    University of Southern California, Los Angeles, CA
% ** John C. Mosher, PhD, Biophysics Group,
%    Los Alamos National Laboratory, Los Alamos, NM
% ** Sylvain Baillet, PhD, Cognitive Neuroscience & Brain Imaging Laboratory,
%    CNRS, Hopital de la Salpetriere, Paris, France
% 
% See BrainStorm website at http://neuroimage.usc.edu for further information.
% 
% Copyright (c) 2004 BrainStorm by the University of Southern California
% This software distributed  under the terms of the GNU General Public License
% as published by the Free Software Foundation. Further details on the GPL
% license can be found at http://www.gnu.org/copyleft/gpl.html .
% 
% FOR RESEARCH PURPOSES ONLY. THE SOFTWARE IS PROVIDED "AS IS," AND THE
% UNIVERSITY OF SOUTHERN CALIFORNIA AND ITS COLLABORATORS DO NOT MAKE ANY
% WARRANTY, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO WARRANTIES OF
% MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, NOR DO THEY ASSUME ANY
% LIABILITY OR RESPONSIBILITY FOR THE USE OF THIS SOFTWARE.
%<autoend> ------------------------ 26-May-2004 11:34:08 -----------------------

% ----------------------------- Script History ---------------------------------
% JCM 15-May-2004 Creation
% ----------------------------- Script History ---------------------------------



METHODS = varargin(1:2:end);
Indices = varargin(2:2:end);


% first calculate what faces go with which vertex

numTri = size(FV.faces,1); % number of faces
numVert = size(FV.vertices,1); % number of vertices

[VertexNumbering,I] = sort(FV.faces(:)); % sorted Vertex numbers

FacesNumbering = rem(I-1,numTri)+1; % triangle number for each Vertex

% For the ith vertex, then FacesNumbering(VertexNumbering == i) returns the indices of the
%  polygons attached to the ith vertex.
%
% For the set of vertices in the row vector sv (e.g sv = [3 5 115 121]), then use
%  [i,ignore] = find(VertexNumbering(:,ones(1,length(sv))) == (ones(size(VertexNumbering,1),1)*sv));
%  (compares the Vertex numbers to the indices, extracts the row indices into i)
%  then FacesNumbering(i) returns the indices. Apply unique to clean up.

% So now we know what faces are connected to each vertex


% --------------------------- Triangle Statistics ------------------------------
% calculate the area and normals for each triangle

Vertices = FV.vertices(FV.faces',:);
% each set of three rows of Vertices is one triangle

% now difference them to get the vectors on two sides
dVertices = diff(Vertices);
dVertices(3:3:end,:) = []; % remove the transition between triangles

% now each pair of rows in dVertices represents each triangle
% row 1 is vector from 1 to 2
% row 2 is vector from 2 to 3

% v1 = dVertices(1:2:end,:)'; % each column is side one of a triangle
% v2 = dVertices(2:2:end,:)'; % side two

% right-hand rule, counter-clockwise ordering of the triangle yields a positive
% upward area and normal.
% Call a fast subfunction of this function:
WeightedNormals = cross(dVertices(1:2:end,:)',dVertices(2:2:end,:)')/2; 
% each column is the normal for each triangle
% the length the vector gives the area

FaceArea = sqrt(sum(WeightedNormals .* WeightedNormals)); % the area
FaceNormal = WeightedNormals ./ (FaceArea([1 1 1],:)); % normalize them

% now calculate the centers of each triangle
FaceCenter = cumsum(Vertices);
FaceCenter = FaceCenter(3:3:end,:); % every third summation for every triangle
FaceCenter = diff([0 0 0;FaceCenter])'/3; % average of each summation
% each column is the mean of the vertices of the triangles
% so now we know the center, area, and the normal vector of each triangle


ih = find(strcmp('figure',varargin));
if ~isempty(ih),
   hf = figure(varargin{ih+1});
else
   hf = figure; % open new figure
end

hold on

for imethod = 1:length(METHODS),
   
   switch lower(METHODS{imethod})
      case 'faces'
         
         iFace = FV.faces([Indices{imethod}],:);
         iFace = iFace(:)'; % ensure row vector
         
         % get the faces attached to these vertices
         % For the set of vertices in the row vector sv (e.g sv = [3 5 115 121]), then
         % use
         %  [i,ignore] = find(VertexNumbering(:,ones(1,length(sv))) == (ones(size(VertexNumbering,1),1)*sv));
         %  (compares the Vertex numbers to the indices, extracts the row indices into i)
         %  then FacesNumbering(i) returns the indices.
         
         [fndx, ignore] = find(VertexNumbering(:,ones(1,length(iFace))) == (ones(size(VertexNumbering,1),1)*iFace));
         fndx = FacesNumbering(fndx); % the faces attached to these vertices
         fndx = unique(fndx); % ensure unique
         nifndx = fndx(:)';
         nifndx(intersect(nifndx,iFace)) = []; % remove the ith face
         
         % not the ith face
         h = patch('vertices',FV.vertices,'faces',FV.faces(nifndx,:),'facecolor','r','edgecolor','k');
         % the ith face
         hi = patch('vertices',FV.vertices,'faces',FV.faces([Indices{imethod}],:),'facecolor','g');
         plot3(FaceCenter(1,fndx),FaceCenter(2,fndx),FaceCenter(3,fndx),'*')
         quiver3(FaceCenter(1,fndx),FaceCenter(2,fndx),FaceCenter(3,fndx),...
            FaceNormal(1,fndx),FaceNormal(2,fndx),FaceNormal(3,fndx),0.25);
         set(h,'FaceAlpha',.8)
         
      case 'vertices'
         % plot each vertex with a green point and the immediate faces around it
         
         % get the vertices
         iVert = [Indices{imethod}];
         [fndx, ignore] = find(VertexNumbering(:,ones(1,length(iVert))) == (ones(size(VertexNumbering,1),1)*iVert));
         fndx = FacesNumbering(fndx); % the faces attached to these vertices
         fndx = unique(fndx); % ensure unique
         
         h = patch('vertices',FV.vertices,'faces',FV.faces(fndx,:),'facecolor','r','edgecolor','k');
         hold on
         plot3(FaceCenter(1,fndx),FaceCenter(2,fndx),FaceCenter(3,fndx),'*');
         plot3(FV.vertices(iVert,1),FV.vertices(iVert,2),FV.vertices(iVert,3),'g+');
         ma = mean(FaceArea(fndx)); % mean area
         quiver3(FaceCenter(1,fndx),FaceCenter(2,fndx),FaceCenter(3,fndx),...
            FaceNormal(1,fndx),FaceNormal(2,fndx),FaceNormal(3,fndx),.25);
         set(h,'FaceAlpha',.8)
         
      case 'all'
         h = patch(FV,...
            'facecolor', [.9 .9 .9],'edgecolor',[.8 .8 .8]);
         set(h,'facealpha',.5,'edgealpha',.5);
      otherwise
         % unknown method
   end
end

axis equal
axis vis3d

hold off
cameratoolbar('Show'); % activate the camera toolbar
ret = cameratoolbar; % for strange reason, this activates the default orbit mode.
drawnow

Produced by color_mat2html, a customized BrainStorm 2.0 (Alpha) version of mat2html on Tue Oct 12 12:05:14 2004
Cross-Directory links are: ON