[Master Index]
[Index for PublicToolbox/Sphere_Tessellation]
mesh_refine_tri6
(PublicToolbox/Sphere_Tessellation/mesh_refine_tri6.m in BrainStorm 2.0 (Alpha))
Function Synopsis
[ FV ] = mesh_refine_tri6(FV)
Help Text
mesh_refine_tri6 - creates 6 smaller triangles from a triangle mesh
[ FV ] = mesh_refine_tri6( FV )
FV.vertices is vertices (Nx3 matrix)
FV.faces is faces with indices into rows of V (Mx3 matrix)
For each face of F, 4 new vertices are created at the
triangle edge midpoints and the triangle centroid. Each
face is divided into 6 faces and returned in FV.faces.
B
/+\
/ + \
a/__X__\b Construct new triangles
/ +|+ \ [A,a,X], [A,X,c]
/ + | + \ [B,X,a], [B,b,X]
/+___ | ___+\ [C,X,b], [C,c,X]
A c C
It is assumed that the vertices are listed in clockwise order in
FV.faces (A,B,C above), as viewed from the outside in a RHS coordinate
system.
See also: mesh_refine, mesh_refine_tri4,
sphere_tri, sphere_project
Cross-Reference Information
This function is called by
- mesh_refine C:\BrainStorm_2001\PublicToolbox\Sphere_Tessellation\mesh_refine.m
Listing of function C:\BrainStorm_2001\PublicToolbox\Sphere_Tessellation\mesh_refine_tri6.m
function [ FV ] = mesh_refine_tri6(FV)
% mesh_refine_tri6 - creates 6 smaller triangles from a triangle mesh
%
% [ FV ] = mesh_refine_tri6( FV )
%
% FV.vertices is vertices (Nx3 matrix)
% FV.faces is faces with indices into rows of V (Mx3 matrix)
%
% For each face of F, 4 new vertices are created at the
% triangle edge midpoints and the triangle centroid. Each
% face is divided into 6 faces and returned in FV.faces.
%
% B
% /+\
% / + \
% a/__X__\b Construct new triangles
% / +|+ \ [A,a,X], [A,X,c]
% / + | + \ [B,X,a], [B,b,X]
% /+___ | ___+\ [C,X,b], [C,c,X]
% A c C
%
% It is assumed that the vertices are listed in clockwise order in
% FV.faces (A,B,C above), as viewed from the outside in a RHS coordinate
% system.
%
% See also: mesh_refine, mesh_refine_tri4,
% sphere_tri, sphere_project
%
% This can be done until some minimal distance (D) of the mean
% distance between vertices of all triangles is achieved. If
% no D argument is given, the function refines the mesh once.
%
% $Revision: 1 $ $Date: 5/20/04 3:58p $
% Licence: GNU GPL, no implied or express warranties
% History: 05/2002, Darren.Weber_at_radiology.ucsf.edu, created
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
tic; fprintf('...refining mesh (tri6)...');
% NOTE
% The centroid is located one third of the way from each vertex to
% the midpoint of the opposite side. Each median divides the triangle
% into two equal areas; all the medians together divide it into six
% equal parts, and the lines from the median point to the vertices
% divide the whole into three equivalent triangles.
% Each input triangle with vertices labelled [A,B,C] as shown
% below will be turned into six new triangles:
%
% Make new midpoints
% a = (A+B)/2
% b = (B+C)/2
% c = (C+A)/2
%
% Make triangle centroid
% X = b + ( (A - b) ./3 );
%
% B
% /+\
% / + \
% a/__X__\b Construct new triangles
% / +|+ \ [A,a,X], [A,X,c]
% / + | + \ [B,X,a], [B,b,X]
% /+___ | ___+\ [C,X,b], [C,c,X]
% A c C
%
% Initialise a new vertices and faces matrix
Nvert = size(FV.vertices,1);
Nface = size(FV.faces,1);
V2 = zeros(Nface*4,3);
F2 = zeros(Nface*6,3);
for f=1:Nface,
% Get the triangle vertex indices
NA = FV.faces(f,1);
NB = FV.faces(f,2);
NC = FV.faces(f,3);
% Get the triangle vertex coordinates
A = FV.vertices(NA,:);
B = FV.vertices(NB,:);
C = FV.vertices(NC,:);
% Now find the midpoint between all vertices
a = (A + B) ./ 2;
b = (B + C) ./ 2;
c = (C + A) ./ 2;
% Now find the centroid length of the medians
X = b + ( (A - b) ./3 );
%Bc = c + ( (B - c) ./3 ); % Bc = X
%Cc = a + ( (C - a) ./3 ); % Cc = X
% Store the midpoint and the centroid vertices,
% checking if vertex already exists
[FV, Na] = mesh_find_vertex(FV,a);
[FV, Nb] = mesh_find_vertex(FV,b);
[FV, Nc] = mesh_find_vertex(FV,c);
[FV, NX] = mesh_find_vertex(FV,X);
% Create new faces with centroid
F2(f*6-5,:) = [NA, Na, NX ];
F2(f*6-4,:) = [NA, NX, Nc ];
F2(f*6-3,:) = [NB, NX, Na ];
F2(f*6-2,:) = [NB, Nb, NX ];
F2(f*6-1,:) = [NC, NX, Nb ];
F2(f*6-0,:) = [NC, Nc, NX ];
%figure; patch('vertices',[A;B;C],'faces',[1 2 3],'facecolor',[.7 .7 .7]); hold on;
%plot3(A(1),A(2),A(3),'ro');
%plot3(b(1),b(2),b(3),'ro');
%plot3(Ac(1),Ac(2),Ac(3),'bo')
%if isequal(r,2), return; end
end
% Replace the faces matrix
FV.faces = F2;
t=toc; fprintf('done (%5.2f sec)\n',t);
return
% Find the length of each median
%A2bLength = sqrt ( sum( (A - b).^2, 2 ) );
%B2cLength = sqrt ( sum( (B - c).^2, 2 ) );
%C2aLength = sqrt ( sum( (C - a).^2, 2 ) );
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function [FV, N] = mesh_find_vertex(FV,vertex)
Vn = size(FV.vertices,1);
Va = repmat(vertex,Vn,1);
Vexist = find( FV.vertices(:,1) == Va(:,1) & ...
FV.vertices(:,2) == Va(:,2) & ...
FV.vertices(:,3) == Va(:,3) );
if Vexist,
if size(Vexist) == [1,1],
N = Vexist;
else,
msg = sprintf('replicated vertices');
error(msg);
end
else
FV.vertices(end+1,:) = vertex;
N = size(FV.vertices,1);
end
return
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