function rueck = makerueck()
%% Makerueck
%
% Dieses Skript erstellt einen ungerichteten, ungewichteten ruecken, dessen
% Knoten einen vorgegebenen Mindestabstand einhalten müssen und dessen 
% Knoten alphabetisch durchbeannt sind.
%
% Mit den Funtionen "voronoi" und "delaunay + triplot" wird der erstellte 
% rueck visualisiert. Mehr Informationen zu diesen Funktionen erhalten Sie
% in der Hilfe.
%

%% Workspace aufräumen
close all; clc

%% Daten erstellen
N = 15;             % Anzahl der Koten
MinAbstand = 0.13;  % Minimaler Abstand der Knoten zueinander
T = [1 2 3 1];
rueck = struct();   % Rueckgabeparameter

% Zufallsgenerierung
flag = true;
ii = 0;
while flag
    % Knoten generieren
    flag = false;
    x = rand(1,N);
    y = rand(1,N);
    TRI = delaunay(x,y);

    % Sitzen die Knoten zu eng? dann nochmal generieren
    for jj=1:size(TRI,1)
        for kk = 1:3
            res = norm([x(TRI(jj,T(kk)))-x(TRI(jj,T(kk+1))) y(TRI(jj,T(kk)))-y(TRI(jj,T(kk+1)))]);
            if res < MinAbstand
               flag = true;
            end
        end
    end

    % Not-Abbruch-Statement
    ii=ii+1;
    if ii > 2000
        error('Es kann kein passender rueck generiert werden. Passen Sie die Parameter an');
        return;
    end         
end

%% Ueberfuehren des ruecken in eine rueckenstruktur
TRIs = sort(TRI, 2);
for ii = 1: length(x)
    zw = [];
    neighbor = [];
    % Finden aller Nachbarn aus Dreiecksinformationen
    for jj=1:size(TRIs,1)
        for kk = 1:size(TRIs,2)
            if TRIs(jj,kk) == ii
                zw = [zw TRIs(jj,:)];
            end
        end
    end
    % Löschen von doppelten Einträgen und Generierung 
    for jj=1:length(x)
        if jj == ii
            continue
        end
        if max(max(zw==jj))
            neighbor = [neighbor jj ];
        end
    end
    % Jetzt die Daten für jeden Knoten speichen
    rueck(ii).ID = ii;
    rueck(ii).Name = char(ii+64);    
    rueck(ii).x = x(ii);
    rueck(ii).y = y(ii);
    rueck(ii).NachbarnID = neighbor;
    rueck(ii).Nachbarn = char(neighbor+64);
end

%% Plotten des generierten ruecken
figure('name', 'rueckenvisualisierung', ...
     'NumberTitle', 'off', 'Position', [100 100 600 400]);
axes('units', 'normalized', 'position', [0.02 0.02 0.96 0.96], ...
    'XTick', [], 'YTick', [], 'Box', 'on');

% Zellen, Zellverbindungen, -mittelpunkte und -beschriftung plotten
hold on
voronoi(x, y, 'r:.');
triplot(TRI, x, y, 'b');
plot(x, y, 'o ', 'MarkerSize', 20, 'MarkerFaceColor', 'y');
for ii = 1: size(x, 2)
    text(x(ii)-0.01, y(ii), char(64+ii), 'FontSize', 13, 'FontWeight', 'bold')
end
hold off
axis([-0.1 1.1 -0.1 1.1]);

%% Zugriff
% Zusätzlich zur Rückgabe noch die Struktur in der globalen Variablen 
% "Graph" abspeichern.
global Graph;
Graph = rueck;