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.');

結果如下:

其中藍點為原始控制點,綠點為行方向插值結果,紅點為列方向插值結果即最終結果。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM