スポンサーリンク

| キーワード:

ビット演算で市松模様を描く

前にも書いたことがあるが、ビット演算で書き直す。

排他的論理和は、1^1、0^0の時は0、それ以外の時は1になる。

これを使い、x軸が偶数、奇数、偶数、奇数、…と並んでいるものに、y軸が偶数の時は奇数だけを1、y軸が奇数の時は偶数だけを1にすることで市松模様にする。

#include <iostream>
#include <vector>

#pragma warning(disable:4996)

void pnmP2_Write(
  const char* const fname,
  const int width,
  const int height,
  const unsigned char* const p);


int main()
{

  int w = 100, h = 50;
  int size = w * h;
  std::vector<unsigned char> image(w*h);

  for (size_t y = 0; y < h; y++) {
    for (size_t x = 0; x < w; x++) {
      size_t p = y * w + x;

      int f;

      
      /*
      if (y % 2) {
        f = (x % 2)? 1 : 0;
      }
      else {
        f = (x % 2) ? 0 : 1;
      }
      */

      f = (x & 1) ^ (y & 1);

image[p] = f * 255; } } pnmP2_Write(R"(C:\Users\szl\Desktop\mydev\out\a.pgm)", w, h, image.data()); } //! @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); }

余談

今の時代は鬼滅の刃とかキーワードに入れておいたほうがヒットしやすいのだろうか。

コメントを残す

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

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


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