Ich habe eine Skalarfunktion über den Eckpunkten eines Oberflächennetzes definiert. Ich möchte eine ungefähre (und verallgemeinerte, nehme ich an) "Gaußsche Unschärfe / Faltung" dieser Funktion über die Oberfläche berechnen.
Ich kann mir vorstellen, für jeden Scheitelpunkt einen Durchschnitt der Funktion an Scheitelpunkten in seiner (Multi-Hop-) Nachbarschaft zu nehmen, gewichtet nach dem Gaußschen ihrer euklidischen Entfernung (in R3) vom aktuellen Scheitelpunkt multipliziert mit dem lokalen Bereich, den sie darstellen. Diese Annäherung wäre gut, wenn die Oberfläche im Maßstab des Gaußschen Kerns nicht zu gekrümmt wäre. Es wäre jedoch immer noch rechenintensiv.
Gibt es einen effizienteren Faltungsalgorithmus, der möglicherweise auf einer Art iteriertem "Fluss" oder teilweisem Austausch durch Kanten des Netzes basiert?
Das Netz kann entweder dreieckige oder viereckige Flächen haben - je nachdem, was für die Beantwortung dieser Frage bequemer ist. Die Kantenlängen sind jedoch nicht konstant, sodass sich die lokale Nachbarschaftsgeometrie zwischen den Scheitelpunkten unterscheidet.
quelle
Antworten:
Ein paar verschiedenen Ansätze
Ich werde einige Variationen Ihrer spezifischen Anfrage in Betracht ziehen, da Sie die Effizienz erwähnen und ich vermute, dass Ihre spezifische Anfrage die am wenigsten effiziente ist. Ich werde auch Möglichkeiten zur Verbesserung der Effizienz vorschlagen, ohne von Ihrem beabsichtigten Ansatz abzuweichen, damit Sie die Alternativen abwägen können.
Verwischen des Volumens anstelle der Oberfläche
Wenn Sie möchten, dass die Abstandsmetrik eine euklidische 3D-Entfernung anstelle einer euklidischen 2D-Entfernung innerhalb der Oberfläche ist, können Sie die Unschärfe in einem regulären 3D-Raster ausführen, auf das die von Ihnen beabsichtigte Skalarfunktion angewendet wurde. Anschließend können Sie das Endergebnis Ihrer Differenz der Gaußschen Werte verwenden, um die Skalarwerte an den Eckpunkten Ihres unregelmäßigen Netzes zu berechnen. Dadurch wird vermieden, dass die Netzform für den Großteil der Berechnung berücksichtigt werden muss.
Das 3D-Gitter hat wahrscheinlich eine viel größere Anzahl von Scheitelpunkten als das 2D-Netz, aber sie sind alle gleich weit voneinander entfernt und die große Kernel-Unschärfe kann durch wiederholtes Anwenden einer kleinen Kernel-Unschärfe erreicht werden, wobei nur die 6 nächsten Nachbarn berücksichtigt werden. das wird immer in einem konstanten Abstand entfernt sein. Dieser Ansatz beinhaltet möglicherweise mehr Berechnungen, aber die Leichtigkeit, mit der das reguläre Netz GPU-beschleunigt werden könnte, kann attraktiv sein.
Dies ergibt ein anderes Ergebnis als die Unschärfe an den Netzscheitelpunkten unter Verwendung des euklidischen 3D-Abstands. Beispielsweise wird der 3D-Gitteransatz durch bestimmte Bereiche der 3D-Skalarfunktion beeinflusst, die sich in der Nähe des Netzes befinden, sich jedoch nicht auf dem Netz befinden. Dies kann abhängig von Ihrem spezifischen Zweck wünschenswert sein oder nicht.
Verwenden der 2D-Entfernung anstelle der 3D-Entfernung
Wenn Sie feststellen, dass die Abstandsmetrik innerhalb der Oberfläche 2D-euklidisch sein muss, können Sie eine gute Annäherung an eine größere Kernel-Gauß-Unschärfe erhalten, indem Sie wiederholt eine kleinere Kernel-Gauß-Unschärfe anwenden. Wenn die Kantenlängen in Ihrem Netz nicht zu stark variieren, können Sie möglicherweise eine Kernelgröße auswählen, bei der bei jeder Iteration nur Scheitelpunkte mit einer Kante entfernt berücksichtigt werden. Dies ermöglicht die Verwendung nur einzelner Kantenlängen zur Berechnung der Größe des Beitrags eines Scheitelpunkts, anstatt einen 2D-Mehrkantenabstand zu berechnen.
3D-Abstand unter Verwendung der Oberfläche ohne Volumen
Wenn Sie möchten, dass die Berechnung genau wie in Ihrer Frage beschrieben ist und nicht innerhalb des umgebenden Volumens, sondern auch innerhalb des euklidischen 3D-Abstands berechnet wird, funktioniert die Verwendung der nächsten Nachbarn und mehrerer Iterationen nicht. Wenn das Netz nicht nahezu flach ist, führt die wiederholte Anwendung einer Unschärfe des nächsten Nachbarn zu einer Annäherung an den euklidischen 2D-Abstandsfall, da die Werte nur von Scheitelpunkt zu Scheitelpunkt bluten können und nicht direkt auf dem kürzesten Weg, wie sie sind würde in einem einzigen Durchgang. Dies ergibt eine geringere Streuung als bei einem einzelnen Durchgang, bei dem der 3D-Abstand zu einem 10 Kanten entfernten Scheitelpunkt berechnet wird. (Ich habe 10 Kanten verwendet, seit Sie in Ihrem Kommentar zu der Frage einen 10-Sprung erwähnt haben.)
Das Implementieren der Unschärfe in einem einzigen Durchgang bedeutet, dass der euklidische 3D-Abstand zwischen jedem Scheitelpunkt und jedem anderen Scheitelpunkt innerhalb eines Radius von 10 Kanten berechnet wird. Dies wird teuer, aber durchaus möglich. Da Sie die Effizienz erwähnen, sollten Sie berücksichtigen, dass Sie einige Redundanzen beseitigen können, sofern Sie über ausreichend verfügbaren Speicher verfügen.
Die beiden Unschärfen, die Sie vor der Differenzierung der Gaußschen Werte erzeugen, verwenden denselben Satz von 3D-Abständen bis zum Kantenradius der kleineren Kernel-Unschärfe. Wenn Sie diese speichern können, müssen Sie sie nur einmal und nicht einmal pro Unschärfe berechnen.
Außerdem wird jeder Abstand zweimal pro Unschärfe verwendet - einmal in jeder Richtung, da die Länge von Scheitelpunkt A zu Scheitelpunkt B der Länge von B nach A entspricht. Durch Zwischenspeichern / Speichern dieser Abstände werden sie nicht zweimal berechnet.
Effekte von beliebig vielen Kanten entfernt
Wenn die Oberflächenkurven so sind, dass einige Scheitelpunkte, die viele Kanten entfernt sind, immer noch nahe genug sind, um sich in 3D-Entfernung gegenseitig zu beeinflussen, müssen Sie möglicherweise alle Scheitelpunkte innerhalb eines bestimmten 3D-Radius berücksichtigen, anstatt Scheitelpunkte innerhalb einer bestimmten Anzahl von Kanten entfernt zu berücksichtigen , unabhängig davon, wie lang der Weg über Kanten ist. In diesem Fall können Sie weniger Scheitelpunkte berücksichtigen, indem Sie die Raumpartitionierung verwenden und eine bestimmte Methode auswählen, die zum Netz passt.
Wenn Sie nicht möchten, dass Teile der Oberfläche, die sich einander nähern, sich gegenseitig beeinflussen, möchten Sie wahrscheinlich eine 2D-Abstandsmetrik anstelle der 3D-Metrik.
Wenn Sie einen großen Bereich unterschiedlicher Kantenlängen haben, kann es sein, dass Sie nicht in der Lage sind, eine festgelegte Anzahl von Kanten zu definieren, die durchlaufen werden sollen, selbst wenn das Netz ziemlich flach ist. Auch hier müssen Sie möglicherweise einen 3D-Abstand anstelle einer Anzahl von Kanten definieren und alle Scheitelpunkte berücksichtigen, die innerhalb dieses Radius liegen.
quelle