Matlab处理数据导出Paraview可读的vtk文件(一)

Paraview是一个开源的可视化软件。

用到matlab子程序从这里下载

或者到博客末尾复制粘贴

子程序名为 vtkwrite

示例1:

1 load mri  
2 D = squeeze(D);  
3 vtkwrite('mri.vtk', 'structured_points', 'mri', D) 

 

 

示例2:云图

1 load wind   
2 [cu,cv,cw] = curl(x, y, z, u, v, w);       
3 div = divergence(x, y, z, u, v, w);     
4 vtkwrite('wind.vtk', 'structured_grid', x, y, z, ...   
5 'vectors', 'vector_field', u, v, w, 'vectors', 'vorticity', cu, cv, cw, 'scalars', 'divergence', div);

示例3:二维曲线

1 x = 1:100; 
2 y = sin(x); 
3 z = sqrt(x);     
4 vtkwrite('execute','polydata','lines',x,y,z); 

示例4:三角形

1 [x,y,z] = peaks(100);     
2 z = .4*z;     
3 tri = delaunay(x,y);     
4 vtkwrite('peaks.vtk','polydata','triangle',x,y,z,tri); 

 

 示例5:四面体

1 d = [-1 1];     
2 [x, y, z] = meshgrid(d, d, d);     
3 DT = delaunayTriangulation(x(:), y(:), z(:));     
4 vtkwrite('execute', 'polydata','tetrahedron', x, y, z, DT.ConnectivityList);  

 

 

