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

Vielecke in Parallelogramme aufteilen

 

dresel
Forum-Newbie

Forum-Newbie


Beiträge: 7
Anmeldedatum: 27.08.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 28.08.2015, 11:16     Titel: Vielecke in Parallelogramme aufteilen
  Antworten mit Zitat      
Hallo,

ich muss einige Flächen in Parallelogramme aufteilen, da mich das vermutlich noch öfter erwartet bin ich am überlegen ob ich das nicht mit Matlab automatisieren könnte.

Zur Verfügung stehen mir nur die Eckpunkte der Gesamtfläche welche mindestens 3 Ecken hat.

Gibt es da in Matlab eine einfache Methode?

Ich habe mal ein Beispiel angehängt wie das dann in etwa aussehen sollte. Die Gesamtfläche ist die Ausgangssituation und die kleinen Parallelogramme sind das Ergebnis. Es sollten nach Möglichkeit auch so wenig Parallelogramme entstehen wie möglich aber das ist zweitrangig.

Gruß
Thomas

untitled.png
 Beschreibung:

Download
 Dateiname:  untitled.png
 Dateigröße:  5.79 KB
 Heruntergeladen:  430 mal
Private Nachricht senden Benutzer-Profile anzeigen


Epfi
Forum-Meister

Forum-Meister



Beiträge: 1.134
Anmeldedatum: 08.01.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 28.08.2015, 11:55     Titel:
  Antworten mit Zitat      
Das macht zwar Dreiecke und Tetraeder, aber vielleicht kannst Du ja was brauchbares rausziehen: http://persson.berkeley.edu/distmesh/
Private Nachricht senden Benutzer-Profile anzeigen
 
dresel
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 7
Anmeldedatum: 27.08.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 28.08.2015, 16:03     Titel:
  Antworten mit Zitat      
Danke ich werds mir mal anschauen.
Private Nachricht senden Benutzer-Profile anzeigen
 
dresel
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 7
Anmeldedatum: 27.08.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 29.08.2015, 12:32     Titel:
  Antworten mit Zitat      
Ok also bis ich da bei den Dreiecken und Tetraedern durchsteige glaub ich dauert etwas Wink.
Eine andere Überlegung wäre die Anzahl der Ecken zu begrenzen auf sagen wir mal 6 und dann über eine Fallunterscheidung zu gehen.

Für Dreiecke ist es ja relativ einfach da muss man ja nur jeweils einen Eckpunkt mit den Mittelpunkten der Seiten verbinden.
Bei den Vierecken kann man überprüfen ob sie parallele Seiten haben, bei 2x2 parallelen Seiten hat man ja schon ein Parallelogramm bei 1x2 parallelen Seiten hat man ein Trapez und muss noch die Winkel mit berücksichtigen um es auf 2 parallelogramme aufteilen zu können.

Der Ansatz für Vierecke mit Winkeln < 180° gefällt mir aber nicht so besonders, hierfür verbinde ich die Mittelpunkte der Seiten miteinander und erhalte so das erste Parallelogramm, weitere 4 Parallelogramme entstehen durch die Verbindung von jeweils einem Eckpunkt mit den benachbarten Mittelpunkten, also habe ich dann insgesamt 5 Parallelogramme Sad.

Für alles andere fehlt mir noch eine Idee wie ich das machen könnte, bin für Anregungen dankbar Wink

Gruß
Thomas
Private Nachricht senden Benutzer-Profile anzeigen
 
marvin.be
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 54
Anmeldedatum: 28.08.15
Wohnort: ---
Version: R2013b
     Beitrag Verfasst am: 29.08.2015, 14:30     Titel:
  Antworten mit Zitat      
Hi Thomas,
vielleicht liegt es daran das dein eigenes Bild etwas schief aussieht (zum Mindestens bei mir), aber ich bin nicht so ganz sicher nach welche Kriterien du da was einteilen willst.

Nehmen wir mal das oben bereits genannte Bild von dir. Wenn ich mir das Ausgangsbild anschaue, würde ich behaupten die linke und die rechte Ausseite sind parallel zueinander. Daraus würde für mich folgen das Ausgangsbild ist EIN Parallelogramm, Fall gelöst. Durch welches Kriterium kommst du dann auf die kleinen Strukturen in der Mitte? Wie bereits erwähnt, wenn ich mir das anschaue sieht das einfach nur scheps aus, die Eckpunkte der kleinen Parallelogramme liegen nicht auf Eckpunkten/Linien der Ausgangsstruktur, manche Linien formen Dreiecke und keine Parallelogramme etc.

