翻译后按定义的量旋转每个圆-处理

时间:2019-01-22 18:18:36

标签: processing

Final Result

我需要每个圆都有随机旋转,具体取决于“腐烂”值,如所附图片所示。旋转将仅执行一次,并且必须仅在“ rot”值定义的间隔内进行。任何帮助,将不胜感激。

这是我到目前为止所拥有的:


int maxCircleDiameter=100, diameter, innerOffset;
int numOfCirclesX, numOfCirclesY, xPos, yPos;
int numOfRand = 4, rand, rot;

void setup() {
  size(600, 600);

  //starting values
  numOfCirclesX = width/maxCircleDiameter;
  numOfCirclesY = height/maxCircleDiameter;
  innerOffset = maxCircleDiameter/numOfCirclesX;
}
void draw() {
  background(255);

  //random value generation
  randomRot();

  //circle generation
  displayCircles();

  //executes once
  noLoop();
}

void randomRot() {
  rand = (int)random(numOfRand);
  //rot value changes depending of rand value
  switch(rand) {
  case 0: 
    rot = -90; 
    break;
  case 1: 
    rot = 0; 
    break;
  case 2: 
    rot = 90; 
    break;
  case 3: 
    rot = 180; 
    break;
  }
}

void displayCircles() {
  for (int i=0; i < numOfCirclesX*numOfCirclesY; i++) {

    //base diameter
    diameter = maxCircleDiameter;

    //circle coords
    xPos = maxCircleDiameter/2 + (i%numOfCirclesX*maxCircleDiameter);
    yPos = maxCircleDiameter/2 + (i/numOfCirclesX*maxCircleDiameter);
    ellipse(xPos, yPos, diameter, diameter);

    pushMatrix();
    do {
      ellipse(xPos, yPos, diameter, diameter);

      //circle's center moves 7 pixels down
      translate(0, 7);

      //smaller diameter
      diameter -=innerOffset;
    } while (diameter > innerOffset);
    popMatrix();
  }
}

1 个答案:

答案 0 :(得分:1)

我修复了您的代码,并注释了我添加/调整的部分,如果您还有其他问题或您不太了解我的所作所为,请告诉我。 结果恰好是您要求的

int maxCircleDiameter=100, diameter, innerOffset;
int numOfCirclesX, numOfCirclesY, xPos, yPos;

void setup() {
  size(600, 600);

  //starting values
  numOfCirclesX = width/maxCircleDiameter;
  numOfCirclesY = height/maxCircleDiameter;
  innerOffset = maxCircleDiameter/numOfCirclesX;
}
void draw() {
  background(255);

  //random value generation
  randomRot();

  //circle generation
  displayCircles();

  //executes once
  noLoop();
}

float randomRot() {
  int rand = (int)random(4); //I fixed the number of rands here because the switch below is static and depends on it

  float rot;
  //rot value changes depending of rand value

  switch(rand) {
  case 0: 
    rot = 0; 
    break;

  case 1: 
    rot = PI/2; 
    break;

  case 2: 
    rot = PI; 
    break;

  default: 
    rot = 3*PI/2; 
    break;
  }

  return rot;
}

void displayCircles() {

  for (int i=0; i < numOfCirclesX*numOfCirclesY; i++) {
    //base diameter
    diameter = maxCircleDiameter;

    //circle coords
    xPos = maxCircleDiameter/2 + (i%numOfCirclesX*maxCircleDiameter);
    yPos = maxCircleDiameter/2 + (i/numOfCirclesX*maxCircleDiameter);
    ellipse(xPos, yPos, diameter, diameter);

    pushMatrix();

    //get a random angle to draw the circles on
    float angle=randomRot();
    do {

      ellipse(xPos, yPos, diameter, diameter);

      //circle's center moves 7 pixels to on of the 4 directions depending on the random value angle took
      translate(7*cos(angle), 7*sin(angle));
      //smaller diameter
      diameter -=innerOffset;
    } while (diameter > innerOffset);
    popMatrix();
  }
}

祝你好运!