円を描くプログラムを書いたのでついでに中も塗りつぶす。
#include <iostream> #include <vector> #include "Circle.hpp" #pragma warning(disable:4996)
void pnmP2_Write( const char* const fname, const int width, const int height, const unsigned char* const p);
//! @brief 閉じた図形を塗りつぶし //! @param [in,out] img 書き込み先 //! @param [in] rsx 図形を覆う座標(左側) //! @param [in] rsy 図形を覆う座標(上側) //! @param [in] rex 図形を覆う座標(右側) //! @param [in] rey 図形を覆う座標(下側) //! @param [in] pen 塗りつぶす色 //! @return なし void fill_closed(Image& img, int rsx, int rsy, int rex, int rey,unsigned char pen) { unsigned char color = 150; for (int y = rsy; y <= rey; y++) { int begin = -1, end = -1; int b; for (int x = rsx; x <= rex; x++) { int p = img.img[y * img.width + x]; // 図形の輪郭を見つけた場合 if (p == pen) { // まだ始点を発見していない場合 if (begin == -1) { // 図形の内側に入る for (b = x; b <= rex; b++) { if (img.img[y * img.width + b] != pen) break; } if (b == rex) break; x = begin = b; } // 既に始点が発見済みの場合は終点の発見となる else { end = x - 1; if (begin >= end) break; // 始点から終点までを塗る for (b = begin; b <= end; b++) { img.img[y * img.width + b] = color; } break; } } } } }
int main(int argv,char** argc) { int w = 100, h = 100; Image img; img.width = w; img.height = h; resize(&img, w, h); std::fill(img.img.begin(), img.img.end(), 0); int size = w * h; int cx = 30, cy = 30, r = 25; // 円を描く circle(img,cx,cy,r); // 矩形を想定する int rect_sx = cx - r - 1; int rect_sy = cy - r - 1; int rect_ex = cx + r + 1; int rect_ey = cy + r + 1; const int pen = 255; fill_closed(img, rect_sx, rect_sy, rect_ex, rect_ey, pen); pnmP2_Write(R"(C:\Users\szl\Desktop\mydev\out\b.pgm)", w, h, img.img.data()); std::cout << "Hello World!\n"; return 0; } //! @brief Portable Gray map //! @param [in] fname ファイル名 //! @param [in] width 画像の幅 //! @param [in] height 画像の高さ //! @param [in] p 画像のメモリへのアドレス //! @details RGBRGBRGB....のメモリを渡すと、RGBテキストでファイル名fnameで書き込む void pnmP2_Write( const char* const fname, const int width, const int height, const unsigned char* const p) { // PPM ASCII FILE* fp = fopen(fname, "wb"); fprintf(fp, "P2\n%d %d\n%d\n", width, height, 255); size_t k = 0; for (size_t i = 0; i < (size_t)height; i++) { for (size_t j = 0; j < (size_t)width; j++) { fprintf(fp, "%d ", p[k]); k++; } fprintf(fp, "\n"); } fclose(fp); }