%Aus gegebenen Kontrollpunkten (b(j,1),b(j,2)), j=1,2,...,m
%wird die entsprechende Bezier-Kurve vom Grad m-1 gezeichnet. 
%Es wird die Darstellung mit Bernsteinpolynomen benutzt.
%Die Form ist function [Kurve]=bezier(Kontrollpunkte,t);
%Das Ergebnis ist eine Kurve, die in der Form plot(t,Kurve)
%geplottet werden kann. Will man sie abspeichern, ist in der 
%Kommandazeile ein Befehl der Form    
%   "print -dpsc bildkurve.ps"   
%(ohne "  ") zu schreiben. Es werden zwei Unterprogramme benutzt:
%function [b]=bernstein(p,t); %Bernsteinpolynome vom Grad p an den Stellen t
%function [b]=bin(n);         %alle Binomialkoeffizienten n \"uber j, j=0,1,...,n
%Die Programme sind einfach zu durchschauen, aber nicht besonders effektiv.
%Besser w\"aren rekursive Formen. Programm: G. Opfer, Juli 1999

function [Kurve]=bezier(Kontrollpunkte,t);
[m,n]=size(Kontrollpunkte);
if n~=2 
  error('Kontrollpunkte haben nicht genau zwei Komponenten');
end; %if
[b]=bernstein(m-1,t);
M=1:m;
Kurve=zeros(2,length(t));
for z=1:2
  for mm=M
    Kurve(z,:)=Kurve(z,:)+Kontrollpunkte(mm,z)'.*b(mm,:);
  end; %for mm
end; %for z;
%-----------------------------------------------------------------------------
%Es werden alle Bernsteinpolynome b vom Grad p, ausgewertet an den 
%Stellen t berechnet. b ist eine Matrix b(j,tau), j=1,2,...,p+1,
%tau = length(t); intern wird "bin" ("function [b]=bin(n);")
%zur Berechnung aller Binomialkoeffizienten benutzt.
%function [b]=bernstein(p,t);
function [b]=bernstein(p,t);
tau=length(t);
Tau=1:tau;
P=1:p+1;
b=zeros(p+1,tau);
bi=bin(p);
for pp=P
  b(pp,:)=bi(pp)*((1-t).^(p-pp+1).*t.^(pp-1));
end; %for
%-----------------------------------------------------------------------------
%In b stehen alle n+1 Binomialkoeffizienten zum Grad n zeilenweise
%function [b]=bin(n);
function b=bin(n);
J=1:n+1;
for j=J
  b(j)=prod((n:-1:n-j+2)./(j-1:-1:1));
end; %for