vtkwrite

  1 function vtkwrite( filename,dataType,varargin )
  2 % VTKWRITE Writes 3D Matlab array into VTK file format.
  3 %  vtkwrite(filename,'structured_grid',x,y,z,'vectors',title,u,v,w) writes
  4 %  a structured 3D vector data into VTK file, with name specified by the string
  5 %  filename. (u,v,w) are the vector components at the points (x,y,z). x,y,z
  6 %  should be 3-D matrices like those generated by meshgrid, where
  7 %  point(ijk) is specified by x(i,j,k), y(i,j,k) and z(i,j,k).
  8 %  The matrices x,y,z,u,v,w must all be the same size and contain
  9 %  corrresponding position and vector component. The string title specifies
 10 %  the name of the vector field to be saved. 
 11 %
 12 %  vtkwrite(filename,'structured_grid',x,y,z,'scalars',title,r) writes a 3D
 13 %  scalar data into VTK file whose name is specified by the string
 14 %  filename. r is the scalar value at the points (x,y,z). The matrices
 15 %  x,y,z,r must all be the same size and contain the corresponding position
 16 %  and scalar values. 
 17 %
 18 %  vtkwrite(filename,'structured_grid',x,y,z,'vectors',title,u,v,w,'scalars',
 19 %  title2,r) writes a 3D structured grid that contains both vector and scalar values.
 20 %  x,y,z,u,v,w,r must all be the same size and contain the corresponding
 21 %  positon, vector and scalar values.
 22 %
 23 %  vtkwrite(filename, 'structured_points', title, m) saves matrix m (could
 24 %  be 1D, 2D or 3D array) into vtk as structured points.
 25 %
 26 %  vtkwrite(filename, 'structured_points', title, m, 'spacing', sx, sy, sz)
 27 %  allows user to specify spacing. (default: 1, 1, 1). This is the aspect
 28 %  ratio of a single voxel. 
 29 %
 30 %  vtkwrite(filename, 'structured_points', title, m, 'origin', ox, oy, oz)
 31 %  allows user to speicify origin of dataset. (default: 0, 0, 0).
 32 %
 33 %  vtkwrite(filename,'unstructured_grid',x,y,z,'vectors',title,u,v,w,'scalars',
 34 %  title2,r) writes a 3D unstructured grid that contains both vector and scalar values.
 35 %  x,y,z,u,v,w,r must all be the same size and contain the corresponding
 36 %  positon, vector and scalar values.
 37 %  
 38 %  vtkwrite(filename, 'polydata', 'lines', x, y, z) exports a 3D line where
 39 %  x,y,z are coordinates of the points that make the line. x, y, z are
 40 %  vectors containing the coordinates of points of the line, where point(n)
 41 %  is specified by x(n), y(n) and z(n).
 42 %
 43 %  vtkwrite(filename,'polydata','lines',x,y,z,'Precision',n) allows you to
 44 %  specify precision of the exported number up to n digits after decimal
 45 %  point. Default precision is 3 digits. 
 46 %
 47 %  vtkwrite(filename,'polydata','triangle',x,y,z,tri) exports a list of
 48 %  triangles where x,y,z are the coordinates of the points and tri is an
 49 %  m*3 matrix whose rows denote the points of the individual triangles.
 50 %
 51 %  vtkwrite(filename,'polydata','tetrahedron',x,y,z,tetra) exports a list
 52 %  of tetrahedrons where x,y,z are the coordinates of the points
 53 %  and tetra is an m*4 matrix whose rows denote the points of individual
 54 %  tetrahedrons. 
 55 %  
 56 %  vtkwrite('execute','polydata','lines',x,y,z) will save data with default
 57 %  filename ''matlab_export.vtk' and automatically loads data into
 58 %  ParaView. 
 59 %  
 60 %  Version 2.3
 61 %  Copyright, Chaoyuan Yeh, 2016
 62 %  Codes are modified from William Thielicke and David Gingras's submission.    
 63 
 64 if strcmpi(filename,'execute'), filename = 'matlab_export.vtk'; end
 65 fid = fopen(filename, 'w'); 
 66 % VTK files contain five major parts
 67 % 1. VTK DataFile Version
 68 fprintf(fid, '# vtk DataFile Version 2.0\n');
 69 % 2. Title
 70 fprintf(fid, 'VTK from Matlab\n');
 71 
 72 
 73 binaryflag = any(strcmpi(varargin, 'BINARY'));
 74 if any(strcmpi(varargin, 'PRECISION'))
 75     precision = num2str(varargin{find(strcmpi(vin, 'PRECISION'))+1});
 76 else
 77     precision = '2';
 78 end
 79 
 80 switch upper(dataType)
 81     case 'STRUCTURED_POINTS'
 82         title = varargin{1};
 83         m = varargin{2};
 84         if any(strcmpi(varargin, 'spacing'))
 85             sx = varargin{find(strcmpi(varargin, 'spacing'))+1};
 86             sy = varargin{find(strcmpi(varargin, 'spacing'))+2};
 87             sz = varargin{find(strcmpi(varargin, 'spacing'))+3};
 88         else
 89             sx = 1;
 90             sy = 1;
 91             sz = 1;
 92         end
 93         if any(strcmpi(varargin, 'origin'))
 94             ox = varargin{find(strcmpi(varargin, 'origin'))+1};
 95             oy = varargin{find(strcmpi(varargin, 'origin'))+2};
 96             oz = varargin{find(strcmpi(varargin, 'origin'))+3};
 97         else
 98             ox = 0;
 99             oy = 0;
