function koch(iter,maske,polygon,shift)
% koch(iter,maske,polygon,shift)
% Generiert eine Grafik mit unterschiedlichen Iterationsstufen einer
% Polygon-Rekursion
% Eingabeparameter:
% iter:     Anzahl der Iterationen (Default: 3)
% maske:    Muster zur generierung der neuen Kanten aus einer gegebenen
%           Angaben relativ zur Kante (0,0)-(1,0) (Default: Koch-Maske)
% polygon:  Startpolygon. 2 x n- Matrix (Default: gleichseitiges Dreieck)
% shift:    Abstand zwischen den Bildern


% Autor: Jörg Hörner
% Letzte Änderung: 15. 12. 2004

% Abfrage der Uebergabeparameter und setzen der Default-Werte
% Differenz zwischen den Bildern
if (~exist('shift','var') || isempty(shift))
  shift=1.5;
end

if (~exist('polygon','var') || isempty(polygon))
  polygon=[0,1,1/2;0,0,sqrt(3)/2];
end
px=polygon(1,:);
py=polygon(2,:);

if (~exist('maske','var') || isempty(maske))
  maske=[0,1/3,1/2,2/3;0,0,-sqrt(3)/6,0];
end

if (~exist('iter','var') || isempty(iter))
  iter=3;
end

% Grafik-Fenster oeffnen und Startpolygon zeichen
figure
hold on
fill(px,py,.51*[1 1 1])


% Iteration: Neues Polygon berechnen und zeichnen
for k=1:iter
  [px,py]=kochrec(px,py,maske);
  fill(k*shift+px,py,.51*[1 1 1])
end

% Achsensystem anpassen und ausschalten
axis equal
axis off
axis tight


function [qx,qy]=kochrec(px,py,maske)

% Faktor mit dem Punkteanzahl waechst
n=size(maske,2);

% Differenzvektoren zwischen bisherigen Punkten
dx=diff([px, px(1)]);
dy=diff([py, py(1)]);

% relative Koordinaten der neuen Punkte bzgl. der alten
rx=maske'*[dx;-dy];
ry=maske'*[dy;dx];

% Vervielfaeltigen der alten Punkte und aufaddieren der 
% relativen Koordinaten
qx=repmat(px,n,1)+rx;
qy=repmat(py,n,1)+ry;

% Wandlung der Matrizen in Vektoren
qx=qx(:)';
qy=qy(:)';
