Jrekz
Jrekz

Reputation: 29

Rotating every circle by defined amount after translation -Processing

Final Result

I need every circle to have random rotation depending on the "rot" value as shown in the attached picture. The rotation will be only done once and it has to to be only in the intervals defined by "rot" value. Any help would be appreciated.

Here's what I have so far:


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();
  }
}

Upvotes: 1

Views: 27

Answers (1)

YOUSFI Mohamed Walid
YOUSFI Mohamed Walid

Reputation: 580

I fixed your code and commented the parts I added/adjusted, let me know if you got any further question or you didnt understand well what I did. The resultat is perfectly what you asked for

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();
  }
}

Goodluck!

Upvotes: 1

Related Questions