那么你有一些工作要做......你需要为每个几何形式指定一个函数来填充你的图像。
这是一个更像 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
}
Live Code
结果是:
瞧……我让您有乐趣创建自己的功能makeRectangle()
,makeTriangle()
满足您的需求!这需要一些小数学!
编辑奖金
正如评论中所问的,这里有一个小成员函数,可以将图像保存在文件中。将它添加到 Image 类中(如果您喜欢在类之外有一个免费功能,您也可以)。因为我们有一个 ostream operator<< 这很简单:
void save(const std::string& filename) {
std::ofstream ofs;
ofs.open(filename, std::ios::out);
ofs << (*this);
ofs.close();
}
不修改代码的另一种方法是在终端上使用类似这样的文件将程序的输出捕获:
./main >> file.pgm