Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 样条曲面插值_Algorithm_Math_3d_Spline - Fatal编程技术网

Algorithm 样条曲面插值

Algorithm 样条曲面插值,algorithm,math,3d,spline,Algorithm,Math,3d,Spline,假设有n个点定义了z轴上的曲面 f(x1,y1) = 10 f(x2,y2) = 12 f(x3,y3) = 5 f(x4,y4) = 2 ... f(xn,yn) = 21 现在我想要能够近似地得到f(x,y)。我正在寻找一个线性算法,尤其是样条曲线近似算法。一个示例算法或至少一些指针会很好。您可以使用您的点作为Bezier(或Bspline)曲面的控制点,特别是当(xi,yi)在XY平面中采样矩形时。在这方面,没有合适的地方 您将获得的曲面将位于点的凸包中,并将在{xi,yi}的边界处与点

假设有n个点定义了z轴上的曲面

f(x1,y1) = 10
f(x2,y2) = 12
f(x3,y3) = 5
f(x4,y4) = 2
...
f(xn,yn) = 21

现在我想要能够近似地得到f(x,y)。我正在寻找一个线性算法,尤其是样条曲线近似算法。一个示例算法或至少一些指针会很好。

您可以使用您的点作为Bezier(或Bspline)曲面的控制点,特别是当
(xi,yi)
XY
平面中采样矩形时。在这方面,没有合适的地方

您将获得的曲面将位于点的凸包中,并将在
{xi,yi}
的边界处与点相交(插值)


如果你想做实验,在
Matlab
中似乎包含简单的代码,如果你没有
Matlab
,你也可以用它来做同样的事情(尽管它需要计算程序的文件格式)。

这是对线性近似方法的模糊描述

  • 确定点的位置(对于平面中的每个点,找到最近的
    (x\u i,y\u i)
  • 如果有一段线段的点,
    (x\u i,y\u i)
    (x\u j,y\u j)
    的距离是相等的(并且比任何其他线对都近)
  • 在每个三角形上,找到通过三个顶点的平面。这是您需要的线性插值

  • 下面将在Python中实现前两个步骤。你生活的规律性 网格可以让你加快速度(也可能会搞乱三角测量)

    导入itertools
    “”基于http://stackoverflow.com/a/1165943/2336725 """
    def为ccw(tri):
    返回((tri[1][0]-tri[0][0])*(tri[1][1]+tri[0][1])
    +(tri[2][0]-tri[1][0])*(tri[2][1]+tri[1][1])
    +(tri[0][0]-tri[2][0])*(tri[0][1]+tri[2][1])<0
    def外圆包含点(三角形,点):
    将numpy作为np导入
    矩阵=np.数组([[p[0],p[1],p[0]**2+p[1]**2,1]表示三角形中的p+点])
    返回值为逆时针(三角形)=(np.linalg.det(矩阵)>0)
    三角剖分=集合()
    """
    Delaunay三角剖分中的三角形当且仅当其外接性
    圆不包含其他点。此实现为O(n^4)。更快的方法
    在http://en.wikipedia.org/wiki/Delaunay_triangulation
    """
    对于itertools中的三角形。组合(点,3):
    三角形_为空=真
    对于点到点:
    如果三角形中的点:
    下一个
    如果外圆包含点(三角形,点):
    三角形_为空=假
    打破
    如果三角形_为空:
    三角剖分。添加(三角形)
    
    对不规则二维数据进行插值并不是那么容易。我知道没有真正的样条线推广到不规则二维

    除了基于三角剖分的方法外,您还可以查看Barnes()和反向距离加权()或更一般的RBF()


    如果您的点分布非常不均匀(密集簇),则可能需要使函数的大小自适应,或者采用近似而不是插值。

    wikipedia][1]文章有点令人望而生畏,但至少请尝试查看示例部分。[1] :您是规则网格上的x,y控制点吗?对于形式为f(x,y)的函数,更常见的做法是假设基础数据的形式(K次多项式、N高斯和等),然后通过最小二乘法确定系数。这里行吗?你知道这些数据代表什么吗?如果您真的想要样条曲线,那么NURBS值得一看。它们具有很好的渲染特性。构造(x,y)点的Delaunay三角剖分以获得基础,除非它们位于规则网格上。对于平面拟合,你需要一个标准的最小二乘拟合,我不需要样条曲线。线性的就足够了。关于平面拟合,我不能说太多,但数据点位于规则网格上。只是缺少了一些数据点。最终的实现必须是ruby,所以Matlab不是一个真正的选项。但问题确实是关于XY平面上的矩形。我从未使用过Ruby,但我确信它有一个Bezier/Bspline包。实际上,它们并没有扩散太多。最糟糕的情况是,我甚至可以使用线性插值,但我更喜欢更平滑的曲面。近似听起来也是一个有趣的角度。径向基函数+1。几年前,我写了一篇论文,研究这些被推广到流形上的函数的对象。只要你没有稠密的星团,而且n点的数目不太大,它们就可以工作得很好。(如果n确实变大了,你希望你的RBF有紧凑的支持,这样所涉及的矩阵是稀疏的。但是你需要使用稀疏线性代数来保持它的可接受的伸缩性。)漂亮、平滑的插值。