处理访问随机数组中像素的特定位置

时间:2017-04-24 11:44:53

标签: arrays graph processing

我在7列中按行顺序绘制了随机椭圆。但是,我不想在行数组中的任意位置随机绘制椭圆数,而是只绘制它们,因此第一列中的一个椭圆必须触及第二列中的一个椭圆等。这样位置之间就没有间隙。最终视觉效果看起来像条形图在不同的条形高度动画,但使用椭圆阵列来实现。与此图片类似。 graph

我的工作代码如下。我是否会移动访问像素颜色值并执行“如果条件”#39;比较rowArray [i]是否在黑色像素旁边,或者是否有一种更简单的方法我可以忽略这里?所有帮助赞赏。感谢。

PImage pix = createImage(7, 7, RGB);
int counter = 0;
int counter2 = 0;
int y = 0;
int x = 0;
int rowArray[ ] = {0, 1, 2, 3, 4, 5, 6, 7};
int colArray[ ] = {0, 1, 2, 3, 4, 5, 6, 7};
int frameDelay = 300; //pause 400 ms between frames being sent to the board
float dot = 0;
int count;

void setup() {

  background(0);
  size(500, 500);
  dot = height/7.0;



  pix.loadPixels();
  for (int i = 0; i < pix.pixels.length; i++) {
    pix.pixels[i] = color(0);
  }
  pix.updatePixels();
  noStroke();
  ellipseMode(CORNER);
}

void draw() {

  //boolean dot = false;
  //randomSeed(0);
  pix.loadPixels();



  if (counter > pix.height) {
    counter = 0;
    y ++;
  }

  if (counter2 > pix.width) {
    counter2 = 0;
    x ++;
    //also refesh screen after one round
    refresh();
  }

  //reset-don't go beyond pixel boundaries
  if (x > pix.width) {
    x = 0;
  }
  if (y > pix.height) {
    y = 0;
  }
  for (int j = 0; j < pix.width; j++) {
    if (j==counter2) {
      for (int i = 0; i < pix.height; i++) {
        if (i == counter) {

          //random height

          i = int(random(rowArray.length));  // Same as int(random(i))
          y=i;
          x=j;
          //draw the white circles
          stroke(64);
          strokeWeight(1);
          fill(255);
          noStroke();
          ellipse(x*dot, y*dot, dot, dot);
        }
      }
    }
  }
  counter++;
  counter2++;



  pix.updatePixels();

  pix.loadPixels();



  delay (frameDelay);
}
void refresh() {

  background(0);
}

/ EDIT !!!!! / 我已经简化了我的代码,因为它有一些不必要的循环。现在使用像素[loc]来确定白色和黑色像素的位置并从那里开始。

编辑代码

PImage pix = createImage(7, 7, RGB);
int counter = 0;
//int randCount=0;
int counter2 = 0;
int y = 0;
int x = 0;
//int randCount[ ] = {0, 1, 2, 3, 4, 5, 6};
int randCount[ ] =  new int[7];
//int rowArray[ ] = {0, 1, 2, 3, 4, 5, 6, 7};

int frameDelay = 300; //pause 400 ms between frames being sent to the board
float dotSize = 0;


void setup() {

  background(0);
  size(500, 500);
  dotSize = height/7.0;


  //make all dots black on start
  pix.loadPixels();
  for (int i = 0; i < pix.pixels.length; i++) {
    pix.pixels[i] = color(0);
  }
  pix.updatePixels();
  noStroke();
  ellipseMode(CORNER);
}

void draw() {

  //  boolean dot = false;

  pix.loadPixels();
  //bitshift values from array
  int row1 = 0;
  int row2 = 0;
  int row3 = 0;
  int row4 = 0;
  int row5 = 0;
  int row6 = 0;
  int row7 = 0;


  //randomise how many dots are displayed in the row
  int index = int(random(randCount.length));
  counter=index;

  if (counter > pix.height) {
    counter = 0;
    y ++;
  }

  if (counter2 > pix.width) {
    counter2 = 0;
    x ++;
  }


  //reset-don't go beyond pixel boundaries
  if (x > pix.width) x = 0;
  if (y > pix.height) y = 0;

  //sequence dots row by row 
  for (int i = 0; i < pix.height; i++) {
    if (i == counter) {

      //y is i
      y=i;

      //draw the white circles representing flipdots
      stroke(64);
      strokeWeight(1);
      fill(255);
      noStroke();
      ellipse(x*dotSize, y*dotSize, dotSize, dotSize);
    }
  }
  if (x==7) {
    //also refesh screen after one round
    refresh();
  }

  counter++;
  counter2++;
  detect();


  pix.updatePixels();

  pix.loadPixels();



  delay (frameDelay);
}


