双线性插值 java方式实现

双线性插值其实就是用了三次线性插值取计算指定位置的坐标

实现方法比较笨 就是把公式转换成了代码而已

最近对插值重新封装了一次。 更新一下 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);
    }
  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
双线性插值是一种图像处理算法,用于在离散的图像数据点间估计一个新点的值。在Java实现双线性插值,可以按照以下步骤进行: 1. 首先,确定需要进行插值的目标点的坐标(x, y)。 2. 找到目标点周围的四个已知点(x1, y1)、(x1, y2)、(x2, y1)和(x2, y2),其中x1 <= x <= x2,y1 <= y <= y2。 3. 分别计算目标点在x和y方向上的插值权重。在x方向上,计算比例因子s = (x - x1) / (x2 - x1),在y方向上,计算比例因子t = (y - y1) / (y2 - y1)。 4. 根据插值权重和已知点的值,计算目标点的插值值。插值公式为: interpolatedValue = (1 - s) * (1 - t) * value1 + s * (1 - t) * value2 + (1 - s) * t * value3 + s * t * value4, 其中value1、value2、value3和value4分别是已知点的值。 5. 返回计算得到的目标点的插值值。 可以用以下Java代码实现双线性插值: ```java public class BilinearInterpolation { public static double interpolate(double[][] data, double x, double y) { int x1 = (int) Math.floor(x); int x2 = x1 + 1; int y1 = (int) Math.floor(y); int y2 = y1 + 1; double s = x - x1; double t = y - y1; double value1 = data[x1][y1]; double value2 = data[x1][y2]; double value3 = data[x2][y1]; double value4 = data[x2][y2]; double interpolatedValue = (1 - s) * (1 - t) * value1 + s * (1 - t) * value2 + (1 - s) * t * value3 + s * t * value4; return interpolatedValue; } } ``` 该代码段中的`data`表示已知点的二维数组,`x`和`y`为目标点的坐标。利用`interpolate`方法可以计算出目标点的插值值。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值