私は、C++でImageというクラスを持っています。ここでは、幅と高さとすべてのピクセル値を一度に格納する長いベクトルがあり、 (0 ist black、255 is white)可変四角形のチェスボードを作成する
ここでは、関数void chess()を書いて、そのような方法でピクセル値を変換しますあなたに を渡すと、基本的なチェスのパターンがあります。
私の次のアイデアは、さまざまなサイズのチェスボードを作成することです。幅8、高さ8、およびチェス盤の各正方形は、私はそれを実装しようとした場合、私の唯一の「アイデアは、」それが変化していることを追跡するために、1を2つのカウンタを使用することで、
今2×2画素の代わりに、 1x1のですすべてのピクセルの後ではなく、ピクセルの新しいサイズの後で、白から黒に変化します。さらに、反転する必要がある行の数を追跡した後、追跡するために2番目のカウンタを用意する必要があるため、白ではなく黒で開始します。
しかし、私はそれを理解することはできません、私は非常に多くのIf文とforループとwhileループで終わります。はるかに簡単な方法が必要です。誰にもアイデアはありますか?
class Image
{
public:
typedef uint16_t PixelType;
private:
int width_;
int height_;
std::vector<PixelType> data_;
public:
// Standardkonstruktor: initialisiere Bild mit Groesse (0,0)
Image()
: width_(0)
, height_(0)
{}
Image(unsigned int width, unsigned int height)
: width_(width)
, height_(height)
{
int size = width * height;
for(int j=0; j < height; j++)
{
for(int i=0; i < width; i++)
{
data_.push_back(0);
}
}
}
void chess() // change an image to chess board pattern
{
data_.clear();
int width = (*this).width();
int height = (*this).height();
for(int w=0; w < width; w++)
{
for(int h=1; h <= height; h++)
{
/*std::cout << "P=("+ std::to_string(w) + "," + std::to_string(h) + ")" << std::endl;
std::cout << std::to_string(h%2) <<std::endl;
for testing purposes only */
if(w%2==0)
{
if(!(h%2==0))
{
data_.push_back(255);
}
else
{
data_.push_back(0);
}
}
else
{
if(!(h%2==0))
{
data_.push_back(0);
} else
{
data_.push_back(255);
}
}
}
}
}
};
オフトピック:コンストラクタは1行にすぎません。data_.res ize(幅*高さ、0); (unsigned int width、unsigned int height) :width_(width) 、height_(height)、 data_(width * height、0) { –