如何使用1D向量重新分配2D平行向量的单个元素?

时间:2017-10-14 05:10:49

标签: c++ vector populate

您好我正在为C ++课程的介绍工作,我完全被某个部分困住了。基本上,分配是打开包含单个整数的文件(数据表示高程平均值网格),用这些值填充2D向量,找到向量的最小值和最大值,将向量的每个元素转换为1D包含该值的RGB表示的并行向量(以灰度表示),并将数据导出为PPM文件。我已经成功地达到了我应该将矢量值转换为RGB平行向量的程度。

我的问题是我不完全确定如何将新的RGB矢量分配给矢量的原始元素。这是我目前的代码:

#include <iostream>
#include <string>
#include <fstream>
#include <vector>

using namespace std;

int main () {

  // initialize inputs
  int rows;
  int columns;
  string fname;

  // input options
  cout << "Enter number of rows" << endl;
  cin >> rows;
  cout << "Enter number of columns" << endl;
  cin >> columns;
  cout << "Enter file name to load" << endl;
  cin >> fname;
  ifstream inputFS(fname);

  // initialize variables
  int variableIndex;
  vector<vector<int>> dataVector (rows, vector<int> (columns));
  int minVal = 0;
  int maxVal = 0;

  // if file is open, populate vector with data from file
  if(inputFS.is_open()) {
    for (int i = 0; i < dataVector.size(); i++) {
      for (int j = 0; j < dataVector.at(0).size(); j++) {
        inputFS >> variableIndex;
        dataVector.at(i).at(j) = variableIndex;
      }
    }
  }

  // find max and min value within data set
  for (int i = 0; i < dataVector.size(); i++) {
    for (int j = 0; j < dataVector.at(0).size(); j++) {
      if (dataVector.at(i).at(j) < minVal) {
        minVal = dataVector.at(i).at(j);
      }
      if (dataVector.at(i).at(j) > minVal) {
        maxVal = dataVector.at(i).at(j);
      }
    }
  }

  // initialize variables and new color vector
  // -------PART I NEED HELP ON-----------
  int range = maxVal - minVal;
  int remainderCheck = 0;
  double color = 0;
  vector<int> colorVector = 3;

  for (int i = 0; i < dataVector.size(); i++) {
    for (int j = 0; j < dataVector.at(0).size(); j++) {
      remainderCheck = dataVector.at(i).at(j) - minVal;
      if (remainderCheck / range == 0) {
        cout << "Color 0 error" << endl;
        // still need to find the RGB value for these cases
      }
      else {
        color = remainderCheck / range;
        fill(colorVector.begin(),colorVector.end()+3,color);
        dataVector.at(i).at(j) = colorVector; // <-- DOESN'T WORK
      }
    }
  }
}

我对C ++的了解非常有限,因此非常感谢任何帮助。另外,如果您对同一块代码中处理/运算符问题的其他注释有任何建议,那么我也非常感激。

以下是此特定部分的实际说明:

步骤3 - 计算地图和商店的每个部分的颜色 输入数据文件包含地图中每个单元格的高程值。现在,您需要计算用于表示这些评估值的颜色(白色和黑色之间的灰度)。灰色阴影应缩放到地图的高度。

传统上,图像通过RGB颜色模型在电子系统(如电视和计算机)中显示和显示,这是一种加色模型,其中红色,绿色和蓝色光以各种方式加在一起,以再现广泛的阵列的颜色。在此模型中,颜色通过0到255之间的三个整数(R,G和B)值表示。例如,(0,0,255)表示蓝色,(255,255,0)表示黄色。在RGB颜色中,如果三个RGB值中的每一个都相同,我们会得到一个灰色阴影。因此,有256种可能的灰色阴影,从黑色(0,0,0)到中灰色(128,128,128),再到白色(255,255,255)。

要使阴影变为灰色,您应该使用2D矢量中的最小值和最大值将每个整数(高程数据)缩放到0到25​​5之间的值(包括0和255)。这可以通过以下等式完成:

color =(海拔 - 最小海拔)(最大海拔 - 最小海拔)* 255

检查数学运算以确保正确缩放。检查您的代码以确保您的算术运算正常工作。回想一下,如果a和b是声明为整数的变量,如果a == 128且b == 256,表达式a / b将为0。

在计算灰度阴影时,将该值存储在R,G和B的三个平行向量中。为R,G和B设置相同的值将导致灰色。矢量的结构应该使用高程数据镜像矢量。

1 个答案:

答案 0 :(得分:0)

你的教授要求你为R,G和B分别增加三个vector<vector<int>>:1个。(我不知道为什么你需要三个不同的向量:他们将具有相同的值,因为对于每个元素,灰度R == G == B.仍然按照说明进行。)

typedef std::vector <int>      row_type;
typedef std::vector <row_type> image_type;

image_type dataVector( rows, row_type( columns ) );

image_type R         ( rows, row_type( columns ) );
image_type G         ( rows, row_type( columns ) );
image_type B         ( rows, row_type( columns ) );

此外,每当您执行fill(foo.begin(),foo.end()...)之类的操作时,请务必小心。尝试将填充 容器的末尾(foo.end()+3)是未定义的行为

像以前一样将数据集加载到dataVector,找到你的最小值和最大值,然后为每个元素找到灰度值(在[0,255]中)。将该值分配给RGB的每个对应元素。

一旦有了这三个方形向量,就可以使用它们来创建PPM文件。