matlab练习程序(B样条曲面插值)

可以参考之前的B样条曲线插值的方法。

要想利用控制点进行B样条曲面插值,前提是控制点不能是类似点云一样的无序点,一定要是分布在UV坐标空间中的栅格点。

方法就是首先对U方向进行B样条曲线插值,然后利用插值的结果再在V方向上进行B样条曲线插值即可。

下面用matlab自带的Peaks函数作为控制点为例编程。

matlab代码如下:

clear all;close all;clc;

[x,y] = meshgrid(-3:0.3:3);
z =  3*(1-x).^2.*exp(-(x.^2) - (y+1).^2) ...
    - 10*(x/5 - x.^3 - y.^5).*exp(-x.^2-y.^2) ...
    - 1/3*exp(-(x+1).^2 - y.^2);

plot3(x(:),y(:),z(:),'b.');
hold on;

%%对行进行B样条插值
u = [];v = [];w = [];
[H,~] = size(x);
for k=1:H
    re=[];
    for i=1:length(x(k,:))-2
        for t=0:0.1:1
            
            b0 = 1/2*(1-t)^2;
            b1 = 1/2*(-2*t^2+2*t+1);
            b2 = 1/2*t^2;
            
            x1=b0*x(k,i)+b1*x(k,i+1)+b2*x(k,i+2);
            y1=b0*y(k,i)+b1*y(k,i+1)+b2*y(k,i+2);
            z1=b0*z(k,i)+b1*z(k,i+1)+b2*z(k,i+2);
            
            re=[re [x1;y1;z1]];
        end
    end
    u = [u ; re(1,:)];
    v = [v ; re(2,:)];
    w = [w ; re(3,:)];
end

x = u;y = v;z = w;
plot3(x(:),y(:),z(:),'g.');

%对列进行B样条插值
u=[];v=[];w=[];
[~,W] = size(x);
for k=1:W
    re=[];
    for i=1:length(x(:,k))-2
        for t=0:0.1:1
            
            b0 = 1/2*(1-t)^2;
            b1 = 1/2*(-2*t^2+2*t+1);
            b2 = 1/2*t^2;
            
            x1=b0*x(i,k)+b1*x(i+1,k)+b2*x(i+2,k);
            y1=b0*y(i,k)+b1*y(i+1,k)+b2*y(i+2,k);
            z1=b0*z(i,k)+b1*z(i+1,k)+b2*z(i+2,k);
            
            re=[re;x1 y1 z1];
        end
    end
    u = [u re(:,1)];
    v = [v re(:,2)];
    w = [w re(:,3)];
end
plot3(u(:),v(:),w(:),'r.');

结果如下:

其中蓝点为原始控制点,绿点为行方向插值结果,红点为列方向插值结果即最终结果。

posted @ 2022-03-12 15:30  Dsp Tian  阅读(1647)  评论(0编辑  收藏  举报