How to interpolate between two 3D shapes?
16 次查看(过去 30 天)
显示 更早的评论
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 个评论
John Kearns
2022-4-22
编辑:Bruno Luong
2022-4-22
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
回答(2 个)
Kelly Kearney
2015-7-30
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
2015-7-30
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
另请参阅
类别
在 Help Center 和 File Exchange 中查找有关 Surface and Mesh Plots 的更多信息
产品
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!