How to interpolate between two 3D shapes?
15 views (last 30 days)
Show older comments
I have been struggling to find a method that will allow me to interpolate between two 3D surfaces. Basically, one surface (empty bladder) is totally inside another surface (full bladder) and I want to define surfaces interpolated between these two surfaces. I will really appreciate any guidance.
1 Comment
John Kearns
on 22 Apr 2022
Edited: Bruno Luong
on 22 Apr 2022
Prabhjot,
Did you ever find a way to address this? This concept has recently become useful in my own research and if you have a solution I'd be grateful if you shared your approach.
Cheers
Answers (2)
Kelly Kearney
on 30 Jul 2015
I would convert your surfaces into spherical coordinates with the origin at the center of your two bladder surfaces, then interpolate the surfaces onto the same azimuth/elevation grid. After that you'll have a one-to-one match between the vertices of your surfaces that you can use for interpolation.
Matt Cohen
on 30 Jul 2015
Hi Prabhjot,
I understand that you are trying to define surfaces by interpolating data between two surfaces. I am not sure exactly what form you are using to represent and store your 3D surfaces in MATLAB. I am assuming you are representing these surfaces as some function z = f(x,y) over some grid of XY values.
Let's say we have two surfaces, z1 and z2, defined over XY grids. These two surfaces can be interpolated by smoothing them with some smoothing factor 'a': z3 = a*z1 + (1-a)*z2. The smoothing factor determines how much weight each surface gets when computing the new surface values. Using a range of 'a' values, a set of surfaces can be defined as different interpolations of the original two surfaces.
I have included example code and plots below to show how this can be accomplished using MATLAB. There are two cases to consider here: one where surfaces z1 and z2 are defined over the same XY grid, and one where the XY grid points differ. The "surface" function is being used to produce the surface plots. The resulting plots for each case are displayed below the code. A single smoothing factor (a = 0.3) is being used here.
Case 1: Same XY grid
% Create two initial surfaces (same grid)
[x,y] = meshgrid(-2:0.2:2,-2:0.2:2);
z1 = x.*exp(-x.^2 - y.^2);
z2 = z1 + 1;
figure
h1 = surface(x,y,z1);
hold on
h2 = surface(x,y,z2);
view(3)
% Interpolate between the two surfaces
a = 0.3;
hold on
h3 = surface(x,y,(a*z1+ (1-a)*z2));
Case 2: Different XY grids
% Create two initial surfaces (different grids)
[x1,y1] = meshgrid(-2:0.4:2,-2:0.4:2);
[x2,y2] = meshgrid(-2:0.2:2,-2:0.2:2);
z1 = x1.*exp(-x1.^2 - y1.^2);
z2 = x2.*exp(-x2.^2 - y2.^2) + 1;
figure
h1 = surface(x1,y1,z1);
hold on
h2 = surface(x2,y2,z2);
view(3)
% Interpolate surface z1 in the finer grid defined for surface z2
z1_interp = interp2(x1,y1,z1,x2,y2);
a = 0.3;
hold on
h3 = surface(x2,y2,(a*z1_interp + (1-a)*z2));
The only difference between the two cases is the way in which the smoothing is handled. This difference is due to the different XY grids in the second example. In order to smooth the two surfaces, they must first be defined over the same XY grid, meaning the surfaces have the same number of points and are defined at the same (x,y) coordinates. The "interp2" function can be used to interpolate a surface over a different set of coordinate values. In the example above, the surface with less fine detail (smaller number of grid points) is interpolated over the finer grid. Then, the interpolated surface is smoothed with the surface defined over the finer grid, producing the overall smoothed surface.
Since a = 0.3 is the smoothing factor here, the smoothed surface should lie closer to the upper surface. The plots show this expected outcome. Additionally, in the second plot, the lower surface has a less smooth appearance, which is a result of having a coarser grid.
I hope this helps.
Matt
See Also
Categories
Find more on Surface and Mesh Plots in Help Center and File Exchange
Products
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!