%% Blatt 7 - Programmieraufgaben:
%% Periodische Spline-Interpolation (4 Punkte)
% Vorname Nachname Mat.-Nr.
% Auf dem Intervall [0, n], n \in \mathbb{N}, wollen wir durch die Stellen (k, y_k), k = 0, 1, \ldots, n-1, einen periodischen Spline s der Ordnung m mit Periode n berechnen. Dazu sei k = \big\lfloor{\frac{m}{2}} \big\rfloorund es gelte n \geq 2k + 1. Wir betrachten dann die Funktion
% s(x) = \sum_{i = -k}^{n+k} c_i B_m(x-i),
% wobei c_0 = c_n ist und c_{-j} = c_{n-j} und c_j = c_{n+j} für alle j = 1, \ldots, k gilt. Es folgt dann, dass s(k) = y_k genau dann für alle k = 0, 1, \ldots, n-1 gilt, wenn
% \pmatrix{b_0    & b_{-1}  & \cdots & b_{-k} & 0      & \cdots & 0      & b_k    & \cdots & b_1    \cr
%         b_1    & \ddots & \ddots &        & \ddots & \ddots &        & \ddots & \ddots & \vdots \cr
%         \vdots & \ddots & \ddots & \ddots &        & \ddots & \ddots &        & \ddots & b_k    \cr
%         b_k    &        & \ddots & \ddots & \ddots &        & \ddots & \ddots &        & 0      \cr
%         0      & \ddots &        & \ddots & \ddots & \ddots &        & \ddots & \ddots & \vdots \cr
%         \vdots & \ddots & \ddots &        & \ddots & \ddots & \ddots &        & \ddots & 0      \cr
%         0      &        & \ddots & \ddots &        & \ddots & \ddots & \ddots &        & b_{-k}  \cr
%         b_{-k} & \ddots &        & \ddots & \ddots &        & \ddots & \ddots & \ddots & \vdots  \cr
%         \vdots & \ddots & \ddots &        & \ddots & \ddots &        & \ddots & \ddots & b_{-1}  \cr
%         b_{-1} & \cdots & b_{-k}  & 0      & \cdots & 0      & b_k    & \cdots  & b_1    & b_0}
% \pmatrix{c_0 \cr c_1 \cr \vdots \cr c_{n-2} \cr c_{n-1}}
% =
% \pmatrix{y_0 \cr y_1 \cr \vdots \cr y_{n-2} \cr y_{n-1}},
% wobei b_j : \! = B_m(j).
% Weiter benutzen wir die folgende, rekursive Definition der B-Splines:
% B_0(x) : \! = \begin{cases} 1, &-0.5 < x \leq 0.5, \\ 0, & \text{sonst,} \end{cases}
% sowie für m \geq 1,
% B_m(x) : \! = \frac{x + 0.5(m+1)}{m} B_{m-1}(x + 0.5) + \frac{0.5(m+1) - x}{m}B_{m-1}(x - 0.5).
%
% Schreiben Sie hier am Ende dieses Live Scripts MATLAB-Funktionen
% ys = bSpline(xs, m),
% c = splineCoeffPeriodic(y, m),
% wobei bspline den B-Spline B_m bei den Werten xs auswertet und in ys zurückgibt. Dabei soll xs auch ein Vektor oder eine Matrix sein können, indem B_m elementweise angewendet wird. Weiter soll splineCoeffPeriodic das obige Gleichungssystem aufstellen und per \-Solver lösen. Dabei sollen y = (y_0, \ldots, y_{n-1})^{\rm T} und c = (c_{-k}, \ldots, c_{n+k})^{\rm T} sein.
% Hinweis. Benutzen Sie die MATLAB-Funktion toeplitz.
%
% Vervollständigen Sie zudem die Funktion ys = splineEval(xs, c, m), welche den Spline s gemäss der ersten Gleichung auswertet. Dabei soll B_m mittels Ihrer Funktion bspline ausgewertet werden.
%
% Testen Sie Ihre Implementierung mit dem folgenden Code:
%

z = repmat([5; 1.7; 4; 1.7], 7, 1);
n = length(z);
t = (0:n-1).';

n1 = 3;  n2 = 2;
for m = 0:n1*n2-1
    c = splineCoeffPeriodic(z, m);
    ts = linspace(t(1), t(end)+1, 601);
    zs = splineEval(ts, c, m);

    px = sin(t/n*2*pi);
    py = cos(t/n*2*pi);
    pxs = sin(ts/n*2*pi);
    pys = cos(ts/n*2*pi);
    
    subplot(n1, n2, m+1);
    plot3(px, py, z, 'r*', pxs, pys, zs, 'k-', pxs, pys, 0*zs, 'k-');
    hold on;
    surf([pxs; pxs], [pys; pys], [zs; 0*zs], ...
         'EdgeColor', 'none', 'FaceColor', [1, 1, 0]);
    hold off;
    view([-28, 28]);
    axis([-1, 1, -1, 1, -.5, 5.5]);
    title(['m = ' num2str(m)]);
end

%
% Funktionen:

function ys = bSpline(xs, m)
    % TODO: Implementieren
end

function c = splineCoeffPeriodic(y, m)
    % TODO: Implementieren
end

function ys = splineEval(xs, c, m)
    k = floor(m/2);
    n = size(c, 1) - 2*k - 1;
    
    
    ys = zeros(size(xs));    
    for i=-k:n+k
        % TODO: Implementieren
    end
end