@tj57

Как повернуть матрицу на 90 градусов?

У меня есть градиент, построенный в виде матрицы битов:

5c85934e60ee3522902507.png
vector<vector<int>> make_gradient(int height, int width)
{
	assert(height > 0 && width > 0);

	int cf = height / 255;
	int color = 0;
	vector<vector<int>> result(height, vector<int>(width));
	for (int i = 0; i < height; i += cf)
	{
		for (int j = 0; j < cf; ++j)
		{
			fill(result[i + j].begin(), result[i + j].end(), color % 255);
		}
		color++;
	}
	stable_sort(result.begin(), result.end());
	return result;
}

int main(int argc, char *argv[])
{
ofstream file;

	file.open(argv[1]);

	if (!file)
	{
		cout << "can't open file" << endl;
		return 0;
	}

	file << "P5" << "\n";

	file << numrows << " " << numcols << "\n";

	file << 255 << "\n";

	vector<vector<int>> pixmap;

      for_each(pixmap.begin(), pixmap.end(), [&](const auto& v) {
		copy(v.begin(), v.end(), ostream_iterator<char>{file, ""});
	});

	file.close();
}


Градиент идет сверху вниз, т.е. изображение вертикальное. Как изменить алгоритм, чтобы он строил горизонтальное изображение (градиент слева направо) ? Я менял местами в циклах height и width, но это не помогло.
  • Вопрос задан
  • 268 просмотров
Пригласить эксперта
Ответы на вопрос 1
WizardNG
@WizardNG
Если я правильно понимаю, конструкция во вложении цикле
fill(......
заполняет всю строку заданным значением. Вот ее и надо заменить на заполнение столбца. Наверное, понадобится еще один вложенный цикл,, чтобы пройти по всем строкам, и записать в заданную ячейку значение.

Должно получиться что-то типа такого:

vector> make_gradient(int height, int width)
{
assert(height > 0 && width > 0);

int cf = width / 255;
int color = 0;
vector> result(height, vector(width));
for (int i = 0; i < height ; i += cf)
{
for (int j = 0; j < cf; ++j)
{
for (Int z =0, z < width, z++)
{
result[z][i+j] = color % 255:
}
}
color++;
}
stable_sort(result.begin(), result.end());
return result;
}

int main(int argc, char *argv[])
{
ofstream file;

file.open(argv[1]);

if (!file)
{
cout << "can't open file" << endl;
return 0;
}

file << "P5" << "\n";

file << numrows << " " << numcols << "\n";

file << 255 << "\n";

vector> pixmap;

for_each(pixmap.begin(), pixmap.end(), [&](const auto& v) {
copy(v.begin(), v.end(), ostream_iterator{file, ""});
});

file.close();
}

Надеюсь, нигде не ошибся с координатами :)
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы