%=============================Kommentar======================================
%Wir zeichnen B-Splines. Vorgegeben:
% (1) Ordnung k, (Grad =  k-1)
% (2) Splineknoten Knoten.
%Gezeichnet wird automatisch \"uber [aa,bb] mit  
%aa=Knoten(1), bb=Knoten(length(Knoten)).
%Ergebnis ist intern eine Matrix B, die spaltenweise f\"ur jedes x in [aa,bb] 
%die entsprechenden B-Spline-Werte und zeilenweise die B-Splines enth\"alt.
%Diese Matrix wird schlie\ss lich zeilenweise mit plot gezeichnet. 
%Einzugeben hinter "clear" sind:
%(1) die Ordnung k der zu zeichnenden Splines, eine nat\"urliche Zahl k,
%(2) der Vektor der Splineknoten in der Form Knoten=[k_1,k_2,...,k_n] 
%mit n >= k+1 nicht absteigend geordneten Komponenten.

%Programm: Gerhard Opfer, 13. Mai 1999
%Wesentlicher Programmteil:      l06_deBoor.m
%Bild aus de Boor, S. 112 und viele weitere Beispiele werden richtig
%reproduziert.

%===============================Vorspann=====================================
%Auswahl des Splineordnung k und der Splineknoten Knoten.

%==========================Eingabedaten hier=================================
%Hier k\"onnen eigene Daten (k und Knoten) eingetragen werden.
clear
k=3;  %k=3: quadratische Splines
Knoten=[0,1,1,3,5,7,7,7];           %Beispiel \"Ubungsaufgabe
%k-fache Knoten im Inneren produzieren eine Unstetigkeitsstelle!
%=========================Eingabedaten Ende===================================

%===============Vorspann Ende, Vorbereitung zum Zeichnen======================
n=length(Knoten);
aa=Knoten(1); bb=Knoten(n);
dis=100*(bb-aa)+1; 
X=linspace(aa,bb,dis);
B=l06_deBoor(k,Knoten,X); %wesentlicher Programmteil

%=================================Zeichenteil=================================
%Um mehrfache Knoten besonders zu markieren, werden die mehrfachen Knoten 
%extrahiert mit der folgenden am Beispiel beschriebenen Technik:
%        [122345555666]---->[255566]---->[556]---->[5]---->[].
%mindestens: einfach        doppelt    dreifach vierfach
Hilfsvektor=Knoten;
Knotenmehrfach{1}={Hilfsvektor}; %Konstruktion mit sog. cell arrays.
j=1;
while ~isempty(Hilfsvektor) 
  [C,I]=unique(Hilfsvektor);
  Hilfsvektor(I)=[];
  Knotenmehrfach{j+1}={Hilfsvektor};
  j=j+1;
end; %while
jmehrfachmax=j-1; %die h\"ochste auftretende Vielfachheit eines Knotens

%Tabelle=['1/4','1/2','3/4','1/2','1/4']; %Daten aus \"Ubungsbeispiel
for p=1:n-k
  subplot(n-k,1,p);
  plot(X,B(p,:),[aa bb],[0 0]);hold on
  %text(p+1,0.5,Tabelle(3*(p-1)+1:3*(p-1)+3)); 
        %Nur f\"ur \"Ubungsaufgabe sinnvoll
  if p==n-k %die mehrfachen Knoten werden nur einmal, im letzten Bild markiert
    for j=1:jmehrfachmax
      Hilfsvektor=[Knotenmehrfach{j}];
      Hilfsvektor=[Hilfsvektor{1}(1,:)];
      plot(Hilfsvektor,zeros(size(Hilfsvektor))+0.1*(j-1),'o');
    end; %for j
  end; %if p
hold off
end; %for p
%print -dpsc bspluebg.ps

%============================Ende Zeichenteil=================================
%========================Ende B-Splines zeichnen==============================

%===============================Service-Teil==================================

%==============Werte \"Ubungsaufgabe an den ganzzahligen Stellen==============
%x =  0   1    2         3         4         5         6        7
%=============================================================================
%     0   1    0.2500         0         0         0         0   0
%     0   0    0.6250    0.5000    0.1250         0         0   0
%     0   0    0.1250    0.5000    0.7500    0.5000    0.1250   0
%     0   0         0         0    0.1250    0.5000    0.6250   0
%     0   0         0         0         0         0    0.2500   1
%=============================Service-Teil Ende===============================
