我有一个名为Image in C ++的类,其中我有一个宽度,高度和一个长向量,它以某种方式存储所有像素值,它遍历第一列,然后向下移动一行,迭代通过第二列等..(0是黑色,255是白色)
现在我已经编写了一个函数void chess(),它可以转换像素值,使其具有基本的国际象棋图案,当你 放弃它。
我的下一个想法是创造不同大小的棋盘,例如。宽度8,高度8,棋盘的每个方格是2x2像素而不是 的1x1
现在,如果我尝试实现它,我唯一的“想法”是使用2个计数器,一个用于跟踪它从白色变为黑色而不是在每个像素之后,而是在新的像素大小之后。此外,你必须有一个第二个计数器来跟踪,你需要反转多少行,所以你从黑色开始,而不是白色。
然而我无法弄清楚,我最终得到了如此多的If语句以及for和while循环,它总是变得凌乱。必须有一个非常简单的方法。有没有人有任何想法?
PIC S9(4)
答案 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