data_final = [    2.8238   -0.0419    0.7378
    3.5633   -1.1413    0.3329
    2.8504   -2.2792   -0.1201
    1.4813   -2.3929   -0.2370
    0.7861   -1.1966    0.1976
   -0.5722   -1.1927    0.1270
   -1.3171   -0.0907    0.4917
   -2.7119   -0.0871    0.3793
   -3.4710    1.0198    0.7441
   -4.9734    0.9898    0.6099
   -2.8016    2.1650    1.2349
   -3.5754    3.3972    1.6359
   -1.4084    2.1566    1.3450
   -0.6319    1.0461    0.9885
    0.7729    1.0246    1.1141
    1.5065   -0.0776    0.6785
    1.4706    2.3017    1.3295
    1.5496    3.2306    0.0980
    2.9793    3.3505   -0.4772
    3.1910    4.6776   -1.2395
    4.5162    4.6527   -2.0059];

[rows cols] = size(data_final);
abstand = zeros(rows,rows); % jetzt ist rows die Anzahl der Vektoren
for k = 1:rows
    temp = bsxfun(@minus,data_final,data_final(k,:));
    abstand(k,:) = sqrt( sum( temp.^2, 2 ) )'; % man muss die Norm jetzt über die Zeilen nehmen, daher das ,2. Am Ende transponieren, damit die Dimensionen stimmen.
end
% soweit waren wir ja schon

sechseck = []; % Initialisierung der Sechsecke
for I=1:rows % Schleife über alle Punkte
    kand(2) = I;

    % Suche Punkte, die gleichweit von kand(2) entfernt sind
    [sort_abstand, nummer] = sort(abstand(:,I)); 
    ind = find(diff(sort_abstand) < 0.05); 
    
    for J1 = 1:length(ind)
        kand(1) = nummer(ind(J1));
        kand(3) = nummer(ind(J1)+1);
        seitenlaenge = mean(abstand([kand(1), kand(3)], kand(2)));
        
        % Wir haben jetzt 3 Punkte und eine Seitenlänge.
        % Jetzt geht der Spaß los.
        
        % Suche Kandidaten für Punkt 4
        alle_kand4 = findnext(abstand, kand(3), kand(1:3), seitenlaenge);
        
        % Suche für jeden dieser Kandidaten einen Kandidaten für Punkt 5
        for J2 = 1:length(alle_kand4)
           kand(4) = alle_kand4(J2);
           alle_kand5 = findnext(abstand, kand(4), kand(1:4), seitenlaenge);
           
           % Suche für jeden dieser Kandidaten einen Kandidaten für Punkt 6
           for J3 = 1:length(alle_kand5)
                kand(5) = alle_kand5(J3);
                alle_kand6 = findnext(abstand, kand(5), kand(1:5), seitenlaenge);
                
                % Überprüfe für jeden dieser Kandidaten, ob er die richtige
                % Entfernung von Punkt 1 hat
                for J4 = 1:length(alle_kand6)
                    kand(6) = alle_kand6(J4);
                    if abs(abstand(kand(1), kand(6)) - seitenlaenge) < 0.5
                        % TODO: Überprüfe, ob das Sechseck wirklich ein
                        % Sechseck ist...                        
                        
                        % Drehe das Sechseck so, dass es bei der Ecke mit
                        % dem kleinsten Index anfängt
                        [first, index] = min(kand);
                        kand2 = [kand(index), kand(index+1:end), kand(1:index-1)];
                        
                        % Füge es zur Liste der Sechsecke hinzu
                        sechseck = [sechseck; kand2];
                    end
                end
           end
        end            
    end
end

% Entferne offensichtliche Duplikate
sechseck = unique(sechseck, 'rows');

% TODO: Entfernung nicht so offensichtlicher Duplikate
% (Rechtecke, die bis auf den Drehsinn gleich sind)


% Hier ist nur noch Visualisierung
scatter3(data_final(:,1),data_final(:,2),data_final(:,3))
hold on
h = -1;
colors = 'rgcm';
for c = 1:size(sechseck, 1)
    if ishandle(h)
        delete(h)
    end
    ind = sechseck(c,[1:6 1]);
    h = plot3(data_final(ind,1), data_final(ind,2), data_final(ind,3), colors(mod(c,4)+1));
    drawnow
    pause(2)
end  