100             oz = 0;
101         end
102         [nx, ny, nz] = size(m);
103         setdataformat(fid, binaryflag);
104         
105         fprintf(fid, 'DATASET STRUCTURED_POINTS\n');
106         fprintf(fid, 'DIMENSIONS %d %d %d\n', nx, ny, nz);
107         fprintf(fid, ['SPACING ', num2str(sx), ' ', num2str(sy), ' ',...
108             num2str(sz), '\n']);
109         fprintf(fid, ['ORIGIN ', num2str(ox), ' ', num2str(oy), ' ',...
110             num2str(oz), '\n']); 
111         fprintf(fid, 'POINT_DATA %d\n', nx*ny*nz);
112         fprintf(fid, ['SCALARS ', title, ' float 1\n']);
113         fprintf(fid,'LOOKUP_TABLE default\n');
114         if ~binaryflag 
115             spec = ['%0.', precision, 'f '];
116             fprintf(fid, spec, m(:)');
117         else
118             fwrite(fid, m(:)', 'float', 'b');
119         end
120         
121     case {'STRUCTURED_GRID','UNSTRUCTURED_GRID'}
122         % 3. The format data proper is saved in (ASCII or Binary). Use
123         % fprintf to write data in the case of ASCII and fwrite for binary.
124         if numel(varargin)<6, error('Not enough input arguments'); end
125         setdataformat(fid, binaryflag);
126 %         fprintf(fid, 'BINARY\n');
127         x = varargin{1};
128         y = varargin{2};
129         z = varargin{3};
130         if sum(size(x)==size(y) & size(y)==size(z))~=length(size(x))
131             error('Input dimesions do not match')
132         end
133         n_elements = numel(x);
134         % 4. Type of Dataset ( can be STRUCTURED_POINTS, STRUCTURED_GRID,
135         % UNSTRUCTURED_GRID, POLYDATA, RECTILINEAR_GRID or FIELD )
136         % This part, dataset structure, begins with a line containing the
137         % keyword 'DATASET' followed by a keyword describing the type of dataset.
138         % Then the geomettry part describes geometry and topology of the dataset.
139         if strcmpi(dataType,'STRUCTURED_GRID')
140             fprintf(fid, 'DATASET STRUCTURED_GRID\n');
141             fprintf(fid, 'DIMENSIONS %d %d %d\n', size(x,1), size(x,2), size(x,3));
142         else
143             fprintf(fid, 'DATASET UNSTRUCTURED_GRID\n');
144         end
145         fprintf(fid, ['POINTS ' num2str(n_elements) ' float\n']);
146         output = [x(:)'; y(:)'; z(:)'];
147         
148         if ~binaryflag
149             spec = ['%0.', precision, 'f '];
150             fprintf(fid, spec, output);
151         else
152             fwrite(fid, output, 'float', 'b');
153         end
154         % 5.This final part describe the dataset attributes and begins with the
155         % keywords 'POINT_DATA' or 'CELL_DATA', followed by an integer number
156         % specifying the number of points of cells. Other keyword/data combination
157         % then define the actual dataset attribute values.
158         fprintf(fid, ['\nPOINT_DATA ' num2str(n_elements)]);
159         % Parse remaining argument.
160         vidx = find(strcmpi(varargin,'VECTORS'));
161         sidx = find(strcmpi(varargin,'SCALARS'));
162         if vidx~=0
163             for ii = 1:length(vidx)
164                 title = varargin{vidx(ii)+1};
165                 % Data enteries begin with a keyword specifying data type
166                 % and numeric format.
167                 fprintf(fid, ['\nVECTORS ', title,' float\n']);
168                 output = [varargin{ vidx(ii) + 2 }(:)';...
169                           varargin{ vidx(ii) + 3 }(:)';...
170                           varargin{ vidx(ii) + 4 }(:)'];
171 
172                 if ~binaryflag
173                     spec = ['%0.', precision, 'f '];
174                     fprintf(fid, spec, output);
175                 else
176                     fwrite(fid, output, 'float', 'b');
177                 end
178 %                 fwrite(fid, [reshape(varargin{vidx(ii)+2},1,n_elements);...
179 %                 reshape(varargin{vidx(ii)+3},1,n_elements);...
180 %                 reshape(varargin{vidx(ii)+4},1,n_elements)],'float','b');
181             end
182         end
183         if sidx~=0
184             for ii = 1:length(sidx)
185                 title = varargin{sidx(ii)+1};
186                 fprintf(fid, ['\nSCALARS ', title,' float\n']);
187                 fprintf(fid, 'LOOKUP_TABLE default\n');
188                 if ~binaryflag
189                     spec = ['%0.', precision, 'f '];
190                     fprintf(fid, spec, varargin{ sidx(ii) + 2});
191                 else
192                     fwrite(fid, varargin{ sidx(ii) + 2}, 'float', 'b');
193                 end
194 %                 fwrite(fid, reshape(varargin{sidx(ii)+2},1,n_elements),'float','b');
195             end
196         end
197         
198     case 'POLYDATA'
199 
200         fprintf(fid, 'ASCII\n');
201         if numel(varargin)<4, error('Not enough input arguments'); end
202         x = varargin{2}(:);
203         y = varargin{3}(:);
204         z = varargin{4}(:);
205         if numel(varargin)<4, error('Not enough input arguments'); end
206         if sum(size(x)==size(y) & size(y)==size(z))~= length(size(x))
207             error('Input dimesions do not match')
208         end
209         n_elements = numel(x);
210         fprintf(fid, 'DATASET POLYDATA\n');
211         if mod(n_elements,3)==1
212             x(n_elements+1:n_elements+2,1)=[0;0];
213             y(n_elements+1:n_elements+2,1)=[0;0];
214             z(n_elements+1:n_elements+2,1)=[0;0];
215         elseif mod(n_elements,3)==2
216             x(n_elements+1,1)=0;
217             y(n_elements+1,1)=0;
218             z(n_elements+1,1)=0;
219         end
220         nbpoint = numel(x);
221         fprintf(fid, ['POINTS ' num2str(nbpoint) ' float\n']);
222         
223         spec = [repmat(['%0.', precision, 'f '], 1, 9), '\n'];
224         
225         output = [x(1:3:end-2), y(1:3:end-2), z(1:3:end-2),...
226                   x(2:3:end-1), y(2:3:end-1), z(2:3:end-1),...
227                   x(3:3:end), y(3:3:end), z(3:3:end)]';
228               
229         fprintf(fid, spec, output);
230         
231         switch upper(varargin{1})
232             case 'LINES'
233                 if mod(n_elements,2)==0
234                     nbLine = 2*n_elements-2;
235                 else
236                     nbLine = 2*(n_elements-1);
237                 end
238                 conn1 = zeros(nbLine,1);
239                 conn2 = zeros(nbLine,1);
240                 conn2(1:nbLine/2) = 1:nbLine/2;
241                 conn1(1:nbLine/2) = conn2(1:nbLine/2)-1;
242                 conn1(nbLine/2+1:end) = 1:nbLine/2;
243                 conn2(nbLine/2+1:end) = conn1(nbLine/2+1:end)-1;
244                 fprintf(fid,'\nLINES %d %d\n',nbLine,3*nbLine);
245                 fprintf(fid,'2 %d %d\n',[conn1';conn2']);
246             case 'TRIANGLE'
247                 ntri = length(varargin{5});
248                 fprintf(fid,'\nPOLYGONS %d %d\n',ntri,4*ntri);
249                 fprintf(fid,'3 %d %d %d\n',(varargin{5}-1)');
250             case 'TETRAHEDRON'
251                 ntetra = length(varargin{5});
252                 fprintf(fid,'\nPOLYGONS %d %d\n',ntetra,5*ntetra);
253                 fprintf(fid,'4 %d %d %d %d\n',(varargin{5}-1)');
254         end     
255 end
256 fclose(fid);
257 if strcmpi(filename,'matlab_export.vtk')
258     switch computer
259         case {'PCWIN','PCWIN64'}
260             !paraview.exe --data='matlab_export.vtk' &
261             % Exclamation point character is a shell escape, the rest of the
262             % input line will be sent to operating system. It can not take
263             % variables, though. The & at the end of line will return control to 
264             % Matlab even when the outside process is still running. 
265         case {'GLNXA64','MACI64'}
266             !paraview --data='matlab_export.vtk' &
267     end
268 end
269 end
270 
271 function setdataformat(fid, binaryflag)
272 
273 if ~binaryflag
274     fprintf(fid, 'ASCII\n');
275 else
276     fprintf(fid, 'BINARY\n');
277 end
278 end

 

 

posted @ 2019-04-12 16:22  大蓝鲸  阅读(9881)  评论(2编辑  收藏  举报