Einführung
Diesen Sommer bin ich auf einer Technologie-Abteilung in Västerås tätig. Ich habe in der gleichen Firma und etwa zur gleichen Büro für drei gerade Sommer gearbeitet. Die Arbeit ist sehr technisch, Spaß und Herausforderung. Im Gegensatz zu vielen anderen Sommer-Job in einem Büro, fand ich, wo ich die Verantwortung und lernen Sie mit gemeinsamen Aufgaben zu arbeiten. Insbesondere arbeite ich mit, Werkzeuge zu entwickeln, um die Berechnung der Arbeit, die meist Matlab, GUI-Programmierung und Java vereinfachen. Das neue Objekt-orientierte Stil des MatLab macht den Code sehr viel klarer als vor ein paar Jahren.
Das Problem
Neulich stand ich vor einer kleinen Herausforderung. Vereinfachte konzentrierte sie sich auf der Suche nach einem Polygon, das eine Reihe von komplexen Punkte, die in der Ebene verstreut sind umschließt. Anfangs wusste ich nicht finden, die Funktion, dass dies in MatLab, das war natürlich komisch. Ich beschloss daher, einen benutzerdefinierten Algorithmus zu finden. In diesem Beitrag werde ich beschreiben, meinen Algorithmus.
Meine Alogritm
Ich beschreibe mein Algorithmus Abbildung 2. Zunächst werde ich die Schwierigkeiten bei der Wohnungssuche. Die Sache ist die, dass alle Punkte in einer Struktur sind unsortiert. Wenn die Punkte um einen Mittelpunkt herum angeordnet werden, können Sie die Reihenfolge und der Abstand von der Mitte, um das Problem zu lösen. Es dauert mindestens O (n log (n)), um eine lineare sortiert. Mein Algorithmus arbeitet in der unsortierten Liste und wird wohl noch mehr Zeit, ich habe keine Beweise abgeleitet.
Die Idee ist, zumindest mit meinem Punkt in der x-Richtung zu beginnen und dann den Punkt finden, an dem der k-Wert wird das Maximum. dh, zu berechnen:
max (K_i) = (Y_MIN - y_i) / (x_min - x_i) für i = [all issues] Dies gibt Ihnen die Stelle p_2..
Alle Punkte mit kleineren y-Wert als X_min ausgeschlossen werden kann. Alle Punkte mit kleineren x-Wert als p_2 könnte auch zur weiteren Lektüre ausgeschlossen werden.
K_2 gefunden, dann mit der Suche nach dem Punkt, dass minimiert:
K_1 - (y_1 - y_i) / (x_1 - x_i) für i = [alle nicht ausgeschlossenen Artikel]
Auf die gleiche Weise gefunden k_a in der Regel durch:
min (k_a-1 - (y_a-1 - y_i) / (x_a-1 - x_i)) für i = [alle nicht ausgeschlossenen Artikel]
Die Berechnung ist für die obere Hälfte des Polygons getan, bis Sie auf den Punkt, die maximal in der x-Richtung erhalten. Danach wird der gleiche Algorithmus für die untere Hälfte des Polygons.
Performance
Die Leistung des Algorithmus davon abhängt, wie viele Punkte, die am Ende in polygonet. Ich weiß, wie viele linjärsök der Liste, wie es Punkte bekommt in polygonet. Dies bedeutet, dass die Komplexität O (N * die Anzahl der Suche) ist. Die Anzahl der Punkte in der optimalen polygonet ist zwischen 10 und 25 je nach Ihrer Chance Punkte. Der Algorithmus ist also relativ schnell.
Code
Der Code ist nicht öffentlich.
Matlab Solution - konvexe Hülle
Mein Algorithmus macht das Gleiche wie Matlab-Funktion convhull . Konvexen Hülle ist somit das englische Wort für ein geschlossenes Polygon oder einen konvexen Körper. Eine andere gute Quelle ist http://en.wikipedia.org/wiki/Convex_hull_algorithms erklärt, dass das theoretische Minimum Zeit zu einer konvexen Schale zu finden von der Ordnung O (n log (n)) ist.








