% Flower
% Kap. Computergrafik
% M.Hess 11.7.2000

%Initialisierung
clear;                             %Löschen aller Variablen
clc;                               %Löschen der Workspace     
points=[0 1 3;0 1.5 2];            %Demofigur 1
%points=[0 0 1 2.5 3.5;0 2 3 3.5 4]; %Demofigur 2
%points=[0 1 2 4 6 7 6 4 2 0;0 2 3 4 4 3 2 1 0.25 0];%Demofigur 3

%Abfragen
n = input('Anzahl Drehungen :\n');
delay= input('Verzögerung (in s; 0 für sofortiges Zeichnen):\n');
middle=input('Drehung um [0] Nullpunkt oder [1] variablen Punkt?\n');
%Berechnung würde auch mit variablem Punkt sowie beiden Koordinaten = 0 funktionieren,
%mit der Auswahlmöglichkeit sind jedoch beide Varianten ersichtlich.
if middle == 1                    %Wenn variabler Punkt...
   x=input('X-Koordinate Drehpunkt:\n');
   y=input('Y-Koordinate Drehpunkt:\n');
   sqf=3;                         %Wert für Strecken (Skalarmatrix)
else                              %Koordinaten auf Null setzten
   x=0;
   y=0;
   sqf=2;                         %Wert für Strecken (Skalarmatrix)
end;                              %Ende if-Schlaufe
squeeze=input('Figur strecken [n=0/j=1] ?\n');
if squeeze == 1                   %Wenn gestreckt werden soll...
   stdata=input('Streckungsfaktor (total!):\n');
   if stdata > 1
      stdata=(stdata/n)+1;
      stretch=stdata*eye(sqf);   %angepasste Skalarmatrix
   elseif stdata < 1
      stdata=1-(stdata/n);
      stretch=stdata*eye(sqf);   %angepasste Skalarmatrix
   end;
else                              %Wenn nicht gestreckt werden soll...
   stretch=eye(2);                %Einheitsmatrix 2.Ordnung
end;                              %Ende streck-if-Schlaufe

%Berechnungen
phi =2*pi/n;                      %Drehwinkel in rad
if middle == 1                    %Wenn variabler Mittelpunkt...
   numb=size(points);             %Grösse von points
   blubber=numb(:,2);             %Anzahl Spalten von points;
   one=ones(1,blubber);           %erzeugt Einer-Matrix passend zu points
   points=[points;one];           %fügt oben erzeugte Matrix zu points an
end;                              %Ende if-Schlaufe

%Grafikausgaben
figure('Name',strcat('Flower ;',num2str(n),' Wiederholungen'),'NumberTitle','off'); %Anpassen des Figure-windows
hold;                             %Fenster einfrieren
colors=hsv(n);                    %Farbverlaufs mit n Schritten
axis square;                      %Achsen gleich lang, dynamisch
for i = 1:n                       %for-Schleife mit n Schritten
   plot(points(1,:),points(2,:),'Color',colors(i,:)); 
   if middle == 0                 %Wenn Drehpunkt = 0...
      q=[cos(phi),(-sin(phi));sin(phi),cos(phi)]; %Drehmatrix, Nullpunkt fix
      points=q*points;            %Neue Punkte speichern
   else                           %oder Drehpunkt ungleich Null...
      q=[cos(phi),(-sin(phi)),0;sin(phi),cos(phi),0;0,0,1]; %Drehmatrix mit Drehpunkt
      o=[1,0,x;0,1,y;0,0,1];      %Verschiebung Nullpunkt
      r=[1,0,-x;0,1,-y;0,0,1];    %Rückverschiebung Nullpunkt
      points=o*q*r*points;
   end;                           %Ende if-Schleife
   points=stretch*points;         %Strecken der Figur
   if delay ~= 0                  %if-Schlaufe für delay = 0
      pause(delay);               %Verzögerung
   end;                           %Ende if-Schlaufe
end;                              %Ende for-Schlaufe
plot(points(1,:),points(2,:),'Color',colors(n,:)); %Letzte Grafik auch noch zeichnen