Reputation: 29
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
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