Как создать в ascii квадрат, треугольник, прямоугольник или круг с помощью C ++ и сохранить его в переносимый файл растрового изображения?

Я не знаю, как сохранить в строках 0 и 1, чтобы создать фигуру. Это мой код, который генерирует строки с нулями. Мне нужно создать квадрат или треугольник, или прямоугольник (не имеет значения). Просто нужно знать, как это сделать правильно и сохранить в pbm (переносимое растровое изображение) в виде монохромного изображения.

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

using namespace std;

int main()
{
ofstream file;

int width=5;
int height=5;
int tab [10][10];

file.open("graphics.pbm");
if(file.good() == true)
{
file << "P1" << endl;
file << "# comment" << endl;
file << "10 10" << endl;

for (int  i=0; i<width; i++)
{
for (int j=0; j<height; j++)
{
tab[i][j]=0;
}
}

for (int  i=0; i<width; i++)
{
for (int j=0; j<height; j++)
{
file << tab[i][j] << " ";
}
}

file.close();
}

return 0;
}

3

Решение

Ну, у вас есть работа, которую нужно сделать … Вам нужно указать функцию для каждой геометрической формы, которая будет заполнять ваше изображение.

Вот пример, который больше C ++, например, где класс Image обрабатывать методы для вычисления геометрических форм, таких как makeFillCircle(), Image Класс также обрабатывает вывод PBM. Отметьте, как легко теперь сохранить его, используя std::ostream operator<< !

#include <vector>
#include <iostream>
#include <algorithm>

struct Point {
Point(int xx, int yy) : x(xx), y(yy) {}
int x;
int y;
};

struct Image {
int width;
int height;
std::vector<int> data; // your 2D array of pixels in a linear/flatten storage

Image(size_t w, size_t h) : width(w), height(h), data(w * h, 0) {} // we fill data with 0s

void makeFillCircle(const Point& p, int radius) {
// we do not have to test every points (using bounding box)
for (int i = std::max(0, p.x - radius); i < std::min(width-1, p.x + radius) ; i ++) {
for (int j = std::max(0,p.y - radius); j < std::min(height-1, p.y + radius); j ++) {
// test if pixel (i,j) is inside the circle
if ( (p.x - i) * (p.x - i) + (p.y - j) * (p.y - j) < radius * radius ) {
data[i * width + j] = 1;  //If yes set pixel on 1 !
}
}
}
}
};

std::ostream& operator<<(std::ostream& os, const Image& img) {
os << "P1\n" << img.width << " " << img.height << "\n";
for (auto el : img.data) { os << el << " "; }
return os;
}

int main() {
Image img(100,100);
img.makeFillCircle(Point(60,40), 30); // first big circle
img.makeFillCircle(Point(20,80), 10); // second big circle
std::cout << img << std::endl; // the output is the PBM file
}

Живой код

Результат:

два круга

И вуаля … Я позволю вам весело создавать свои собственные функции makeRectangle(), makeTriangle() для ваших нужд! Это требует немного математики!

Редактировать БОНУС

Как сказано в комментарии, здесь есть небольшая функция-член, которая сохранит изображение в файл. Добавьте его в класс Image (вы также можете, если хотите, иметь свободную функцию вне класса). Так как у нас есть оператор ostream<< это просто:

void save(const std::string& filename) {
std::ofstream ofs;
ofs.open(filename, std::ios::out);
ofs << (*this);
ofs.close();
}

Другой способ без изменения кода — перехватить вывод программы в файл с чем-то вроде этого на вашем терминале:

./main >> file.pgm

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]