data_final = [   -6.1305    0.3898    4.0944
   -3.4792    0.0712    3.4780
   -2.7333   -0.4087    0.9464
   -4.3261   -0.5722   -0.9622
   -6.8831   -0.2910   -0.5202
   -7.6750    0.1831    2.0050
   -1.7534    0.2017    5.3881
    0.8150    0.0146    4.9363
    1.6376   -0.4189    2.4217
   -0.1589   -0.7456    0.4730
    4.2562   -0.4999    1.9951
    6.0168   -0.2516    3.9521
    5.1658    0.1211    6.4648
    2.5743    0.2672    6.9028
    0.5809   -1.6918   -2.0465
    0.9089    0.4156   -4.0315
    8.8100   -0.3627    3.3576
    7.0153    0.3812    8.6262
    2.1139   -0.6585   -6.4343
    2.3542    1.2673   -8.6038
   -0.1408    2.4451   -9.4607];

[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;
    % kand ist ein Vektor von Kandidaten für ein Sechseck, der nach und
    % nach vervollständigt und verändert wird.
    
    % Suche Punktepaare, die gleichweit von kand(2) entfernt sind
    [sort_abstand, nummer] = sort(abstand(:,I));
    ind = find(diff(sort_abstand) < 0.2);
    
    % Schleife über diese Punktepaare
    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 durch Kanten verbundene 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);
                    
                    % Überprüfung, ob es sich wirklich um ein Sechseck im
                    % gewünschten Sinne handelt
                    % Zunächst: Berechnung des Mittelpunkts des "Sechseck"
                    mittel = mean(data_final(kand,:));
                    
                    % Berechnung der Abstände der Eckpunkte vom Mittelpunkt
                    abst_mittel = zeros(1,6);
                    for count = 1:6
                        abst_mittel(count) = norm(data_final(kand(count),:) - mittel);
                    end
                    
                    % Abschließender Test: die Punkte 1 und 6 müssen die
                    % richtige Entfernung voneinander haben, UND die
                    % Abstände vom Mittelpunkt dürfen nicht zu
                    % unterschiedlich sein
                    if abs(abstand(kand(1), kand(6)) - seitenlaenge) < 0.2 && ...
                            max(abst_mittel) - min(abst_mittel) < 0.3
                        
                        % Drehe das Sechseck so, dass es bei der Ecke mit
                        % dem kleinsten Index anfängt
                        [first, index] = min(kand);
                        kand = [kand(index), kand(index+1:end), kand(1:index-1)];
                        
                        % Wenn das Sechseck nun noch den richtigen Drehsinn hat,
                        % füge es zur Liste der Sechsecke hinzu
                        if kand(2) < kand(6)
                            sechseck = [sechseck; kand];
                        end
                    end
                end
            end
        end
    end
end

% Entferne offensichtliche Duplikate
sechseck = unique(sechseck, 'rows');

% 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