Thema Datum  Von Nutzer Rating
Antwort
05.04.2011 16:41:43 Jan
NotSolved
08.04.2011 11:14:30 Holger
NotSolved
Rot Quick-Hull-Klasse in VBA übersetzen
10.04.2011 23:02:33 Jan
NotSolved
21.04.2011 19:06:01 Holger
NotSolved
22.04.2011 10:24:55 Holger
NotSolved
28.04.2011 21:14:36 Jan
NotSolved
29.04.2011 00:56:30 Jan
NotSolved
30.04.2011 11:20:07 Gast10485
NotSolved
03.05.2011 17:22:18 Gast9766
Solved
10.10.2011 20:32:25 Gast93608
NotSolved
11.10.2011 11:04:15 Holger
NotSolved

Ansicht des Beitrags:
Von:
Jan
Datum:
10.04.2011 23:02:33
Views:
2034
Rating: Antwort:
  Ja
Thema:
Quick-Hull-Klasse in VBA übersetzen

 

Hallo Holger, hallo Leser, 

vielleicht hast du Recht, ich dachte es würde die Sache leichter machen, wenn ich den "Mathe-Teil" auslassen würde, aber du hast Recht, man sollte schon wissen, was das Ding eigenltich machen soll ;)

 

Jetzt hatte ich etwas Zeit die Beschreibung zu dem Code rauszusuchen. Ich müsste den Code allerdings noch erweitern, ich brauche nämlich nicht nur das Polygon selbst sondern den Umfang, bzw. die Länge der Hülle, dass sollte aber eine getrennte Baustelle werden. Ich habe mit VBA syntaxtechnisch wenig Erfahrung und in der Programmiersprache des Code gar keine, daher hoffe ich auf Tipps oder Hinweise bzgl. der Umsetzung. Geht diese Konstruktion/Logik so in VBA? Falls ja dann versuche ich sie funktion für funktion nachzubauen, aber falls aufgrund von variablentypen oder funktionsrückgabewerte (bsp. kein array möglich), rekursion und Gültigkeit von Variablen...Probleme entstehen könnten, wäre es sehr hilfreich das im Vorfeld zu berücksichtigen und einen workaround zu finden...

Danke jedenfalls für das Interesse!

 

Jan 

 

 

 

Algorithmus Graham-Scan

Eingabe: Array p mit n Punkten
Ausgabe: Array p derart umgeordnet, dass die ersten h Einträge die Ecken des konvexen Hüllpolygons sind
Methode:
  1. bestimme Punkt q mit minimaler y-Koordinate;
  2. subtrahiere q von allen Punkten des Arrays (so dass q selbst zum Nullpunkt wird);
  3. sortiere die Punkte des Arrays nach ihrem Winkel, und bei gleichem Winkel nach ihrem Abstand zum Nullpunkt (der Punkt q wird zu p0);
  4. addiere q zu allen Punkten des Arrays (so dass die ursprünglichen Punkte wieder­hergestellt werden);
  5. // durchlaufe die Punkte und überbrücke konkave Ecken:

    setze i = 3 und k = 3;

    solange k<n

    1. vertausche pi und pk;
    2. solange pi-2 pi-1 pi nicht konvex
      1. vertausche pi-1 und pi;
      2. setze i = i – 1;
    3. setze i = i + 1 und k = k + 1;

    setze h = i;

 

Der Algorithmus hat die kleine Unschönheit, dass die letzte Ecke des berechneten konvexe Hüllpolygons eine 180°-Ecke sein kann (vgl. Bild 2). Wenn dies stört, ist es einfach, diese noch zu entfernen.

Um die Punkte nach ihrem Winkel zu sortieren, ist es nicht nötig, die Winkel tatsächlich zu berechnen. Der Sortier­algorithmus muss nur wissen, welcher von jeweils zwei Punkten pi und pj den größeren Winkel hat. Dies lässt sich danach entscheiden, ob das Dreieck 0 pi pj einen positiven oder negativen Flächeninhalt hat. Der doppelte Flächeninhalt ergibt sich durch die einfache Berechnung xiyj – xjyi (vgl. Fläche eines Dreiecks ). Bei gleichem Winkel, d.h. wenn die Dreiecksfläche gleich Null ist, werden die Punkte nach ihrem Abstand zum Nullpunkt sortiert. Es genügt hier, mit dem Manhattan-Abstand |x| + |y| zu rechnen.

