スポンサーリンク

スキャンラインで円を塗りつぶす

円を描くプログラムを書いたのでついでに中も塗りつぶす。

#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); }

円を描くアルゴリズム(1)

円を描くアルゴリズム(2)

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)


この記事のトラックバックURL: