2017-01-23 4 views
0

私は、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

オフトピック:コンストラクタは1行にすぎません。data_.res ize(幅*高さ、0); (unsigned int width、unsigned int height) :width_(width) 、height_(height)、 data_(width * height、0) { –

答えて

3

あなたはwとhのパリティに基づいて色付けを試みることができます。 w + hが偶数色の場合は黒、それ以外の場合は白色です。 0からhとwの両方で開始してください。

0

実際にベクトルを割り当てて(あなたの質問に@Humamのコメントで指摘されているように)、次に値を設定する方が良いと思います。

セルをn x nピクセルサイズにしたいとします(幅と高さをnで割り切れるようにしてください)。

void chess(int n)       // pass n as parameter or as you want 
{ 
    ... 

    bool isBlackCell = true;    // change to false to start with a white one 

    for(int h=0; h < height; h+=n) 
    { 
     for(int w=0; w < width; w+=n) 
     { 
      // now fill the whole cell 
      for (int i=0; i < n; ++i) 
      { 
       for (int j=0; j < n; ++j) 
       { 
        data_[(h+i)*size+w+j] = isBlackCell ? 0 : 255; 
       } 
      } 

      // switch to another color as we moving to another 'cell' 
      isBlackCell = !isBlackCell; 
     } 
    } 

注:これは簡単ですが、理由は、痛みを伴うキャッシュのビット非効率的な編集1

をミス:私はこのdata_[(h+i)*w+w+j]が何をするかを説明してみましょう:あなたのように一つの解決策は、このようなものになることができますあなたのピクセルデータ行を行の後に格納するので、(h+i)*sizeはの行をスキップして現在のピクセル位置に加算します。w+j

関連する問題