Eine Idee für Trapeze:

Wie wäre es wenn du von der Ausgangsstruktur zwei Eckpunkte nimmst, das ist deine "Basislinie", von dieser schiebst du iterativ eine Linie in Richtung des Schwerpunktes der Ausgangsstruktur. Die Fläche (definiert durch Basislinie und 2 Schnittpunkte neue parellel Linie/Ausgangsstrujtur) wächst also irgendwie an und wenn sich die "Umfangslinie" ändert (Stelle dir deine Ausgangsstruktur z.B. in Form einer 2D Sanduhr vor), wird sich deine Fläche nicht mehr nach dem Gleichen Prinzip ändern z.B. sind im Bereich der Sanduhr Taillie die kleinen Flächen dA_j-1 > dA_j < dA_j+1. Du weißt also dass sich in Schritt j nach j+1 was geändert hat. Dann lässt du von MatLab eine parallele Linie zu deiner Basislinie ziehen an Stelle j und hast dein erstes Trapez. Jetzt subtrahierst du Trapez von Ausgangsfläche und fängst von vorne an indem du eine neue Basislinie auswählen lässt.

Das Gute daran ist das sich das wahrscheinlich recht einfach implementieren lässt, du durch die iterativen Schritte Kontrolle über die Genauigkeit deiner Trapeze hast und du kannst auch dafür sorgen das du verschiedene Eckpunkte für deine erste, zweite, ..., n-te Basislinie auswählen lässt und dir am Ende das Ergebnis mit den wenigsten Trapezen ausgeben lassen kannst (oder machst Statistik etc.)

Am Beispiel der Sanduhr würdest du die Ausgangsform im Idealfall in der Mitte durchteilen und du erhälst 2 Trapeze.

Gruß Marvin
Private Nachricht senden Benutzer-Profile anzeigen
 
dresel
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 7
Anmeldedatum: 27.08.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 29.08.2015, 16:33     Titel:
  Antworten mit Zitat      
Hallo,

stimmt so im Nachhinein ist es wirklich etwas kompliziert die Parallelogramme darin zu erkennn Laughing .

Ich hab mal nochmal eine Datei angehängt in der die Eckpunkte bezeichnet sind, die Parallelogramme sind folgende:
AFCE
EGHB
FCBI
NMPO
RSTQ

die 2 Parallelogramme in der Mitte hab ich einfach so reingelegt um die Fläche zu füllen. Es geht darum die Fläche ABCF mit Parallelogrammen auszufüllen, wobei sich diese auch überlagern dürfen.

Die Außenkontur kann sich aber nicht selbst schneiden, also Formen wie eine Sanduhr sind also schonmal nicht möglich Smile .

Trapeze helfen mir leider nicht weiter, aber ich schau mal ob ich das vielleicht auf Parallelogramme übertragen kann.

Gruß
Thomas

Screenshot 2015-08-29 17.25.27.png
 Beschreibung:

Download
 Dateiname:  Screenshot 2015-08-29 17.25.27.png
 Dateigröße:  101.37 KB
 Heruntergeladen:  410 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
marvin.be
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 54
Anmeldedatum: 28.08.15
Wohnort: ---
Version: R2013b
     Beitrag Verfasst am: 31.08.2015, 08:49     Titel:
  Antworten mit Zitat      
Bei der Sanduhr habe ich mehr an so was gedacht: Link, eben etwas mit einer etwas breiteren Taille, sodass sich die Außenform nicht schneidet.

Nochmal zurück zu deinem Kriterium wie du Parallelogramme da reinlegen willst.
Die Parallelogramme MNOP und QRST sind ja willkürlich gewählt in Form und Orientierung. Gibt es da ein Kriterium? (z.B. (Überlapp-)Fläche soll minimal sein, sollen gleiche Orientierung haben etc.)
Bislang sehe ich nur das der Rand passend mit Parallelogrammen ausgefüllt sein muss, damit man nicht einfach ein Parallelogramm über alles drüber legt.

Unterm Strich glaube ich das du dir über diese Kriterien/Randbedingungen klar sein musst, bevor du anfängst da irgendwas zu programmieren.

Gruß,
Marvin
Private Nachricht senden Benutzer-Profile anzeigen
 
dresel
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 7
Anmeldedatum: 27.08.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 01.09.2015, 09:45     Titel:
  Antworten mit Zitat      
