我有一组3D点定义3D轮廓。我想做的是获得与该轮廓
(see Minimal Surfaces in Wikipedia)相对应的最小表面表示。基本上,这需要求解非线性偏微分方程。
我需要在Python中进行这样一个实现,但是要知道我没有找到任何关于如何实现的Web资源。
任何人可以指出任何这样的实现的资源/例子吗?
谢谢,
米格尔
更新
我想要找到的3D表面(理想的是三角形网格表示)是由这组3D点限定的(如图中所示,这些点位于最佳拟合平面):
好的,所以做一些研究,我发现这个最小的表面问题与Biharmonic Equation的解决方案有关,我也发现Thin-plate spline是这个方程式的根本解决方案。
所以我认为这种方法是尝试使用薄板样条拟合表面的稀疏表示(由点的3D轮廓给出)。我发现使用薄板样条插值分散数据(x,y,z格式)以获得均匀网格上的ZI坐标(XI,YI)的this example in scipy.interpolate。
出现两个问题:
(1)薄板样条插值是否是从3D轮廓点集合计算曲面的问题的正确方法?
(2)如果是,如何使用NON-UNIFORM网格在scipy上执行薄板插值?
再次感谢!
米格尔
更新:MATLAB中的实现(但它不在SCIPY PYTHON上工作)
我跟着this example使用Matlab的tpaps函数,并获得了在均匀网格上适合我轮廓的最小表面。这是Matlab中的结果(看起来很棒!):
但是我需要在Python中实现,所以我使用的是scipy.interpolate.Rbf和薄板功能。以下是python中的代码(XYZ包含轮廓中每个点的3D坐标):
GRID_POINTS = 25
x_min = XYZ[:,0].min()
x_max = XYZ[:,0].max()
y_min = XYZ[:,1].min()
y_max = XYZ[:,1].max()
xi = np.linspace(x_min, x_max, GRID_POINTS)
yi = np.linspace(y_min, y_max, GRID_POINTS)
XI, YI = np.meshgrid(xi, yi)
from scipy.interpolate import Rbf
rbf = Rbf(XYZ[:,0],XYZ[:,1],XYZ[:,2],function='thin-plate',smooth=0.0)
ZI = rbf(XI,YI)
然而,这是结果(与Matlab中获得的结果完全不同):
很显然,scipy的结果不符合最小的表面。
是scipy.interpolate.Rbf薄板做的预期,为什么不同于Matlab的结果?