首页 > 解决方案 > 如何在处理中将数组数据与 frameCount 组合

问题描述

我试图让带圆圈的对象随着时间的推移出现——每个都是独立的——并在 30 帧后将它们的位置更改为随机选择的新对象。现在——我只能让他们在 30 帧之后改变他们的位置,但是一次都在一起……我花了一段时间来将它们组合成改变所有 30 帧的方式,现在我想解开它们。那是如何实现的?顺便说一句——“数字数组”最初给出的值是 0 的 6 倍,可能是因为它连接到循环?有没有办法来解决这个问题?

在这里你可以看到主要代码:

Circle[] circles = new Circle[6];

color c1 = color(255, 255, 255);
color c2 = color(0, 0, 255);
color c3 = color(255, 255, 255);
color[] colors = { c1, c2, c3 };

int[] numbers = new int[6];

int index;
float rX;
float rY;

void setup () {
  size(540, 960);
  randomizePositions();
  
  index = 5;
  numbers[0] = 5;
  numbers[1] = 10;
  numbers[2] = 15;
  numbers[3] = 20;
  numbers[4] = 25;
  numbers[5] = 30;
}

void randomizePositions() {
  
  for (int i = 0; i <circles.length; i++) {
    rX = random(width);
    rY = random(height);
    index = int(random(numbers.length));
    circles[i] = new Circle(rX, rY, colors[int(random(0, colors.length))], numbers[index]);
  }
}

void draw() {
  background(#c1c1c1);
  for (int i = 0; i < circles.length; i++) {
    circles[i].display();
  }
  if (frameCount % 30 == 0) {
    randomizePositions();
  }
}

这是对象:

class Circle {

  int size;
  int number;
  float x;
  float y;
  color col;

  Circle(float tempX, float tempY, color tempC, int tempNumber) {
    size = 20;
    x = tempX;
    y = tempY;
    col = tempC;
    number = tempNumber;
  }

  void display() {
    fill(col);
    noStroke();
    ellipse(x, y, size/2.5, size/2.5);
    for (int i = 0; i < number; i++) {
      noFill();
      stroke(col);
      strokeWeight(size/2.5);
      ellipse(x, y, i*size, i*size);
    }
  }
}

感谢您提供任何帮助或提示!

标签: arraysoopprocessing

解决方案


您可以从随机位置使用相同的逻辑,但在 for 循环之外:

void randomizePosition() {
  int randomCircleIndex = int(random(circles.length));
  int randomColorIndex = int(random(colors.length));
  int randomNumerIndex = int(random(numbers.length));
  rX = random(width);
  rY = random(height);
  circles[randomCircleIndex] = new Circle(rX, rY, colors[randomColorIndex], numbers[randomNumerIndex]);
}

如果您想避免每次都创建一个新对象,您可以在可重用函数中移动构造函数功能:

Circle[] circles = new Circle[6];

color c1 = color(255, 255, 255);
color c2 = color(0, 0, 255);
color c3 = color(255, 255, 255);
color[] colors = { c1, c2, c3 };

int[] numbers = new int[6];

int index;
float rX;
float rY;

void setup () {
  size(540, 960);
  randomizePositions();

  index = 5;
  numbers[0] = 5;
  numbers[1] = 10;
  numbers[2] = 15;
  numbers[3] = 20;
  numbers[4] = 25;
  numbers[5] = 30;
}

void randomizePositions() {

  for (int i = 0; i <circles.length; i++) {
    rX = random(width);
    rY = random(height);
    index = int(random(numbers.length));
    circles[i] = new Circle(rX, rY, colors[int(random(0, colors.length))], numbers[index]);
  }
}

void randomizePosition() {
  int randomCircleIndex = int(random(circles.length));
  int randomColorIndex = int(random(colors.length));
  int randomNumerIndex = int(random(numbers.length));
  rX = random(width);
  rY = random(height);
  circles[randomCircleIndex].reset(rX, rY, colors[randomColorIndex], numbers[randomNumerIndex]);
}

void draw() {
  background(#c1c1c1);
  for (int i = 0; i < circles.length; i++) {
    circles[i].display();
  }
  if (frameCount % 30 == 0) {
    randomizePosition();
  }
}

class Circle {

  int size;
  int number;
  float x;
  float y;
  color col;
  
  Circle(float tempX, float tempY, color tempC, int tempNumber) {
    reset(tempX, tempY, tempC, tempNumber);
  }
  
  void reset(float tempX, float tempY, color tempC, int tempNumber){
    size = 20;
    x = tempX;
    y = tempY;
    col = tempC;
    number = tempNumber;
  }

  void display() {
    fill(col);
    noStroke();
    ellipse(x, y, size/2.5, size/2.5);
    for (int i = 0; i < number; i++) {
      noFill();
      stroke(col);
      strokeWeight(size/2.5);
      ellipse(x, y, i*size, i*size);
    }
  }
  
  
}

此外,如果您想一次重置一个圆但顺序(不是从数组中随机选择一个),您需要使用一个单独的整数来计算当前选择的圆索引,以便它可以递增:

Circle[] circles = new Circle[6];

color c1 = color(255, 255, 255);
color c2 = color(0, 0, 255);
color c3 = color(255, 255, 255);
color[] colors = { c1, c2, c3 };

int[] numbers = new int[6];

int index;
float rX;
float rY;

int currentCircleIndex = 0;

void setup () {
  size(540, 960);
  randomizePositions();

  index = 5;
  numbers[0] = 5;
  numbers[1] = 10;
  numbers[2] = 15;
  numbers[3] = 20;
  numbers[4] = 25;
  numbers[5] = 30;
}

void randomizePositions() {

  for (int i = 0; i <circles.length; i++) {
    rX = random(width);
    rY = random(height);
    index = int(random(numbers.length));
    circles[i] = new Circle(rX, rY, colors[int(random(0, colors.length))], numbers[index]);
  }
}

void randomizePosition() {
  int randomColorIndex = int(random(colors.length));
  int randomNumerIndex = int(random(numbers.length));
  rX = random(width);
  rY = random(height);
  circles[currentCircleIndex].reset(rX, rY, colors[randomColorIndex], numbers[randomNumerIndex]);
  println("reset circle index: " + currentCircleIndex);
  // increment index (and reset after last index using %)
  currentCircleIndex = (currentCircleIndex + 1) % circles.length;
}

void draw() {
  background(#c1c1c1);
  for (int i = 0; i < circles.length; i++) {
    circles[i].display();
  }
  if (frameCount % 30 == 0) {
    randomizePosition();
  }
}

class Circle {

  int size;
  int number;
  float x;
  float y;
  color col;
  
  Circle(float tempX, float tempY, color tempC, int tempNumber) {
    reset(tempX, tempY, tempC, tempNumber);
  }
  
  void reset(float tempX, float tempY, color tempC, int tempNumber){
    size = 20;
    x = tempX;
    y = tempY;
    col = tempC;
    number = tempNumber;
  }

  void display() {
    fill(col);
    noStroke();
    ellipse(x, y, size/2.5, size/2.5);
    for (int i = 0; i < number; i++) {
      noFill();
      stroke(col);
      strokeWeight(size/2.5);
      ellipse(x, y, i*size, i*size);
    }
  }
  
  
}

推荐阅读