WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Differenzen berechnen

 

DSP
Forum-Meister

Forum-Meister



Beiträge: 2.117
Anmeldedatum: 28.02.11
Wohnort: ---
Version: R2014b
     Beitrag Verfasst am: 19.07.2011, 17:10     Titel:
  Antworten mit Zitat      
Mir kommt da gerade ein Idee, wie man nach einem Sechseck suchen könnte. Ich nehme zwei Punkte A und B. Bei einem Sechseck sind alle darin enthaltenen 6 Dreiecke, gleichseitig. Mit der Höhe hc = (a/2) * sqrt(3) erhalte ich den Punkt C womit ich den Mittelpunkt M des Sechsecks habe. Der Radius des Kreises, auf dem alle 6 Ecken liegen, ist r = (a/3) * sqrt(3). Wenn ich jetzt von M aus einen Zeiger (Punkt A = 0 Grad) mit der Länge r in 60 Grad Schritten drehe, komme ich zu den anderen Punkten des Sechsecks. Man müsste also prüfen, ob in dieser Umgebung des Kreises mit der angegeben Schrittweite Punkte liegen.

Allerdings könnte das auch ins nichts führen, wenn die Punkte A und B schlecht gewählt sind.

Edit: Dumme Sache...ich habe die 3. Dimension vergessen. Man müsste ja auch noch die z-Koordinate von C bzw. M bestimmen Embarassed
Private Nachricht senden Benutzer-Profile anzeigen


mathphys
Themenstarter

Forum-Century

Forum-Century


Beiträge: 130
Anmeldedatum: 03.06.11
Wohnort: Deutschland
Version: ---
     Beitrag Verfasst am: 20.07.2011, 11:02     Titel:
  Antworten mit Zitat      
Vielen Dank Harald. Smile

Ich werde mich bemühen deinen Code zu verstehen und nicht blöd zu übernehmen und werde dann bestimmt hier rückfragen dazu stellen.

Gruß
_________________

Besser ne Taube auf'm Dach als nen Stuhl inner Kiste
Private Nachricht senden Benutzer-Profile anzeigen
 
mathphys
Themenstarter

Forum-Century

Forum-Century


Beiträge: 130
Anmeldedatum: 03.06.11
Wohnort: Deutschland
Version: ---
     Beitrag Verfasst am: 21.07.2011, 15:49     Titel:
  Antworten mit Zitat      
Hallo

wirklich schwer den Code zu verstehen. Ich bleibe aber am Ball.

Ein paar Fragen für das Weitere. Wie würde ich das nun erweitern, dass nur das mittlere der drei Sechsecke ausgegeben wird?

Beim Suchlauf habe ich bei der Visualisierung gesehen, dass er das mittlere Sechseck auch erwischt hatte, aber dann weiter geht.

Ich habe versucht die Hilfsfunktion in die Hauptdatei einzubauen, doch es kamen immer Fehler. Müssen solche definierten Funktionen immer als extra Datei geschrieben werden?

Viele Grüsse und noch einmal Danke für deine Mühe. Ich werde es verstehen lernen und nicht blind kopieren.

Smile
_________________

Besser ne Taube auf'm Dach als nen Stuhl inner Kiste
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.499
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 21.07.2011, 19:21     Titel:
  Antworten mit Zitat      
Hallo,

ich habe mal noch eine Version angehängt, in der die TODOs erledigt sind und die etwas besser kommentiert ist.
Diese Variante gibt jetzt nur noch die drei tatsächlichen Sechsecke zurück und keine Duplikate mehr.

Aus diesen drei Sechsecken das mittlere zu identifizieren überlasse ich nun tatsächlich dir als Übung. Ein Tipp: das mittlere Sechseck ist das einzige, das gemeinsame Punkte mit beiden der anderen Sechsecke hat. Zum Bestimmen einer Schnittmenge hilft INTERSECT.

Und dann wirst du natürlich sehen müssen, ob der Code auch bei anderen Datensätzen die gewünschten Ergebnisse liefert.

Wenn du die Hilfsfunktion in die Hauptdatei einbauen willst, musst du die Hauptdatei auch zu einer Funktion machen. Die erste Zeile einer solchen Funktion könnte z.B. so aussehen:
Code:
function sechseck = findeSechseck(data_final)


Grüße,
Harald

findnext.m
 Beschreibung:
Hilfsfunktion

Download
 Dateiname:  findnext.m
 Dateigröße:  666 Bytes
 Heruntergeladen:  331 mal
findeSechseck2.m
 Beschreibung:
Hauptprogramm

Download
 Dateiname:  findeSechseck2.m
 Dateigröße:  4.7 KB
 Heruntergeladen:  341 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
mathphys
Themenstarter

Forum-Century

Forum-Century


Beiträge: 130
Anmeldedatum: 03.06.11
Wohnort: Deutschland
Version: ---
     Beitrag Verfasst am: 07.08.2011, 11:22     Titel:
  Antworten mit Zitat      
Hi

plötzlich passieren komische Dinge. Ich erhalte keinen Fehler, das Programm läuft ab, doch mit falschen Ergebnissen. Könntest du mir sagen was da passiert Harald?

In dieser Geometrie befindet sich ausschließlich ein einziges Sechseck, nicht mehr mehrere wie vorher.

Meine Daten sind:

