双线性插值其实就是用了三次线性插值取计算指定位置的坐标
实现方法比较笨 就是把公式转换成了代码而已
最近对插值重新封装了一次。 更新一下 2021-03-09
首先是线性插值:
已知AC的距离,以及AC各自的值(A=0,B=10,AB的距离=20) B点在距A 5处,AC之间的值呈线性分布,计算B点的值
/**
* 线性插值
* p1------p-------p2
* v1------v-------v2
*
* @param p 插值点坐标
* @param p1 顶点坐标1
* @param p2 顶点坐标2
* @param v1 顶点数值1
* @param v2 顶点数值2
* @return 插值后的数值
*/
public static double linearInterpolation(double p, double p1, double p2, double v1, double v2) {
if (NumberUtil.compare(v1, v2) == 0 || NumberUtil.compare(p1, p2) == 0) {
//value值相等 距离为0 不进行插值计算
return v1;
} else {
return ((p2 - p) / (p2 - p1) * v1) + ((p - p1) / (p2 - p1) * v2);
}
}
使用以上代码就可计算出B点的值
双线性插值
引用张度娘的图片,双线性 就像上面说的 使用3次线性插值 就可计算到P点的值
先计算R2 R1的值 然后根据R2 R1 在去计算P点的值 (使用线性插值去计算)
这是我这边的实现插值部分的代码代码
/**
* 双线性插值 计算点v处的实际值
* 点位分布如图 v(x,y) v1(x1,y1) v2(x1,y2) v3(x2,y1) v4(x2,y2)
* v2-----------v4
* | |
* r1-----v-----r2
* | |
* v1-----------v3
* 先通过线性插值计算r1 r2处的实际值 然后通过r1 r2计算v的值
*
* @param x 实际x坐标
* @param y 实际y坐标
* @param x1 x1
* @param x2 x2
* @param y1 y1
* @param y2 y2
* @param v1 左下value
* @param v2 左上value
* @param v3 右下value
* @param v4 右上value
* @return double
*/
public static double doubleLinearInterpolation(double x, double y,
double x1, double x2, double y1, double y2,
double v1, double v2, double v3, double v4) {
double r1 = linearInterpolation(x, x1, x2, v1, v2);
double r2 = linearInterpolation(x, x1, x2, v3, v4);
return linearInterpolation(y, y1, y2, r1, r2);
}