2017-01-23 2 views
0

У меня есть класс под названием Image в C++, где у меня есть ширина, высота и длинный вектор, который хранит все значения пикселей таким образом, что он итерации через первый столбец, затем он перемещается на одну строку вниз, итерации через второй столбец и т. д. (0 ist black, 255 - белый)Создание шахматной доски с переменным квадратным размером

Теперь я написал функцию void chess(), которая преобразует значения пикселей таким образом, что это имеет базовый шахматный паттерн на нем, когда вы выходите из него .

Следующей идеей является создание шахматной доски различного размера, например. ширина 8, высота 8, и каждый квадрат шахматной доски 2х2 пиксели вместо 1x1

Теперь, если я пытаюсь реализовать его, моя «идея» является использование 2 счетчиков, один, чтобы отслеживать, что она изменяет от белого до черного не после каждого пикселя, а после нового размера пикселей. Кроме того, вам нужно будет иметь второй счетчик для отслеживания, после того, сколько строк вы должны инвертировать, поэтому вы начинаете с черного, а не белого.

Но я не могу понять это, я получаю так много утверждений If, а для циклов while и 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 Изя (ширина * высота, 0); или даже лучше Изображение (без знаковой ширины, неподписанная высота) : ширина_ (ширина) , высота_ (высота), данные_ (ширина * высота, 0) { –

ответ

3

Вы можете попробовать раскрасить матрицу на основе четности w и h. Если w + h четный цвет, черный цвет еще белый. Начните с h и w с 0.

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

Примечание: Это просто, но немного неэффективным из-за болезненного промахов кэша

Edit 1: Позвольте мне объяснить, что это data_[(h+i)*w+w+j] делает: как вы сохраните строку данных пикселя за строкой, поэтому (h+i)*size пропускает (h+i) строк, а затем переходит в текущую позицию пикселя, добавив w+j

Смежные вопросы