双三次插值?

2023-11-24

我浏览了互联网,就双三次插值而言,我找不到一个简单的方程。维基百科关于该主题的页面不是很有帮助,那么有没有简单的方法来学习双三次插值的工作原理以及如何实现它?我用它来生成柏林噪声,但使用双线性插值对于我的需求来说是不稳定的(我已经尝试过)。

如果有人可以通过一个好的网站或只是一个答案来为我指明正确的方向,我将不胜感激。 (顺便说一句,我正在使用 C#)


Using this(感谢发现这个的 Ahmet Kakıcı),我想出了如何添加双三次插值。对于那些也在寻找答案的人,这是我使用的:

private float CubicPolate( float v0, float v1, float v2, float v3, float fracy ) {
    float A = (v3-v2)-(v0-v1);
    float B = (v0-v1)-A;
    float C = v2-v0;
    float D = v1;

    return A*Mathf.Pow(fracy,3)+B*Mathf.Pow(fracy,2)+C*fracy+D;
}

为了获得 2D 插值,我首先获得 x,然后对 y 进行插值。例如。

float x1 = CubicPolate( ndata[0,0], ndata[1,0], ndata[2,0], ndata[3,0], fracx );
float x2 = CubicPolate( ndata[0,1], ndata[1,1], ndata[2,1], ndata[3,1], fracx );
float x3 = CubicPolate( ndata[0,2], ndata[1,2], ndata[2,2], ndata[3,2], fracx );
float x4 = CubicPolate( ndata[0,3], ndata[1,3], ndata[2,3], ndata[3,3], fracx );

float y1 = CubicPolate( x1, x2, x3, x4, fracy );

其中 ndata 定义为:

float[,] ndata = new float[4,4];
for( int X = 0; X < 4; X++ )
    for( int Y = 0; Y < 4; Y++ )
        //Smoothing done by averaging the general area around the coords.
        ndata[X,Y] = SmoothedNoise( intx+(X-1), inty+(Y-1) );

(intx和inty是请求坐标的下取整值。fracx和fracy是输入坐标的小数部分,即x-intx, and y-inty, 分别)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

双三次插值? 的相关文章

随机推荐