图形学初识--直线插值算法

为什么需要插值算法?

不说大道理,承接上文直线光栅化。已知屏幕两个点,计算出以这两点为端点的直线经过的所有像素,准确的说是像素点的坐标;但是,像素是有颜色属性的,端点的颜色已知,但是中间点颜色是未知的,这时候为了给这些中间点补充颜色属性,就需要引入插值算法,在这个场景下就叫直线的线性插值!

插值算法是什么?

插值算法是一种通过已知数据点值来估计未知数据点值的方法。基本思想:基于已知数据点构建一个函数,该函数能够通过这些点,并估计这些点之间的值!

有哪些常见的插值算法呢?

1. 线性插值(Linear Interpolation)

线性插值是一种最简单的插值方法,它假设两个相邻点之间的函数变化是线性的。即,对于两个已知数据点 ( x 0 , y 0 ) , ( x 1 , y 1 ) (x_0,y_0),(x_1,y_1) (x0,y0),(x1,y1) ,插值点 ( x , y ) (x,y) (x,y)​ 可以通过以下公式计算:
y = y 0 + ( y 1 − y 0 ) ( x − x 0 ) ( x 1 − x 0 ) y = y_0 + \frac{(y_1-y_0)(x-x_0)}{(x_1-x_0)} y=y0+(x1x0)(y1y0)(xx0)
线性插值简单且计算快速,但它只能在两个已知点之间产生线性估计,可能不适用于变化较复杂的数据。

2. 多项式插值(Polynomial Interpolation)

多项式插值使用一个多项式函数来通过所有已知数据点。拉格朗日插值(Lagrange Interpolation)和牛顿插值(Newton Interpolation)是两种常见的多项式插值方法。对于 𝑛+1个数据点,可以找到一个 𝑛 次多项式通过这些点:
P ( x ) = a 0 + a 1 x + a 2 x 2 + . . . + a n x n P(x) = a_0 + a_1x + a_2x^2 + ... + a_nx^n P(x)=a0+a1x+a2x2+...+anxn
多项式插值可以提供更精确的估计,但当点数较多时,高次多项式可能出现震荡现象(龙格现象)。

3. 样条插值(Spline Interpolation)

样条插值使用低次多项式段(通常是三次样条)连接所有数据点,同时确保在每个数据点处多项式的连续性和光滑性。三次样条插值常用于曲线拟合和图形处理。

4. 最近邻插值(Nearest-Neighbor Interpolation)

最近邻插值使用距离目标点最近的已知点的值作为估计值。这种方法简单且计算快速,但可能会导致不连续和不平滑的结果。

5. 双线性插值(Bilinear Interpolation)

双线性插值用于二维数据网格,它在每个方向上进行线性插值。对于四个相邻点,插值点的值通过对两个方向的线性插值计算得出。它常用于图像处理中的像素值插值。

6. 双三次插值(Bicubic Interpolation)

双三次插值使用三次多项式进行插值,比双线性插值能产生更平滑的结果。它通常用于高质量图像缩放。

7. 克里金插值(Kriging Interpolation)

克里金插值是一种地统计学方法,基于已知点的统计性质进行插值。它考虑了空间自相关性,常用于地理信息系统(GIS)和环境科学。

直线如何线性插值?

问题描述:已知直线起始端点 p 0 = ( x 0 , y 0 ) p_0 = (x_0, y_0) p0=(x0,y0) p 1 = ( x 1 , y 1 ) p_1 = (x_1, y_1) p1=(x1,y1) f ( p 0 ) = v 0 f(p_0) = v_0 f(p0)=v0 f ( p 1 ) = v 1 f(p_1) = v_1 f(p1)=v1,求直线上任意一点 p = ( x , y ) p=(x,y) p=(x,y) f ( p ) = ? f(p) = ? f(p)=?

1、暴力法

算法步骤描述:

  • 计算 p 0 p_0 p0 p 1 p_1 p1 的距离,记为 d d d

  • 计算 p p p p 0 p_0 p0 p 1 p_1 p1 的距离,分别记为 d 0 d_0 d0 d 1 d_1 d1

  • 计算权值 w e i g h t = d 0 / d weight = d_0 / d weight=d0/d

  • 计算 p p p点的属性值 f ( p ) = w e i g h t ∗ f ( p 1 ) + ( 1 − w e i g h t ) ∗ f ( p 0 ) f(p) = weight * f(p_1) + (1 - weight) * f(p_0) f(p)=weightf(p1)+(1weight)f(p0)

如图所示:

在这里插入图片描述

2、优化法

本质思路:计算点和点的距离是比较耗时的,咱们可以用初中数学知识,相似三角形从而简化问题的计算,提高性能!

算法步骤描述:

  • 计算 d x = x 1 − x 0 d_x = x_1 - x_0 dx=x1x0 d y = y 1 − y 0 d_y = y_1 - y_0 dy=y1y0 ,咱们假设 d x ! = 0 d_x != 0 dx!=0 其实y方向也是类似同理

  • 计算 d p = x − x 0 d_p = x - x_0 dp=xx0

  • 计算权值 w e i g h t = d p / d x weight = d_p / d_x weight=dp/dx

  • 计算 p p p点的属性值 f ( p ) = w e i g h t ∗ f ( p 1 ) + ( 1 − w e i g h t ) ∗ f ( p 0 ) f(p) = weight * f(p_1) + (1 - weight) * f(p_0) f(p)=weightf(p1)+(1weight)f(p0)

如图所示:

在这里插入图片描述

效果展示:

咱们用一个从红色到绿色的直线,上效果图:

在这里插入图片描述

结尾:喜欢的小伙伴可以点点关注+赞哦

希望对各位小伙伴能够有所帮助哦,永远在学习的道路上伴你而行, 我是航火火,火一般的男人!

  • 28
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值