www.wikidata.de-de.nina.az
Der Gift Wrapping Algorithmus auch Jarvis March genannt ist ein Algorithmus zur Berechnung der konvexen Hulle einer Punktemenge im zweidimensionalen Raum Er wurde 1973 von R A Jarvis veroffentlicht Der Algorithmus gehort zu den ausgabesensitiven englisch output sensitive Algorithmen Animation des Gift Wrapping Algorithmus Die rote Linien zeigen die bereits gefundenen Strecken der konvexen Hulle die schwarze zeigt die aktuell Beste und die grune Linie zeigt die Strecke die gerade uberpruft wird Inhaltsverzeichnis 1 Beschreibung 2 Pseudocode 3 Programmierung 4 Literatur 5 Weblinks 6 EinzelnachweiseBeschreibung BearbeitenGegeben sei eine Menge S s 1 s n displaystyle S s 1 dotsc s n nbsp von Punkten in einer Ebene Als Startpunkt P 0 displaystyle P 0 nbsp wird der Punkt mit der kleinsten Ordinate gewahlt Sind dies mehrere so wird aus diesen der Punkt mit der kleinsten Abszisse gewahlt Der Startpunkt ist somit Teil der konvexen Hulle Nun wird ein beliebiger Punkt aus der Menge S displaystyle S nbsp gewahlt mit welchem der Startpunkt eine Gerade bildet Als nachstes werden die restlichen Punkte aus der Menge S displaystyle S nbsp uberpruft ob ein Punkt links dieser Geraden liegt Rechts und links ergeben sich in diesem Zusammenhang aus dem Winkel zwischen dem Richtungsvektor der Trennungsgeraden und dem Vektor definiert durch den Anfangspunkt der Geraden und den zu uberprufenden Punkt Ist dieser Winkel kleiner als 180 dann wird der Punkt als rechts von der Geraden betrachtet bei Winkeln grosser 180 als links von ihr Wird ein Punkt links der Geraden gefunden bildet P 0 displaystyle P 0 nbsp mit diesem eine neue Gerade Anschliessend wird der Rest der Menge S displaystyle S nbsp uberpruft Fur jeden Punkt der links von dieser Geraden liegt wird dieser Vorgang wiederholt Wurden alle Punkte uberpruft ist der zuletzt gefundene Punkt P 1 displaystyle P 1 nbsp der nachste Punkt auf der konvexen Hulle Nun wird P 1 displaystyle P 1 nbsp als neuer Startpunkt gewahlt und der gesamte Vorgang wiederholt bis P 0 displaystyle P 0 nbsp wieder der Startpunkt ist Fur jeden Punkt auf der konvexen Hulle muss die komplette Menge S displaystyle S nbsp durchlaufen werden Dieser Teil wird in einer Schleife ausgefuhrt wobei jeder Schleifendurchlauf eine Laufzeit von O n displaystyle mathcal O n nbsp besitzt Sei h displaystyle h nbsp die Anzahl der Punkte auf der konvexen Hulle ergibt sich eine Laufzeit von O n h displaystyle mathcal O nh nbsp Im Worst Case wenn alle Punkte auf der konvexen Hulle liegen ergibt sich somit eine Laufzeit von O n 2 displaystyle mathcal O n 2 nbsp Da der Algorithmus von der Anzahl der Punkte auf der konvexen Hulle abhangt gehort er zu den sogenannten ausgabesensitiven Algorithmen Pseudocode Bearbeiten nbsp Gift Wrapping Algorithmus nach dem 4 Durchlauf der Do while Schleife jarvis S startpunkt Punkt mit kleinster Ordinate i 0 wiederhole P i startpunkt endpunkt S 0 wenn startpunkt endpunkt endpunkt S 1 fur j von 1 bis S ist endpunkt startpunkt oder S j links von der Geraden zwischen startpunkt und endpunkt endpunkt S j startpunkt endpunkt i bis endpunkt P 0 Programmierung BearbeitenDas folgende Beispiel in der Programmiersprache C zeigt die Implementierung des Gift Wrapping Algorithmus Die Punkte und die konvexe Hulle werden auf dem Hauptfenster gezeichnet Das Programm verwendet mehrere Klassen Die Methoden fur den eigentlichen Algorithmus werden in der Klasse GiftWrapping deklariert 1 2 Code Schnipsel using System using System Collections Generic using System Drawing using System Windows Forms public class GiftWrapping Diese Methode bestimmt die Orientierung des drei Punkte Wenn die Punkte im Uhrzeigersinn sind wird ein Wert grosser als 0 zuruckgegeben Wenn die Punkte im Gegenuhrzeigersinn sind wird ein Wert kleiner als 0 zuruckgegeben Wenn die Punkte kollinear sind wird der Wert 0 zuruckgegeben public int GetOrientation Point point1 Point point2 Point point3 return point2 Y point1 Y point3 X point2 X point2 X point1 X point3 Y point2 Y Diese Methode gibt eine Liste der Punkte der konvexen Hulle zuruck public List lt Point gt GetConvexHull List lt Point gt points List lt Point gt convexHull new List lt Point gt int numberOfpoints points Count if numberOfpoints lt 3 Wenn weniger als 3 Punkte vorhanden sind wird eine leere Liste zuruckgegeben return convexHull float minimumX points 0 X int indexOfMinimum 0 Diese for Schleife durchlauft die verbleibenden Punkte und ermittelt den Punkt ganz links und bei Gleichheit den untersten Punkt for int i 1 i lt numberOfpoints i float x points i X if x lt minimumX minimumX x amp amp points i Y lt points indexOfMinimum Y minimumX points i X indexOfMinimum i int currentIndex indexOfMinimum int nextIndex Diese do while Schleife beginnt beim Punkt ganz links und lauft im Gegenuhrzeigersinn bis sie wieder den Anfangspunkt erreicht Die Anzahl der Durchlaufe der Schleife ist die Anzahl der Punkte der konvexen Hulle do convexHull Add points currentIndex Fugt den aktuellen Punkt der Liste der Punkte der konvexen Hulle hinzu nextIndex currentIndex 1 numberOfpoints Erhoht den Index nextIndex um 1 und setzt ihn zuruck auf 0 wenn der maximale Wert uberschritten ist Diese for Schleife durchlauft alle Punkte und sucht einen Punkt mit Index nextIndex sodass die Punkte mit den Indexen currentIndex nextIndex x fur alle Indexe x im Gegenuhrzeigersinn sind for int i 0 i lt numberOfpoints i if GetOrientation points currentIndex points nextIndex points i lt 0 Wenn der Punkt mit Index i weiter im Gegenuhrzeigersinn liegt als der Punkt mit Index nextIndex wird nextIndex aktualisiert nextIndex i Der Punkt mit Index nextIndex ist der Punkt der in Bezug auf den Punkt mit Index currentIndex am weitesten im Gegenuhrzeigersinn liegt Nach der folgenden Zuweisung wird dieser Punkt der konvexen Hulle hinzugefugt currentIndex nextIndex while currentIndex indexOfMinimum While we don t come to first return convexHull Klasse fur das Hauptfenster public partial class MainForm Form private Graphics graphics private List lt Point gt points new List lt Point gt Liste der Punkte private List lt Point gt convexHull new List lt Point gt Liste der Punkte der konvexen Hulle private double x1 y1 x2 y2 public MainForm x1 100 y1 100 x2 700 y2 700 Setzt die Koordinaten der Eckpunkte der quadratischen Zeichenflache Random random new Random Initialisiert den Zufallsgenerator int numberOfPoints 100 for int i 0 i lt numberOfPoints i Diese for Schleife erzeugt 100 zufallige Punkte innerhalb der quadratischen Zeichenflache Point point new Point point X int random NextDouble x2 x1 x1 point Y int random NextDouble y2 y1 y1 points Add point Fugt den Punkt der Liste hinzu GiftWrapping giftWrapping new GiftWrapping Erzeugt ein Objekt der Klasse GiftWrapping convexHull giftWrapping GetConvexHull points Aufruf der Methode die die konvexe Hulle zuruckgibt InitializeComponent Text Konvexe Hulle Width 800 Height 800 graphics CreateGraphics Erzeugt ein Grafikobjekt fur das Zeichnen auf dem Hauptfenster Paint OnPaint Verknupft die Ereignisbehandlungsmethode mit dem Paint Ereignis des Hauptfensters Diese Methode wird aufgerufen wenn das Hauptfenster gezeichnet wird private void OnPaint object sender PaintEventArgs e for int i 0 i lt points Count i graphics FillRectangle new SolidBrush Color FromArgb 0 0 0 points i X 1 points i Y 1 2 2 Zeichnet die Punkte int numberOfPoints convexHull Count for int i 0 i lt numberOfPoints i graphics DrawLine new Pen Color FromArgb 0 0 255 convexHull i convexHull i 1 numberOfPoints Zeichnet die Kanten der konvexen Hulle Literatur BearbeitenJarvis R A On the identification of the convex hull of a finite set of points in the plane In Information Processing Letters 2 Jahrgang 1973 S 18 21 doi 10 1016 0020 0190 73 90020 3 Weblinks BearbeitenErklarung und PseudocodeEinzelnachweise Bearbeiten OpenGenus IQ Gift Wrap Algorithm Jarvis March Algorithm to find Convex Hull GeeksforGeeks Convex Hull Abgerufen von https de wikipedia org w index php title Gift Wrapping Algorithmus amp oldid 217481983