您好我正在为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到255之间的值(包括0和255)。这可以通过以下等式完成:
color =(海拔 - 最小海拔)(最大海拔 - 最小海拔)* 255
检查数学运算以确保正确缩放。检查您的代码以确保您的算术运算正常工作。回想一下,如果a和b是声明为整数的变量,如果a == 128且b == 256,表达式a / b将为0。
在计算灰度阴影时,将该值存储在R,G和B的三个平行向量中。为R,G和B设置相同的值将导致灰色。矢量的结构应该使用高程数据镜像矢量。
答案 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]中)。将该值分配给R
,G
和B
的每个对应元素。
一旦有了这三个方形向量,就可以使用它们来创建PPM文件。