Ich habe einen 3D-Raum (x, y, z) mit einem zusätzlichen Parameter an jedem Punkt (Energie), der insgesamt 4 Dimensionen von Daten ergibt.
Ich würde gerne eine Menge von x-, y-, z-Punkten finden, die einer Iso-Energie-Oberfläche entsprechen, die durch Interpolation zwischen den bekannten Punkten gefunden wird.
Das räumliche Gitter hat einen konstanten Abstand und umgibt die iso-Energie-Oberfläche vollständig, nimmt jedoch keinen kubischen Raum ein (das Gitter besetzt einen ungefähr zylindrischen Raum)
Geschwindigkeit ist nicht entscheidend, ich kann diese Nummer für eine Weile knirschen lassen. 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.
Hier gibt es einige Optionen ...
Um Ihre Energie in Ihr Mesh zu bekommen, müssen Sie eine Art von Interpolation verwenden. Die Methode von Shepard ist eine gängige und relativ einfache Methode zur Implementierung und funktioniert gut, wenn Ihre Datenverteilung vernünftig ist.
Sobald Sie das erledigt haben, müssen Sie eine Form der Isooberflächen-Generation erstellen.
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 für diese beiden Schritte.
Details dazu, wie dies in VTK gemacht werden kann, finden Sie vtkShepardMethod und vtkContourFilter .
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 führen Sie eine Wurzelfindung entlang der Linie zwischen jedem dieser Nachbarn durch.
Tags und Links python algorithm interpolation