我有一个向量,它存储从文件std::vector <int> density;
导入的一组值。input.csv
这些值在 0 到 2^16 之间变化,并在规则的int C
列和int L
行网格上排序。
现在,我想使用双线性插值来计算一组新值std::vector <float> D
这些新值将排列在另一个规则的int x
列和int y
行网格中。
.
我的问题:
要基于数据的平方网格执行双线性插值,我必须知道每个位置(x,y)
的本地 4 个周围density
值是什么:
D1 (C,L), D2 (C,L), D3 (C,L), D4 (C,L)
换句话说,每个D
具有位置的插值点(Dx,Dy)
- Dx 和 Dy 低于或等于 1 - 位于原始数据集的平方“单元格”内,该单元格由 4 个density
值定义,相对于它们(C,L)
在原始网格中的位置。
对于 4 个周围值(Dx,Dy)
范围内C
和L
(不在网格之外!)的任意位置,我如何轻松定义?density
D1, D2, D3, D4
以及如何在(D1, D2, D3, D4)
单元格内(u,v)
定义点定义的位置d
(请参阅代码以了解点d
)在单元格内
如果您可以帮助我改进代码... :) 谢谢!
//
为了更容易概念化,这里有一个数值示例:
输入.csv
200; 300; 400
100; 100; 100
0; 100; 200
列数:
C = 3
行数:
L = 3
在推回这些之后,向量 a 包含以下内容:
200, 300, 400, 100, 100, 100, 0, 100, 200
新文件的列数:x = 4
新文件的行数:y = 4
该算法应执行以下操作:
对于职位(Dx, Dy) = (0, 0)
(u, v) = (0, 0)
我们在第一个牢房,所以
(D1, D2, D3, D4) = (200, 300, 100, 100)
并且因为(u, v) = (0, 0)
密度等于D1 = 200
所以b = 200
现在,我们传递到Dx
>的下一个 xalue Dx = x+1
(返回 1)
C
等于3
,x
等于4
, 和Dx * C / x = 1 * 2 / 3 = 0.666666667
或2/3
2/3 < 1
所以我们还在第一个牢房里
对于职位(Dx, Dy) = (2/3, 0)
(u, v) = (2/3, 0)
因为u > 0
和v = 0
密度介于D1
和D2
d = u * D2 + (1-u) * D1 (returns 266.666666667)
让我们想象一个output.csv
包含 4 列和 4 行的文件,结果,它应该包含:(这里的空格是为了帮助阅读......)
200; 266.6666667; 333.3333333; 400
133.3333333; 155.5555556; 177.7777778; 200
66.66666667; 66.88888889; 111.1111111; 133,3333333
0; 66.66666667; 133,3333333; 200
输入 3 x 3 是:
200; 300; 400
100; 100; 100
0; 100; 200
//
代码:
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
//_____________________________________________________________________________
int main() {
/// original grid
int C = 0; // amount of columns in the .csv
int L = 0; // amount of lines in the .csv
int a = 0; // a variable temporarily stores .csv value
std::vector <int> density; // stores a dataset from the .csv
//_____________________________________________________________________________
ifstream ifs ("input.csv"); // importing the .csv
cout << "number of columns?" << endl; // specifying number of columns
cin >> C;
cout << endl;
cout << "number of lines?" << endl; // specifying number of lines
cin >> L;
cout << endl;
char dummy;
for (int i = 0; i < L; ++i){ // pushing the values of the .csv into the vector
for (int i = 0; i < C; ++i){
ifs >> a;
density.push_back(a);
if (i < (C - 1))
ifs >> dummy;
}
//_______________________________________________________________________________
/// output grid
int x = 0; // coordinate x
int y = 0; // coordiante y
int Dx = 0; // horizontal position
int Dy = 0; // vertical position
int b = 0; // interpolated density
std::vector <float> D; // stores the interpolated values
cout << "number of columns of the new file?" << endl; // specifying number of columns
cin >> x;
cout << endl;
cout << "number of lines of the new file?" << endl; // specifying number of lines
cin >> y;
cout << endl;
}
/// DIAGRAM OF A CELL WITH THE POSITION OF: b (u,v)
//__________________________________________________
//
// D1 ---u--- D2
// | | |
// v----b |
// | |
// D3 ------- D4
//
//__________________________________________________
int D1 = 0; // densities of the four points of the cell containing (x,y)
int D2 = 0;
int D3 = 0;
int D4 = 0;
float u = 0; // horizontal and vertical positions of b within the cell
float v = 0;
//_______________________________________________________________________
/// PART MISSING HERE: HOW TO GET D1, D2, D3, D4, u, v ???
//_______________________________________________________________________
while (x<C, y<L) {
// formulae for bilinear interpolation
double DL = D1 - D1 * v + D3 * v; // Vertical linear interpolation right side
double DR = D2 - D2 * v + D4 * v; // Vertical linear interpolation left side
double D = DL - DL * u + DR * u; // Horizontal linear interpolation
D.push_back (b);
x++; // next interpolation
if (x>C) {
y = y++;
}
}
}