Question:
I have a set of isoline points (or contour points) such as this:
alt text http://www.rcad.eu/triang&isolines%20example1.jpg
Each point on an isoline has its own respective X, Y, and Z coordinate. Since they are isolines, that means that each point will have a unique XY pair, but points on the same line will have the same Z coordinate.
Now, is there any algorithm or any software packages (either in C# or C++ or MATLAB) that I can use to interpolate the isoline points into a full 3D surface?
P/S: I am not just interested in the final output, I am interested in getting the interpolated surface data so that I can plot the surface myself.
Edit: C++ solutions are welcomed as well.
Solution:1
In MATLAB you can use either the function griddata
or the TriScatteredInterp
class (Note: as of R2013a scatteredInterpolant
is the recommended alternative). Both of these allow you to fit a surface of regularlyspaced data to a set of nonuniformlyspaced points (although it appears griddata
is no longer recommended in newer MATLAB versions). Here's how you can use each:

griddata
:[XI,YI,ZI] = griddata(x,y,z,XI,YI)
where
x,y,z
each represent vectors of the cartesian coordinates for each point (in this case the points on the contour lines). The row vectorXI
and column vectorYI
are the cartesian coordinates at whichgriddata
interpolates the valuesZI
of the fitted surface. The new values returned for the matricesXI,YI
are the same as the result of passingXI,YI
tomeshgrid
to create a uniform grid of points. 
TriScatteredInterp
class:[XI,YI] = meshgrid(...); F = TriScatteredInterp(x(:),y(:),z(:)); ZI = F(XI,YI);
where
x,y,z
again represent vectors of the cartesian coordinates for each point, only this time I've used a colon reshaping operation(:)
to ensure that each is a column vector (the required format forTriScatteredInterp
). The interpolantF
is then evaluated using the matricesXI,YI
that you must create usingmeshgrid
.
Example & Comparison
Here's some sample code and the resulting figure it generates for reconstructing a surface from contour data using both methods above. The contour data was generated with the contour
function:
% First plot: subplot(2,2,1); [X,Y,Z] = peaks; % Create a surface surf(X,Y,Z); axis([3 3 3 3 8 9]); title('Original'); % Second plot: subplot(2,2,2); [C,h] = contour(X,Y,Z); % Create the contours title('Contour map'); % Format the coordinate data for the contours: Xc = []; Yc = []; Zc = []; index = 1; while index < size(C,2) Xc = [Xc C(1,(index+1):(index+C(2,index)))]; Yc = [Yc C(2,(index+1):(index+C(2,index)))]; Zc = [Zc C(1,index).*ones(1,C(2,index))]; index = index+1+C(2,index); end % Third plot: subplot(2,2,3); [XI,YI] = meshgrid(linspace(3,3,21)); % Generate a uniform grid ZI = griddata(Xc,Yc,Zc,XI,YI); % Interpolate surface surf(XI,YI,ZI); axis([3 3 3 3 8 9]); title('GRIDDATA reconstruction'); % Fourth plot: subplot(2,2,4); F = TriScatteredInterp(Xc(:),Yc(:),Zc(:)); % Generate interpolant ZIF = F(XI,YI); % Evaluate interpolant surf(XI,YI,ZIF); axis([3 3 3 3 8 9]); title('TriScatteredInterp reconstruction');
Notice that there is little difference between the two results (at least at this scale). Also notice that the interpolated surfaces have empty regions near the corners due to the sparsity of contour data at those points.
Solution:2
You can use the gridfit tool, found on the MATLAB Central file exchange. One of the examples I give is exactly what you want to do, starting from a list of points taken from isolines, I reconstruct a smooth surface from the data. In fact, the example I used was taken from a topographic map.
Solution:3
I think what you want is called "Contour stitching", for example discussed in this paper
Solution:4
MATLAB has a builtin command called SURF that takes three arrays for X,Y,Z and plots a surface. It might be what you're looking for.
Note:If u also have question or solution just comment us below or mail us on toontricks1994@gmail.com
EmoticonEmoticon