循环增量变量

时间:2014-01-07 17:17:28

标签: c++ for-loop increment

我将声音视为一个名为scaledVol的浮点数。我希望改变由scaledVol绘制的字母的间距。

这是代码段:

for (int i = 0; i < camWidth; i+=7){
    for (int j = 0; j < camHeight; j+=9){
        // get the pixel and its lightness (lightness is the average of its RGB values)
        float lightness = pixelsRef.getColor(i,j).getLightness();
        // calculate the index of the character from our asciiCharacters array
        int character = powf( ofMap(lightness, 0, 255, 0, 1), 2.5) * asciiCharacters.size();
        // draw the character at the correct location
        ofSetColor(0, 255, 0);
        font.drawString(ofToString(asciiCharacters[character]), f, f);
    }
}

其中i设置字符间距和j之间的宽度设置字符间距之间的高度。

我希望通过名为scaledVol的浮点数递增而不是递增7或9。

3 个答案:

答案 0 :(得分:2)

  

我希望通过名为scaledVol的浮点数递增而不是递增7或9。

然后代码:

 for (int i = 0; i < camWidth; i+=(int)scaledVol){

您可能想要发言,并确保转换完成一次,增量;也许是代码

 int incr = (int) floor(scaledVol);
 assert (incr > 0);
 for (int i = 0; i < camWidth; i+=incr) {

详细了解floor(3)ceil(3)round(3)IEEE floating point以及rounding errors

请使用您的调试器(例如gdb)了解更多信息。

您可以使用更多C ++友好casts,例如

 int incr = int(floor(scaledVol));

static_cast

 int incr = static_cast<int>(floor(scaledVol));

或者甚至是reinterpret_cast

 int incr = reinterpret_cast<int>(floor(scaledVol));

可能无法正常工作,特别是如果两种数字类型具有相同的大小。

答案 1 :(得分:1)

需要像

这样的东西
for (float i = 0.0f; i < camWidth; i+=scaleVol){

假设camWidth是浮点数。如果不把它扔到浮子上。

scaledVol转换为int

时,这也会出现舍入错误的问题

答案 2 :(得分:1)

您可以使用float作为两个循环变量的类型,然后将它们转换为int

for (float x = 0; (int)x < camWidth; x+=scaledVol) {
  int i = (int)x;
  for (float y = 0; (int)y < camHeight; y+=scaledVol) {
    int j = (int)y;
    // the rest of the code using i and j
  }
}

请注意,scaledVol最好大于1,否则您的ij的连续值相等。你在`//其余的代码'中的处理方式可能不那么喜欢。