Hmm, da hab ich wohl meine Gedanken nicht vollständig zu Papier gebracht Very Happy .
Ja die beiden Parallelogramme (MNOP, QRST) sind willkürlich gewählt einziges Kriterium was ich dafür hatte war dass ich die Fläche komplett abdecken musste (mit den Parallelogrammen am Rand blieb mir ein Dreieck in der Mitte übrig) zudem dürfen die Parallelogramme nicht über die Kontur rausstehen.

Inzwischen habe ich auch schon einen Ansatz gefunden. Ich suche mir einen Ausganspunkt der Kontur und teile die Fläche von diesem aus in Dreiecke auf (ein Dreieck kann ja immer mit 3 Parallelogrammen erzeugt werden) dann spiegle ich die Dreiecke an allen drei Seiten und prüfe ob der gespiegelte Punkt innerhalb der Kontur liegt oder nicht. Wenn ja dann habe ich ein Parallelogramm gefunden wenn nein erzeuge ich 3 Parallelogramme.

Nachteile dieser Methode sind zum einen dass geringfügig mehr Parallelogramme erzeugt werde als nötig und dass es bei Hinterschneidungen (Winkel > 180°) zu Problemen kommen kann.

Vermutlich stellt es so manchem Programmierer bei dem Code die Haare auf aber ich poste ihn trotzdem mal vielleicht hilft es ja zum Verständnis.
Einfach eine Variable namens Coord erstellen und in die erste Spalte die X-Koordinaten und die zweite die Y-Koordinaten der Kontureckpunkte schreiben.

Code:
clear CoordNeu

