2017-12-01 8 views
1

Ich habe eine 2D-Punktwolke, die jeweils einen skalaren Wert enthält. Angenommen, dieser Wert kann an jedem beliebigen Punkt auf der Ebene interpoliert werden, und ich habe einen Freiheitsgrad, um die genaue Interpolationsformel zu wählen, solange sie glatt ist und konvergiert zu den gegebenen Punkten, wenn sie in ihrer Nähe berechnet werden. Mein Ziel ist es, geschlossene Konturen zu konstruieren, die einem konstanten Skalarwert entsprechen.Berechnen von 2D-Konturen aus der Punktwolke

Mein spezieller Fall ist etwas komplexer, aber der Einfachheit halber nehmen wir an, dass wir eine Geländehöhe (Höhe) an einigen Punkten haben, und wir müssen Konturen konstanter Höhe für einige gegebene Werte davon konstruieren. Konturen sollten durch Polylinien approximiert werden.

Zuvor erhielt ich die Punkte in Form eines regelmäßigen Gitters, und ich löste es, indem ich die Kontursegmente in jeder Gitterzelle separat untersuchte und (wenn nötig) baute. Das heißt, für jede Gitterzelle habe ich die Werte in den Ecken geprüft, um zu erkennen, ob die Kontur Zellengrenzen überschreiten sollte (einige Ecken sollten höher und einige niedriger sein), und jeweils die Schnittpunkte berechnet.

Jetzt muss ich dies aus beliebigen Punktwolke rekonstruieren.

Natürlich kann ich aus der Punktwolke (da wir interpolieren) ein regelmäßiges Gitter bauen, dicht genug, aus dem die Konturen berechnet werden können, aber ich hätte gerne einen effizienteren Algorithmus. Meine Idee ist es, die Punkte in der Wolke so zu verbinden, dass die Ebene von Dreiecken (oder komplexeren konvexen Polygonen) bedeckt wird, die jeweils eine Gitterzelle bilden. Dann kann ich Konturen so wie früher konstruieren.

Gibt es einen bekannten Algorithmus, um speziell dieses Problem zu lösen?

Update:

Dank @coproc. Ich kenne Delaunay Triangulation, und das ist wahrscheinlich der Weg zu gehen. Es gibt jedoch immer noch Fragen darüber, wie man in beliebigen Punkten auf einer Ebene interpoliert: Wäre es ausreichend, nur die Dreiecksspitzen oder auch andere nahegelegene Punkte zu betrachten. In einem unbalanzierten Fall kann es eine Situation geben, in der ein Punkt in extremer Nähe zu dem Dreieck ist. Zum Beispiel hier:

Als Alternative kann ich denken, nur von einem beliebigen Punkt in einer Ebene ausgehend und dann senkrecht auf den Gradienten, um die Konturen zu erstellen.

+1

würde eine Delaunay-Triangulation helfen? (https://en.wikipedia.org/wiki/Delaunay_triangulation) – coproc

+0

@ Coproc: danke.Siehe Update – valdo

Antwort

1

Dies scheint wie ein GIS-Interpolation/Extrapolationsproblem. Es gibt mehrere Techniken, um "intelligenter" zu interpolieren, und ich würde vorschlagen, dass Sie zuerst die inverse Distanzgewichtung (IDW) und dann Kriging versuchen, wenn Sie Zeit haben, darauf zu achten.

IDW kurz gesagt basiert auf dem "ersten Gesetz der Geographie": Dinge nahe beieinander korrelieren. Sie geben engeren Punkten höhere Gewichte und interpolieren das Gitter.

Kriging versucht, die Ausrichtung der betreffenden Phänomene zu berücksichtigen und passt die Gewichte entsprechend an. Stellen Sie sich eine Hauptkomponentenanalyse für die Nachbarschafts- und Skalierungspunktabstände gemäß der Varianz in verschiedenen Richtungen vor.

Dies ist ein kurzer Blick auf einige der bestehenden Methoden. http://www.bisolutions.us/A-Brief-Introduction-to-Spatial-Interpolation.php

+0

Interpolation w.r.t. Gewicht = 1/R (oder alternativ 1/R^n) klingt vernünftig. Dies bedeutet jedoch, dass ** alle ** Proben berücksichtigt werden müssen. Vielleicht sollten einige Cutoff-Kriterien verwendet werden – valdo

+0

Das ist eine vernünftige Annahme. Der Radius (oder die Anzahl der benachbarten Punkte) ist eine etwas offene Frage. Wenn es Ihr Zeitlimit für die Datenverarbeitung erlaubt, würde ich vorschlagen, mit verschiedenen Radien herumzuspielen. Dies sollte zu relativ guten Ergebnissen führen, aber alles hängt von Ihren Daten und Bedürfnissen ab. Alternativ könnten Sie versuchen, ein Semi-Variogramm Ihrer Daten zu bilden (z-Wert-Differenz vs. xy-Abstand), dort eine Linie/Kurve anpassen und die Abschneide- und vielleicht nicht-lineare Abstandsgewichtungsfunktion herleiten. Siehe hier für weitere Details http://gisgeography.com/semi-variogram-nugget-range-sill/ – Rooscannon

+0

Ah, btw .. Diese Techniken gehen davon aus, dass du es irgendwie geschafft hast, die charakteristischen Punkte deiner Oberfläche zu erfassen, also die Peaks und Talböden, Kanten. Wenn Ihre reale Welt höhere Spitzen als Ihre Daten aufweist, sind sie verloren. Auch wenn Sie 1/R^n verwenden, haben die weiteren Punkte praktisch Nullgewichte und tragen nicht zur Interpolation bei. Ein großes n könnte jedoch eine "polygonisierte" Ausgabe ergeben, da alle Punkte einen Wert erhalten, der ihrem nächsten Punkt sehr ähnlich ist. – Rooscannon

Verwandte Themen