Как реализовать B-Spline в матричной форме? - PullRequest
1 голос
/ 30 января 2020

Я просто пытаюсь нарисовать куб c B-Spline, используя матричное представление, приведенное в этой статье: http://vision.ucsd.edu/~kbranson/research/bsplines/bsplines.pdf

В частности, я пытаюсь точно скопировать формула в разделе 3 (с использованием матрицы размещения G) PDF. Но я не уверен, где я иду не так. Он продолжает производить прямые линии. Может кто-нибудь указать мне, что не так со следующим кодом (он должен работать на любой версии Matlab; это довольно просто)?

% main.m
clc; clear;

n_cpts = 5;
deg = 3;

cpts = randi(30, n_cpts, 2);

n_knots = n_cpts + deg + 1;
knots = 0:(n_knots-1);

ts = knots(deg):0.05:knots(end-deg);
curve = [];

for t = ts(1:end-1)
    k = floor(t);
    T = [1, t, t^2, t^3];
    B = Bi(k);
    G = Gi(k, n_cpts);
    p = T * B * G * cpts;
    curve = [curve; p];
end

scatter(curve(:,1), curve(:,2));

Вспомогательные функции

% Bi.m
% The 'B' matrix
function [B] = Bi(i)
B = [[ -(1./6.)*i^3, (1./6.)*(3*i^3 + 3*i^2 - 3*i + 1), -(1./2.)*(i^3)-(i^2)+2./3., (1./2.)*(i+1)^3 ];
      [ +(1./2.)*i^2, -(1./2.)*(3*i-1)*(i+1), (1./2.)*(3*i^2 + 4*i), -(1./2.)*(i+1)^2 ];
      [ (1./2.)*i, (1./2.)*(3*i+1), -(1./2.)*(3*i+2), (1./2.)*(i+1) ];
      [ (1./6.), -(1./2.), (1./2.), -(1./6.) ]];
end
% Gi.m
% The 'G' matrix
function [G] = Gi(i, L)
G = zeros(4, L);
for m = 1:4
    for n = 1:L
        if n == i+m-3
            G(m,n) = 1;
        end
    end
end
end

Мой вывод выглядит так: enter image description here

...