Code:
FAD_geo =

         0         0         0
   -1.3609    2.3974   -0.0000
   -3.9900    2.4760   -0.0076
   -5.4717    0.1471   -0.0318
   -4.1048   -2.2510   -0.1468
   -1.4716   -2.3300   -0.0582
    0.0073   -4.7886   -0.0797
    0.7894   -5.6345   -2.7632
   -5.7481   -4.5891   -0.2965
   -0.3498    6.5141   -1.6631
   -7.0756    5.3963   -1.6035
    6.1804    3.9829    0.1942
    8.3960    3.0349   -1.1469
    6.1975    6.2122    1.4671


und der Code ist

Code:
[rows cols] = size(FAD_geo);
abstand = zeros(rows,rows);
for k = 1:rows
    temp = bsxfun(@minus,FAD_geo,FAD_geo(k,:));
    abstand(k,:) = sqrt( sum( temp.^2, 2 ) )';
end


sechseck = [];
for I=1:rows
    kand(2) = I;
 
    [sort_abstand, nummer] = sort(abstand(:,I));
    ind = find(diff(sort_abstand) < 0.1);
   
    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)));
       
       
        alle_kand4 = findnext(abstand, kand(3), kand(1:3), seitenlaenge);
       
        for J2 = 1:length(alle_kand4)
            kand(4) = alle_kand4(J2);
            alle_kand5 = findnext(abstand, kand(4), kand(1:4), seitenlaenge);
           
            for J3 = 1:length(alle_kand5)
                kand(5) = alle_kand5(J3);
                alle_kand6 = findnext(abstand, kand(5), kand(1:5), seitenlaenge);
               
             
                for J4 = 1:length(alle_kand6)
                    kand(6) = alle_kand6(J4);
                   
               
                    mittel = mean(FAD_geo(kand,:));
                   
                    abst_mittel = zeros(1,6);
                    for count = 1:6
                        abst_mittel(count) = norm(FAD_geo(kand(count),:) - mittel);
                    end
                   
                   
                    if abs(abstand(kand(1), kand(6)) - seitenlaenge) < 0.1 && ...
                            max(abst_mittel) - min(abst_mittel) < 0.2
                       
                       
                        [first, index] = min(kand);
                        kand = [kand(index), kand(index+1:end), kand(1:index-1)];
                       
                       
                        if kand(2) < kand(6)
                            sechseck = [sechseck; kand];
                        end
                    end
                end
            end
        end
    end
end

sechseck = unique(sechseck, 'rows');
 


Eigentlich sollte ich jetzt eine Matrix sechseck haben, in der die sechs Vektoren stehen, doch sechseck wird mir als 0x0 double angezeigt. Nur ein [] wird ausgegeben.

Gruß

p.s.
Ich werde heute anfangen zu lernen was es mit debuggen auf sich hat. Mal sehen, evtl. bringt mir das was Smile
_________________

Besser ne Taube auf'm Dach als nen Stuhl inner Kiste
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.499
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 07.08.2011, 12:37     Titel:
  Antworten mit Zitat      
Hallo,

das Sechseck sollte aus den ersten 6 Punkten gebildet werden. Der Abstand zwischen den jeweiligen Eckpunkten variiert aber zwischen 2.63 und 2.75, wird also nicht mehr als regelmäßiges Sechseck betrachtet, da wir eine Toleranz von 0.1 angegeben hatten.
Wenn du die Toleranzen etwas anpasst (z.B. verdoppelst), klappt es wieder.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
mathphys
Themenstarter

Forum-Century

Forum-Century


Beiträge: 130
Anmeldedatum: 03.06.11
Wohnort: Deutschland
Version: ---
     Beitrag Verfasst am: 13.08.2011, 21:34     Titel:
  Antworten mit Zitat      
Hi, ja daran lag es. Nun habe ich jedoch ein anderes Problem. Ich habe versucht den Fehler zu finden, bin jedoch gescheitert. An der Toleranz sollte es nicht liegen.

Ich habe folgende Geometrie:

Code:
geometry =

   -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


Der Algorithmus zum Auffinden des Sechsrins kommt auf

Code:
six_ring =

   -3.4792    0.0712    3.4780
    0.8150    0.0146    4.9363
   -2.7333   -0.4087    0.9464
    1.6376   -0.4189    2.4217
   -0.1589   -0.7456    0.4730
    4.2562   -0.4999    1.9951


Der letzte Zeilenvektor ist falsch und gehört nicht zum Sechseck (die fünf darüber stimmen). Richtig wäre -1.7534 0.2017 5.3881

Ich weiss nicht mehr woran es liegen könnte Sad Der Code ist der den du geschrieben hast Harald, den ich by the way noch immer versuche komplett zu verstehen (kein blindes copy &paste, ich will ja was lernen Wink ).

Gruß
_________________

Besser ne Taube auf'm Dach als nen Stuhl inner Kiste
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.499
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 13.08.2011, 23:37     Titel:
  Antworten mit Zitat      
Hallo,

es kann sein, dass ich aufgrund deiner letzten Nachricht noch ein wenig an dem Code verändert habe. Er liefert mir drei Sechsecke, von denen das mittlere das richtige sein sollte.
Ich habe den Code in seiner momentanen Form nochmal angehängt.

Grüße,
Harald

findnext.m
 Beschreibung:

Download
 Dateiname:  findnext.m
 Dateigröße:  665 Bytes
 Heruntergeladen:  339 mal
findeSechseck2.m
 Beschreibung:

Download
 Dateiname:  findeSechseck2.m
 Dateigröße:  4.69 KB
 Heruntergeladen:  326 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen

Gehe zu Seite Zurück  1, 2, 3

Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

Du kannst Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.
Du kannst Dateien in diesem Forum posten
Du kannst Dateien in diesem Forum herunterladen
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2025 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.