%Ermitteln des 4 Parallelogrammpunktes (durch aufteilen der Fläche in
%Dreiecke und spiegeln an allen 3 Seiten
for i = 3:size(Coord,1)
    CoordNeu(i-2,1:2) = Coord(1,:) + Coord(i,:) - Coord(i-1,:);
    CoordNeu(i-2,3:4) = Coord(1,:) - Coord(i,:) + Coord(i-1,:);
    CoordNeu(i-2,5:6) = Coord(1,:) + Coord(i,:) - Coord(1,:) + Coord(i-1,:) - Coord(1,:);
end

%Prüfen ob der Punkt in der Fläche liegt
[in] = inpolygon(CoordNeu(:,1:2:5), CoordNeu(:,2:2:6), Coord(:,1), Coord(:,2));

%Erzeugen der Parallelogramme
clear ParallelogrammCoord
Parallelogramm = false;
for i = 1:size(in,1)
    for j = 1:3
        if Parallelogramm == true
        %Prüfen ob das Parallelogramm in der Fläche liegt
        elseif in(i,j) == 1
            Parallelogramm = true;
            switch j
                case 1
                    if exist('ParallelogrammCoord')
                        ParallelogrammCoord(size(ParallelogrammCoord,1) + 1,1:8) = [Coord(1,:) Coord(i+1,:) Coord(i+2,:) CoordNeu(i,2*j-1:2*j)];
                    else
                        ParallelogrammCoord(1,1:8) = [Coord(1,:) Coord(i+1,:) Coord(i+2,:) CoordNeu(i,2*j-1:2*j)];
                    end
                case 2
                    if  exist('ParallelogrammCoord')
                        ParallelogrammCoord(size(ParallelogrammCoord,1) + 1,1:8) = [Coord(1,:) CoordNeu(i,2*j-1:2*j) Coord(i+1,:) Coord(i+2,:)];
                    else
                        ParallelogrammCoord(1,1:8) = [Coord(1,:) CoordNeu(i,2*j-1:2*j) Coord(i+1,:) Coord(i+2,:)];
                    end
                case 3
                    if  exist('ParallelogrammCoord')
                        ParallelogrammCoord(size(ParallelogrammCoord,1) + 1,1:8) = [Coord(1,:) Coord(i+1,:) CoordNeu(i,2*j-1:2*j) Coord(i+2,:)];
                    else
                        ParallelogrammCoord(1,1:8) = [Coord(1,:) Coord(i+1,:) CoordNeu(i,2*j-1:2*j) Coord(i+2,:)];
                    end
            end
        %sonst aufteilen des Dreiecks in 3 Parallelogramme
        elseif sum(in(i,:)) == 0
            %Berechnung der Seitenmittelpunkte
            Mittelpunkt1 = Coord(1,:) + (Coord(i+1,:) - Coord(1,:))/2;
            Mittelpunkt2 = Coord(i+2,:) + (Coord(i+1,:) - Coord(i+2,:))/2;
            Mittelpunkt3 = Coord(1,:) + (Coord(i+2,:) - Coord(1,:))/2;
            %Erzeugen der Parallelogramme
            if exist('ParallelogrammCoord')
                ParallelogrammCoord(size(ParallelogrammCoord,1) + 1,1:8) = [Coord(1,:) Mittelpunkt1 Mittelpunkt2 Mittelpunkt3];
            else
                ParallelogrammCoord(1,1:8) = [Coord(1,:) Mittelpunkt1 Mittelpunkt2 Mittelpunkt3];
            end
            ParallelogrammCoord(size(ParallelogrammCoord,1) + 1,1:8) = [Coord(i+1,:) Mittelpunkt2 Mittelpunkt3 Mittelpunkt1];
            ParallelogrammCoord(size(ParallelogrammCoord,1) + 1,1:8) = [Coord(i+2,:) Mittelpunkt3 Mittelpunkt1 Mittelpunkt2];
            Parallelogramm = true;
        end
    end
    Parallelogramm = false;
end
%Doppelte Einträge löschen
ParallelogrammCoord = unique(ParallelogrammCoord,'rows');

%Anzeige der Parallelogramme
for i = 1:size(ParallelogrammCoord,1)
    fill(ParallelogrammCoord(i,1:2:7), ParallelogrammCoord(i,2:2:8),'r')
    hold on
end
hold off

%Aufräumen des Workspace
clear Mittelpunkt1 Mittelpunkt2 Mittelpunkt3 Parallelogramm i in j CoordNeu
 
Private Nachricht senden Benutzer-Profile anzeigen
 
marvin.be
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 54
Anmeldedatum: 28.08.15
Wohnort: ---
Version: R2013b
     Beitrag Verfasst am: 01.09.2015, 10:58     Titel:
  Antworten mit Zitat      
Wenn du noch dazuschreibst wie Coord gefüllt ist, kann ich mir dein Programm mal anschauen. So wie das momentan aussieht ist Coord eine 3xN Matrix, also schreibe mal eine Zeile der Form:

Code:

Coord = [a1, b1, c1 ; a2, b2, c2 ; ... ; N1, N2, N3];
 
Private Nachricht senden Benutzer-Profile anzeigen
 
dresel
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 7
Anmeldedatum: 27.08.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 01.09.2015, 11:45     Titel:
  Antworten mit Zitat      
Wo hab ich nur wieder mein Hirn Smile

Code:
Coord = [785 -40; 720 -5; 750 50; 915 -40; 915 -250; 835 -215];
Private Nachricht senden Benutzer-Profile anzeigen
 
marvin.be
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 54
Anmeldedatum: 28.08.15
Wohnort: ---
Version: R2013b
     Beitrag Verfasst am: 01.09.2015, 12:18     Titel:
  Antworten mit Zitat      
Na sieht doch schon recht anschaulich aus! Smile

Wenn ich das richtig sehe gehst du ja nun stets "von Punkt zu Punkt" um deine Dreiecke usw. zu erstellen. Man könnte sich also überlegen ob man dem Programm gewisse Freiheiten gibt in dem es solch einen Punkt verschieben darf um z.B. ein großes Parallelogramm anstelle von zwei kleinen zu bekommen.

Allerdings denke ich das sowas viel Programmierzeit benötigt und unterm Strich wird man wahrscheinlich viele viele Iterationen durchlaufen lassen müssen, um ein "schönes" Bild zu bekommen. Sprich man nimmt die am Anfang gefundenen Koordinaten, wählt eine Form aus und verschiebt davon einen Punkt in eine Richtung bis der Punkt z.B. außerhalb der Form ist oder sonst an Grenzen stößt. Dann den nächsten Punkt wählen etc. dann die nächste Form usw.

Kommt immer drauf an wie viel Zeit und Liebe man in so ein Projekt stecken will Smile
Private Nachricht senden Benutzer-Profile anzeigen
 
dresel
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 7
Anmeldedatum: 27.08.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 01.09.2015, 12:32     Titel:
  Antworten mit Zitat      
Hmm, das wäre auch ein interessanter Ansatz muss ich mir mal überlegen ob ich das hinbekomme.
Was ich mir noch überlegt habe ist dass ich jeden Punkt als Ausgangspunkt verwenden könnte und dann im nachhinein abfragen mit welcher Variante ich am wenigsten Parallelogramme erhalte.

Davor werde ich aber noch versuchen das Problem mit dem Hinterschnitt zu lösen, sieht man recht schön wenn man die erste Zeile der Koordinaten nach hinten schiebt:

Code:
Coord = [720 -5; 750 50; 915 -40; 915 -250; 835 -215; 785 -40];
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen



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.