2009-12-28 13 views
8

Ich habe einen 3D-Raum (x, y, z) mit einem zusätzlichen Parameter an jedem Punkt (Energie), der insgesamt 4 Dimensionen von Daten ergibt.Interpolation eines Skalarfelds in einem 3D-Raum

Ich würde gerne eine Menge von x, y, z Punkten finden, die einer Iso-Energiefläche entsprechen, die durch Interpolation zwischen den bekannten Punkten gefunden wird.

Die räumliche Gitter hat konstantem Abstand und umgibt die Iso-Energie Oberfläche vollständig, jedoch ist es nicht eine kubische Raum einnehmen (das Netz befindet sich in einem etwa zylindrischen Raum)

Geschwindigkeit nicht entscheidend ist, kann ich diese verlassen Nummerieren für eine Weile. Obwohl ich in Python und NumPy codiere, kann ich Teile des Codes in FORTRAN schreiben. Ich kann auch vorhandene C/C++/FORTRAN-Bibliotheken für die Verwendung in den Skripten umschließen, wenn solche Bibliotheken vorhanden sind.

Alle Beispiele und Algorithmen, die ich bisher online (und in Numerical Recipes) gefunden habe, haben keine 4D-Daten mehr.

+0

BTW - Numerische Rezepte haben Algorithmen, um dies in der neuesten Ausgabe zu behandeln - Sie haben nur noch mit Daten in 3D zu tun, dh: Daten an einem einzigen 3D-Ort gespeichert. Alle radialen Basisfunktionsinterpolatoren in Numerischen Receipes sind hier anwendbar und werden in 3D diskutiert (die meisten erstrecken sich auf nD). –

+0

Ja, Sie haben Recht. Meine Ausgabe ist 1992, aber es gibt Rezepte (oder 2D-Analogien) für die nD-Interpolation, vorausgesetzt, das Gitter hat 'tabellierte Funktionswerte ... an den Scheitelpunkten eines rechteckigen Arrays'. Ich hatte den Eindruck, dass, da das Gitter (das zugegebenermaßen auf feinem Niveau gleichmäßig mit rechteckiger Periodizität verteilt ist) einen ungefähr zylindrischen Raum füllt, den die Techniken nicht anwenden würden. – Brendan

Antwort

8

Es gibt durchaus ein paar andere Optionen ...

Um Ihre Energie in Ihrem Netz zu bekommen, müssen Sie irgendeine Form von Interpolation verwenden. Shepard's method ist eine gebräuchliche und relativ einfache Methode, die implementiert werden kann, und funktioniert in der Regel gut, wenn Ihre Datenverteilung angemessen ist.

Sobald Sie das getan haben, müssen Sie eine Form von isosurface Generation zu tun.

Es gibt einige Bibliotheken da draußen, um das zu vereinfachen. Vor allem enthält VTK Python-Wrapper und verfügt über alle erforderlichen Tools, um diese beiden Schritte auszuführen.

Für Details, wie dies in VTK getan werden kann, können Sie vtkShepardMethod und vtkContourFilter überprüfen.

1

Warum nicht versuchen Quadlinear-Interpolation?

erweitern Sie die trilineare Interpolation um eine andere Dimension. Solange ein lineares Interpolationsmodell zu Ihren Daten passt, sollte es funktionieren.

2

Da Sie ein räumliches Netz mit konstantem Abstand haben, können Sie alle Nachbarn auf gegenüberliegenden Seiten der Isofläche identifizieren. Wählen Sie eine Form der Interpolation (q.v. Reed Copseys Antwort) und suchen Sie root entlang der Linie zwischen jedem dieser Nachbarn.