www.pudn.com > projective-and-affine.rar > getHalfDino.m


function [v, f] = getHalfDino(CHATTY)
%% [verts, faces] = getHalfDino(CHATTY)
%% If CHATTY (default FALSE) then do display
FALSE = 0==1;
TRUE = ~FALSE;

if nargin == 0
  CHATTY = 0;
end


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%% Read and display Dino data set
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
dinoData;

if CHATTY
  lines = showWire(verts,faces,1);
  title('Full Dino Data Set');
  fprintf(2,'Rotate this figure.\n');
  fprintf(2,'Press any key to continue...');
  pause; fprintf(2,'ok\n');
end

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%% Extract one side of Dino in principal coordinates
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Find Dino's principal axes
mn = sum(verts,1)/size(verts,1);
[U S V] = svd(verts - repmat(mn,size(verts,1),1), 0); 
S = diag(S);

%% Expect third axis to be the lateral direction.
%% Remove vertices with z < 0
id = U(:,2) < -0.001; 

%% Compute vertices in principal axes. 
v = U(~id, :)*diag(S);

%% Relabel the remaining vertices
relabel = zeros(size(verts,1),1);
relabel(~id) = 1:sum(~id);

%% Write the faces in terms of the relabelled vertices
f={}; j=0;
for k = 1:length(faces)
  if ~any(id(faces{k}))
    j = j+1;
    f{j} = relabel(faces{k})';
  end
end

if CHATTY
  l = showWire(v,f,1);
  title('One Sided Dino Data Set');
  fprintf(2,'Rotate this figure.\n');
  fprintf(2,'Press any key to continue...');
  pause; fprintf(2,'ok\n');

  %%%%% Show Dino as a surface plot
  figure(3); clf;
  for k = 1:length(f)
    vf = v(f{k},:);
    patch(vf(:,1), vf(:,2), vf(:,3), vf(:,2));
  end
  set(gca,'YDir', 'reverse');
  axis vis3d; axis square; axis equal;
  title('One Sided Dino Data Set');
  fprintf(2,'Rotate this figure.\n');
  fprintf(2,'Press any key to continue...');
  pause;
  fprintf(2,'ok\n');

end
return;