スポンサーリンク
前にも書いたことがあるが、ビット演算で書き直す。
排他的論理和は、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); }
今の時代は鬼滅の刃とかキーワードに入れておいたほうがヒットしやすいのだろうか。