//screen refresh
void refresh() {

  background(0);
  y=0;
  x=0;
}

void detect() {
  //pixel location
  int loc = x + y*pix.height;

  // Pixel to the left location and color
  int leftLoc = (x - 1) + y*pix.width;

  // Pixel to the right location and color
  int rightLoc = (x + 1) + y*pix.width;

  // Pixel to the left location and color
  int downLoc = (x - 1) + y*pix.height;

  // Pixel to the right location and color
  int upLoc = (x + 1) + y*pix.height;

  //is the pixel white?
  if ((pix.pixels[loc]==255)&&(pix.pixels[leftLoc]==255)&&(pix.pixels[rightLoc]==255)&&(pix.pixels[downLoc]==255)&&(pix.pixels[upLoc]==255)) {
    y++;
    // x++;
  } else {
    y--;
  }
}

1 个答案:

答案 0 :(得分:1)

编辑 - 现在已经解决了。如果其他人遇到类似的故障排除,请在下面发布代码。

根据上述建议,我重新提出了问题:

我尝试创建一个随机数组长度并循环遍历此数组以在一行中绘制随机x个量的椭圆。这可以直观地转换为一系列不同高度的白色椭圆,如条形图。下面的最小代码循环遍历数组长度,并成功地在数组长度中的每个像素处依次绘制椭圆。这就是我要的。但是,因为它是随机的,所以有时会在椭圆之间留下间隙(黑色像素)。例如,在第1行中,它可以依次绘制3个白色椭圆,然后是1个像素的间隙,然后是长度中的第4个椭圆。我试图消除'差距'。这段代码实现了“我想瞄准的另一个绘制序列之后的一个椭圆”,但在沿阵列长度创建椭圆时有黑色间隙。

PImage pix = createImage(7, 7, RGB);
int counter = 0;
//int randCount=0;
int counter2 = 0;
int y = 0;
int x = 0;
int lastY=0;
//int randCount[ ] = {0, 1, 2, 3, 4, 5, 6};
int randCount[ ] =  new int[7];
int rowArray[ ] = {0, 1, 2, 3, 4, 5, 6};
int colArray[]= new int[7];
int frameDelay = 500; //pause 400 ms between frames being sent to the board
float dotSize = 0;


void setup() {

  background(0);
  size(500, 500);
  dotSize = height/7.0;


  //make all dots black on start
  pix.loadPixels();
  for (int i = 0; i < pix.pixels.length; i++) {
    pix.pixels[i] = color(0);
  }
  pix.updatePixels();
  noStroke();
  ellipseMode(CORNER);
}

void draw() {



  pix.loadPixels();


  //here do sequential index plus a random value
  // for(int j = 0; j < rowArray.length; j++){

  //randomise how many dots are displayed in the row
  int index = int(random(randCount.length));

  //counter=index;

  //if beyond pixel boundaries
  if (counter > pix.height) {
    counter = 0;
    y ++;
  }

  if (counter2 > pix.width) {
    counter2 = 0;
    x ++;
  }


  //reset-don't go beyond pixel boundaries
  if (x > pix.width) x = 0;
  if (y > pix.height) y = 0;

  //sequence dots row by row 

  //loop through the randomised array lengths.  
  for (int i=0; i<index; i++) {



    // if dot is within boundary and sequencial.  
    if (i == counter) {

      //y is i. height is i.
      y=i;


      //draw the white circles representing flipdots
      stroke(64);
      strokeWeight(1);
      fill(255);
      noStroke();
      ellipse(x*dotSize, y*dotSize, dotSize, dotSize);
    }
  }


  if (x==7) {
    //also refesh screen after one round
    refresh();
  }

  counter++;
  counter2++;



  pix.updatePixels();

  pix.loadPixels();



  //time between dot animations
  delay (frameDelay);
}


//screen refresh
void refresh() {

  background(0);
  y=0;
  x=0;
}

我认识到问题在于如何构造for循环。然后我尝试了以下for循环结构来解决'像素间隙' 通过在整个像素高度上添加第二个for循环排序,然后用pixel.height长度减去随机长度。这现在有效。

  //sequence dots row by row 

  //loop through the randomised array lengths.  
  for (int i=0; i<index; i++) {

  for (int j=0; j<index; j++) {

    // if dot is within boundary and sequencial.  
    if (i == counter) {

      //y is i. height is i.
      y=i-j;


      //draw the white circles representing flipdots
      stroke(64);
      strokeWeight(1);
      fill(255);
      noStroke();
      ellipse(x*dotSize, y*dotSize, dotSize, dotSize);
    }
  }
  }

因此,我继续尝试解决我的for循环的构造,这些循环绘制随机长度的椭圆,但行中的长度之间没有任何间隙。我希望这更清楚,更符合如何在论坛上构建问题。 感谢