Я не знаю, как сохранить в строках 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;
}
Ну, у вас есть работа, которую нужно сделать … Вам нужно указать функцию для каждой геометрической формы, которая будет заполнять ваше изображение.
Вот пример, который больше 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
Других решений пока нет …