c - 线性插值 : calculate correction based on 2D table

标签 c math 2d interpolation linear-interpolation

我尝试做一件应该只不过是二维线性插值的事情,但目前我找不到正确的方法。稍微简化一下来描述问题:有一个大小为 3000x3000 像素的绘图区域,我必须在其中绘图,例如一条水平线。为此,我从每个像素位置到下一个像素位置绘制点或短线,然后形成一条线。

现在必须对整个事物应用校正,校正信息可以在(对于此示例简化)4 x 4 数组中找到,其中每个元素包含一对描述校正后值的坐标。所以一个中性数组(没有校正)看起来像这样:

0,0      1000,0      2000,0      3000,0
0,1000   1000,1000   2000,1000   3000,1000
0,2000   1000,2000   2000,2000   3000,2000
0,3000   1000,3000   2000,3000   3000,3000

真正的校正表将包含描述要完成的校正的其他坐标:

enter image description here

因此,作为输入数据,我有未经校正的线上点的坐标、未经校正的字段值和校正数据。但是我如何计算现在应用校正值的线点,以便绘制一条扭曲的线,如图像右侧所示?我目前对 X 和 Y 使用两个单独的线性插值的方法不起作用,Y 位置在单元格边界上跳跃,但在单元格内不会平滑变化。

那么...有什么想法可以做到这一点吗?

最佳答案

您必须首先就插值方法达成一致。我会建议双线性或重心插值。在 one of my previous posts我直观地看到了这两种方法之间的区别。

我将专注于双线性插值。我们想要将单元格内的任何点转换为它的校正点。因此,所有的点都可以单独转换。

我们需要点(x, y) 的插值参数uv。因为我们有一个轴对齐的网格,所以这很简单:

u = (x - leftCellEdge) / (rightCellEdge - leftCellEdge)
v = (y - bottomCellEdge) / (topCellEdge - bottomCellEdge)

我们可以通过双线性插值重建点:

p2       p4
   x----x
   |  o |
   x----x
p1       p3

o = (1 - u) * ((1 - v) * p1 + v * p2) + u * ((1 - v) * p3 + v * p4)

现在,相同的公式可以用于校正点。如果您使用原始点 p1p4,您将得到未修正的线点。如果您对 p1p4 使用更正的单元格点,您将获得更正的线点。

关于c - 线性插值 : calculate correction based on 2D table,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23077084/

相关文章:

java - 除数

math - 旋转插补

c - 根据我的编译器的说法,我错误地使用了指针来设置二维数组的值。但是,我不确定我到底做错了什么

c - 为什么这段代码没有给出所需的输出?

c - Visual Studio C 中的动态数组

c - C 中的变量声明是否仅限于外部关键字与定义

java - 二维数组中的寻路

c - pgm-file I/O 给我一半的数据

algorithm - 寻找科赫曲线的坐标

c - '错误: expected expression before '{' token' - matrix as member of struct