0

我有一个向量,它存储从文件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)范围内CL(不在网格之外!)的任意位置,我如何轻松定义?densityD1, 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.6666666672/3

  • 2/3 < 1所以我们还在第一个牢房里

对于职位(Dx, Dy) = (2/3, 0)

(u, v) = (2/3, 0)

因为u > 0v = 0密度介于D1D2

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++;
            }
        }

}
4

0 回答 0