clc; clear; close all;

print_figures = 0;

N = 4; % stupen polynomu repezentujici reseni na trojulehniku
N_p = ((N + 1) * (N + 2)) / 2; % celkovy pocet polynomu v bazi
N1 = 200; % pocet bodu na hrane referencniho trojuhelniku I
N_p1 = (N1 * N1 + N1) / 2; % celkovy pocet bodu na referencnim trojuhelniku I

% generace bodu na referencnim trojuhelniku I
r1 = linspace(-1,1,N1); % uzly na hrane I v ose x
s1 = linspace(-1,1,N1); % uzly na hrane I v ose y
r = r1;
s = -1 * ones(1,N1);
for i = 2:N1
    r_old = r;
    s_old = s;
    clear r s;
    r_temp = r1(1:(N1 - (i - 1)));
    s_temp = s1(i) * ones(1,N1 - (i - 1));
    r = [r_old, r_temp];
    s = [s_old, s_temp];
end

% napocitani hodnot ortonormalnich polynomu (modalni baze) na referencnim trojuhelniku I
% takto napocitane polynomy modalni baze jsou pak kresleny po sloupcich jako v knize
hodnoty_mode = zeros(N_p,N_p1);
exponenty = zeros(N_p,2); % v prvnim slouci cislo i, v druhem cislo j pro dany prvek modalni baze
[a,b] = rstoab(r,s);
temp = 1;
for i = 0:N
    for j = 0:(N - i)
        hodnoty_mode(temp,:) = ModalBaseValues2D(a,b,i,j);
        exponenty(temp,1) = i;
        exponenty(temp,2) = j;
        temp = temp + 1;
    end
end

% napocitani hodnot polynomu z nodalni aze na referencnim trojuhelniku I - nepocita spravne
% takto napocitane polynomy nodalni baze jsou pak kresleny po radcich odspoda jako v knize
%V = load('VandermondeMatrix2D_for_N=4.txt'); % Vandermondova matice pro N = 4 od Hesthavena
[x,y] = OptimalNodes2D(N);
[r_temp,s_temp] = xytors(x,y);
V = VandermondeMatrix2D(N,r_temp,s_temp);
T = inv(V'); % transformacni matice - od modalni k nodalni bazi
hodnoty_node = T * hodnoty_mode;

% vykresleni obou bazi
tri = delaunay(r,s);
temp = 1;
for k = 1:N_p
    i = exponenty(temp,1);
    j = exponenty(temp,2);
    
    % prvek modalni baze
    figure;
    
    trisurf(tri, r, s, hodnoty_mode(temp,:));
    shading interp;
    
    %title(['Prvek modalni baze ve 2D pro i = ',num2str(i),' a j = ',num2str(j)]);
    
    filename_string = ['2D_modal_basis_for_N=',num2str(N),'_and_i=',num2str(i - 1),',_j=',num2str(j)];
    if print_figures == 1
        saveas(gcf,filename_string,'pdf');
        saveas(gcf,filename_string,'png');
    end
    
    % prvek nodalni baze
    figure;
    trisurf(tri, r, s, hodnoty_node(temp,:));
    shading interp;
    
    %title(['Prvek nodalni baze ve 2D pro i = ',num2str(i),' a j = ',num2str(j)]);
    
    filename_string = ['2D_nodal_basis_for_N=',num2str(N),'_and_i=',num2str(i - 1),',_j=',num2str(j)];
    if print_figures == 1
        saveas(gcf,filename_string,'pdf');
        saveas(gcf,filename_string,'png');
    end

    %disp('Stisknete libovolnou klavesu pro dalsi obrazek:'); pause;
    close all;

    temp = temp + 1;
end