创建一个可变方形大小的棋盘

时间:2017-01-23 11:29:14

标签: c++

我有一个名为Image in C ++的类,其中我有一个宽度,高度和一个长向量,它以某种方式存储所有像素值,它遍历第一列,然后向下移动一行,迭代通过第二列等..(0是黑色,255是白色)

现在我已经编写了一个函数void chess(),它可以转换像素值,使其具有基本的国际象棋图案,当你 放弃它。

我的下一个想法是创造不同大小的棋盘,例如。宽度8,高度8,棋盘的每个方格是2x2像素而不是 的1x1

现在,如果我尝试实现它,我唯一的“想法”是使用2个计数器,一个用于跟踪它从白色变为黑色而不是在每个像素之后,而是在新的像素大小之后。此外,你必须有一个第二个计数器来跟踪,你需要反转多少行,所以你从黑色开始,而不是白色。

然而我无法弄清楚,我最终得到了如此多的If语句以及for和while循环,它总是变得凌乱。必须有一个非常简单的方法。有没有人有任何想法?

PIC S9(4)

2 个答案:

答案 0 :(得分:3)

您可以尝试根据w和h的奇偶校验对矩阵着色。如果w + h甚至是黑色,则其他颜色为白色。从0开始用h和w。

答案 1 :(得分: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会跳过(h+i)行,然后来到当前像素位置添加w+j