Die Methode isLess der Klasse Point implementiert einen solchen Vergleich. Sie wird in der Sortier­funktion des Graham-Scan-Algorithmus benutzt.

Die folgende Klasse GrahamScan implementiert den Graham-Scan-Algorithmus. Der Aufruf erfolgt mit

    GrahamScan c=new GrahamScan();
    h=c.computeHull(p);

Hierbei ist p ein Array von Punkten. Als Ergebnis der Berechnung werden die Punkte im Array so umgeordnet, dass die ersten hPunkte die Ecken des konvexen Hüllpolynoms in umlaufender Reihenfolge bilden.

Die weiteren Funktionen sind Hilfs­funktionen. Die Funktion exchange(ij) vertauscht zwei Punkte im Array. Die FunktionmakeRelTo(p0) rechnet alle Punkte des Arrays relativ zu p0 als Nullpunkt um. Die Funktion indexOfLowestPoint() sucht den Punkt mit kleinster y-Koordinate, oder bei mehreren Punkten mit kleinster y-Koordinate, von diesen den Punkt mit kleinster x-Koordinate. Als Ergebnis wird die Position des Punktes im Array zurückgegeben. Die Funktion isConvex(i) testet, ob die Punkte pi-1 pi pi+1 eine konvexe Ecke eines Polygonzuges darstellen. Für das Sortieren der Punkte wird Quicksort verwendet.

 


Ihre Antwort
  • Bitte beschreiben Sie Ihr Problem möglichst ausführlich. (Wichtige Info z.B.: Office Version, Betriebssystem, Wo genau kommen Sie nicht weiter)
  • Bitte helfen Sie ebenfalls wenn Ihnen geholfen werden konnte und markieren Sie Ihre Anfrage als erledigt (Klick auf Häckchen)
  • Bei Crossposting, entsprechende Links auf andere Forenbeiträge beifügen / nachtragen
  • Codeschnipsel am besten über den Code-Button im Text-Editor einfügen
  • Die Angabe der Emailadresse ist freiwillig und wird nur verwendet, um Sie bei Antworten auf Ihren Beitrag zu benachrichtigen
Thema: Name: Email:



  • Bitte beschreiben Sie Ihr Problem möglichst ausführlich. (Wichtige Info z.B.: Office Version, Betriebssystem, Wo genau kommen Sie nicht weiter)
  • Bitte helfen Sie ebenfalls wenn Ihnen geholfen werden konnte und markieren Sie Ihre Anfrage als erledigt (Klick auf Häckchen)
  • Bei Crossposting, entsprechende Links auf andere Forenbeiträge beifügen / nachtragen
  • Codeschnipsel am besten über den Code-Button im Text-Editor einfügen
  • Die Angabe der Emailadresse ist freiwillig und wird nur verwendet, um Sie bei Antworten auf Ihren Beitrag zu benachrichtigen

Thema Datum  Von Nutzer Rating
Antwort
05.04.2011 16:41:43 Jan
NotSolved
08.04.2011 11:14:30 Holger
NotSolved
Rot Quick-Hull-Klasse in VBA übersetzen
10.04.2011 23:02:33 Jan
NotSolved
21.04.2011 19:06:01 Holger
NotSolved
22.04.2011 10:24:55 Holger
NotSolved
28.04.2011 21:14:36 Jan
NotSolved
29.04.2011 00:56:30 Jan
NotSolved
30.04.2011 11:20:07 Gast10485
NotSolved
03.05.2011 17:22:18 Gast9766
Solved
10.10.2011 20:32:25 Gast93608
NotSolved
11.10.2011 11:04:15 Holger
NotSolved