Forum menu
Am I going to need several loopsOne loop for two circles, one for 3 and so on to 10?
No, one loop should do it. It should loop from 1 to n, where n is the number of circles you want to draw. Inside the loop you want to have a method that can calculate the position of the circle and draw it. You'll probably want a couple of helper methods to calculate the x and y coordinates of the circle you're drawing. Something like:
int numCircles = ...
float anglePerCircle = (360/NumCircles)
for i while i < numCirles
calculateXPos
calculateyPos
drawCirle
Edit: be careful you supply the inputs to the sin and cos functions the right way. They expect radians. Have a look at the processing reference for conversion methods
Thanks whatnobeer.
Will
int numCircles = ...
float anglePerCircle = (360/NumCircles)
be at the top of the code, above void setup?
Here is my (not-even-close-to-working) code. The problem I have is there are so many bits I don't get, I don't know where to begin. It's also holding me back as there are lots of small edits I need to make once I have this code written and then talk about the effects.
int NumCircles = 2;
float anglePerCircle = (360/NumCircles);
int x, y;
void setup () {
size (600, 600);
background (255, 255, 255);
smooth ();
//ellipse (width/2, height/2, 200, 200); // the guide circle.
}void draw() {
for (int x = 110*Math.cos (36)+300; x = 360; x ++) {
for (int y = 110*Math.sin (36)+300; y = 10; y ++) {ellipse (x, y, 20, 20);
}
}
}
I (successfully) wrote other code last night to answer another question and understand it.
I've been wondering if I can use similar code to complete this task. Creating images of each particular circle. I get why I should be using FOR loops but can't seem to understand how to use them in this case. I've read everything I can find.
I managed to write the code below by getting something to work and then adjusting it so it worked correctly. With this FOR loop, I haven't got any where near it working so can't begin to improve it.
PImage imgone;
PImage imgtwo;
int value = 0;
void setup () {
size (1000, 480);
imgone=loadImage ("vase1.jpg");
imgtwo=loadImage ("vase2.jpg");
}void draw () {
if (value == 0) {
background(0, 0, 0);
image(imgone, 0, 0);} else if (value == 1) {
background(255, 255, 255);
image(imgtwo, 0, 0);
}
}void mousePressed() {
value = value + 1;
if (value > 1) {
value = 0;
}
}
Thanks for your help. It's very much appreciated whatnobeer.
[b]edit:[/b]
I see I have to loop on a circle counter and not the co-ords. Can't see how that happens either though.
Something like
for (int circleNo = 0; circleNo < MaxCircles; circleNo ++)
Where do I implement the co-ords (written in pseudo code by Graham) into the code?
Mike
I would step back and work out exactly what needs to be done at each step to get where you need. Write out method stubs and fill them in later. For example, to draw a circle you need the x and y coordinates. How do you get them? Write a method to calculate them.
Think about what the position of the coordinates depends on and then pass those in to the method.
The loop in your edit looks ok, what do you think you should be doing in there?
I need to head off now, but try thinking it through step by step and sorting each little bit individually. I know how it feels to struggle with code at the last minute and it's not fun. But they only way you'll sort it is one step at a time.
Thanks whatnobeer (and others). I stepped back. I've written what I need to do in natural language. Tried and tried and read about and watch examples of the use of FOR loops but can't get it right.
I've had to give up on the FOR loop. I just couldn't do it.
I can use the loops for grids and rows etc but I can't even begin to understand how to use them here. The bit that confuses me is where the formulas go and how they interact with the loop.
If I use
for (int circleNo = 0; circleNo < MaxCircles; circleNo ++)
ellipse (x, y, 20, 20)
then I think I understand that the next iteration of the loop will be
for (int circleNo = 1; circleNo < MaxCircles; circleNo ++)
ellipse (x, y, 20, 20)
but I don't see how the x and y will change?
with the formulas, the variable is a.
a = 360/n (where n is the number of circles around the circle)
In pseudo code, in my mind, I need something that says
for (int circleNo = 0; circleNo < MaxCircles; circleNo ++)
ellipse (110*cos(CircleNo/360)+300, 110*sin(CircleNo/360)+300, 20, 20)
The closest I got was
int CircleNo = 0;
int MaxCircles = 10;
int MinCircles = 2;void setup () {
size (600, 600);
background (255, 255, 255);
smooth ();
//ellipse (width/2, height/2, 200, 200); // the guide circle.
}void draw() {
for (int i = 1; i < CircleNo; i = i+1) {
for (int j = 0; j < 20; j = j+1) {
// in the FOR loop, the first parameter "how does this variable start",
// then it defines what it wants to reach "when does it finish",
// third, how does the count variable update itself; here i = i+1 meaning i will add 1 to itself
ellipse (i * 20, j * 20, 20, 20);
// the ellipse will be drawn *20 on the x axis (i) and *20 on the y axis (j)
}
}
}
I understand no one's here to do my work for me, but I'm not going to understand what goes where until I've seen it. Am I close enough for someone to get me to the finish line? Many thanks in case anyone does take pity on me!
The code I have written, because an inelegant solution is better than nothing (eg. ducttape)
int value = 0;
void setup () {
size (1000, 480);
}void draw () {
if (value == 0) {
background(0, 0, 0);
ellipse (300, 190, 20, 20);
ellipse (300, 410, 20, 20); //2 circles show to begin
} else if (value == 1) {
background(0, 0, 0);
ellipse (300, 190, 20, 20);
ellipse (395, 355, 20, 20);
ellipse (204, 355, 20, 20); //3 circles
} else if (value == 2) {
background (0, 0, 0);
ellipse (300, 190, 20, 20);
ellipse (410, 300, 20, 20);
ellipse (300, 410, 20, 20);
ellipse (190, 300, 20, 20); //4 circles
} else if (value == 3) {
background (0, 0, 0);
ellipse (300, 190, 20, 20);
ellipse (404, 266, 20, 20);
ellipse (364, 388, 20, 20);
ellipse (235, 388, 20, 20);
ellipse (195, 271, 20, 20); //5 circles
} else if (value == 4) {
background (0, 0, 0);
ellipse (300, 190, 20, 20);
ellipse (395, 245, 20, 20);
ellipse (395, 355, 20, 20);
ellipse (300, 410, 20, 20);
ellipse (204, 355, 20, 20);
ellipse (204, 245, 20, 20); //6 circles
} else if (value == 5) {
background (0, 0, 0);
ellipse (300, 190, 20, 20);
ellipse (386, 231, 20, 20);
ellipse (407, 324, 20, 20);
ellipse (348, 399, 20, 20);
ellipse (252, 399, 20, 20);
ellipse (192, 324, 20, 20);
ellipse (214, 231, 20, 20); //7 circles
} else if (value == 6) {
background (0, 0, 0);
ellipse (300, 190, 20, 20);
ellipse (378, 222, 20, 20);
ellipse (410, 300, 20, 20);
ellipse (378, 378, 20, 20);
ellipse (300, 410, 20, 20);
ellipse (222, 378, 20, 20);
ellipse (190, 300, 20, 20);
ellipse (222, 222, 20, 20);
}
}void mousePressed() {
value = value + 1;if (value > 6) {
value = 0;
}
}
Am I getting closer or further away from achieving it with loops? It's still not even working enough for me to finish it off / improve it! 🙁
Close enough for someone to finish it yet? Yes, I'm desperate!
int i, j;
int CircleNo = 0;
int MaxCircles = 10;
int MinCircles = 2;
float x = (float)(110 * Cos(CircleNo/360 * Math.PI / 180F)) + 300;
float y = (float)(110 * Sin(CircleNo/360 * Math.PI / 180F)) + 300;
void setup () {
size (600, 600);
background (255, 255, 255);
smooth ();}
void draw() {
for (int i = 1; i < CircleNo; i = i+1) {
for (int j = 0; j < 20; j = j+1) {
ellipse (i * 20, j * 20, 20, 20);
}
}
}
for (int i = 1; i < CircleNo; i = i+1) {
You've set CircleNo to zero, so that won't do anything.
I can't comment on the coding but I'd wonder if rather than using the parametric equation of a circle couldn't you do this with the pythagorean form which is simpler and more elegant? (is posted in the the link above)
x^2 + y^2 = r^2
thanks oldnpastit. Changed that.
The error I get is
"the function Cos(double) does not exist"
"the function Sin(double) does not exist"
Like I said, the code's so far away from being correct that I can't see the errors in it!
From 1 - 10, how close is the code from being correct, do you know?
Thaks
No idea if you're still at it, but here goes.
"the function Sin(double) does not exist"
[url= https://processing.org/reference/sin_.html ]sin()[/url] - the method names are case sensitive and take floats, not doubles. You need to make sure your inputs are of the right type. You should either make sure they're the correct type from the start or you could try and cast them into the right type ([url= https://www.google.ca/search?q=java+how+to+cast+types&ie=utf-8&oe=utf-8&gws_rd=cr&ei=x8O0VOemMorToASd1IHIBw#q=java+cast+double+to+float ]casting doubles to floats[/url])
From looking at the ducttape code, that's what you need to do, but with a loop instead. You've hit the nail on the head when you said "but I don't see how the x and y will change?" Obviously, with the code you wrote above that, they wont. You need to think about what the x and y actually are and how they change with respect to the circle you are drawing.
float x = (float)(110 * Cos(CircleNo/360 * Math.PI / 180F)) + 300;
I would scrap this and look at using the parametric equation as posted by toys. Or [url= http://stackoverflow.com/questions/839899/how-do-i-calculate-a-point-on-a-circle-s-circumference ]read this on how to calculate x and y on the circumference of a circle. [/url]
One last hint: Each time you increment you're loop, you draw a new circle in a new position (ie new x, y). That depends on how many circles you've already drawn. Hopefully you'll see how you can write a method that works out the x and then the y based on how many circles in total you want and how any you've drawn already.
Ditch the duct-tape code. You arent being tested on getting something that works, you are being tested on using the various programming elements - loops, methods, variables etc
You'll get more credit for trying these but getting it slightly wrong than the method you've employed.
whatnobeer - I'm not still at it. I couldn't so used the code pasted below.
This part of the course ha a lot about perception of motion etc. I needed to discuss how the circles (when shown one at a time), appear to be moving around the circle / coming up from the bottom etc.
Mackem - I've submitted it now. Like I said, I needed to discuss the visual perceptions. In the commentry, I said,
"Whilst I was aware that “If you are writing a lot of repetitive code, you should probably use loops”, I was unable to get the code to function correctly. I attempted to create a FOR loop, whereby n circles could be shown at the correct x, y co-ordinates.
The codes’ purpose (see Code 7) was to loop on a circle counter eg.
I believed this would provide the most elegant solution. With it not proving to be fruitful, I decided that an in-elegant solution (such as Code 5) is better than none!"
I submitted my non-working code with loops so will hopefully get some marks for the correct approach. I have no idea if it was slightly wrong or infinite-monkey-infinite-typewriter-esque.
Whatnobeer - I appreciate you weren't going to do my work for me. Thanks for all of your help. If you have (another) few minutes, I'd love to see what the code [i]should[/i] have looked like.
My final code (which allowed me to comment on visual perception)
int value = 0;
void setup () {
size (600, 600);
}void draw () {
if (value == 0) {
background(0, 0, 0);
ellipse (300, 190, 20, 20);
ellipse (300, 410, 20, 20); //2 circles show to begin
} else if (value == 1) {
background(0, 0, 0);
ellipse (300, 190, 20, 20);
ellipse (395, 355, 20, 20);
ellipse (204, 355, 20, 20); //3 circles
} else if (value == 2) {
background (0, 0, 0);
ellipse (300, 190, 20, 20);
ellipse (410, 300, 20, 20);
ellipse (300, 410, 20, 20);
ellipse (190, 300, 20, 20); //4 circles
} else if (value == 3) {
background (0, 0, 0);
ellipse (300, 190, 20, 20);
ellipse (404, 266, 20, 20);
ellipse (364, 388, 20, 20);
ellipse (235, 388, 20, 20);
ellipse (195, 271, 20, 20); //5 circles
} else if (value == 4) {
background (0, 0, 0);
ellipse (300, 190, 20, 20);
ellipse (395, 245, 20, 20);
ellipse (395, 355, 20, 20);
ellipse (300, 410, 20, 20);
ellipse (204, 355, 20, 20);
ellipse (204, 245, 20, 20); //6 circles
} else if (value == 5) {
background (0, 0, 0);
ellipse (300, 190, 20, 20);
ellipse (386, 231, 20, 20);
ellipse (407, 324, 20, 20);
ellipse (348, 399, 20, 20);
ellipse (252, 399, 20, 20);
ellipse (192, 324, 20, 20);
ellipse (214, 231, 20, 20); //7 circles
} else if (value == 6) {
background (0, 0, 0);
ellipse (300, 190, 20, 20);
ellipse (378, 222, 20, 20);
ellipse (410, 300, 20, 20);
ellipse (378, 378, 20, 20);
ellipse (300, 410, 20, 20);
ellipse (222, 378, 20, 20);
ellipse (190, 300, 20, 20);
ellipse (222, 222, 20, 20); //8 circles
}
}void mousePressed() {
if (mouseButton == LEFT) {
value = value + 1;
} else if (mouseButton == RIGHT) {
value = value - 1;
}if (value > 6) {
value = 0;
}
if (value < 0) {
value = 6;
}
}
jeeez what they teaching nowadays blah blah in my day etc etc etc
Ilama: I've never been taught anything about this by anyone.
The only thing I have been told by the University is a reading list, an assignment deadline and an exam date. But, thanks for asking.
It's one of those problems that now you aren't under pressure to finish you can take the time to look at all the elements of what you wanted to do and come up with a better solution. It'll help your ability to program in the future if you do.
Toby - I have the solution. I just can't make it happen. I have found the code in another language. I simply can't translate it into Processing.
I can see how this could be easily adapted for my purpose.
size(200,200);
smooth();
background(255);int nbr_circles = 24;
float lg_diam = width * .85;
float lg_rad = lg_diam / 2;
float lg_circ = PI * lg_diam;float sm_diam = (lg_circ / nbr_circles);
float cx = width/2.0;
float cy = height/2.0;fill(0);
for (int i = 1; i <= nbr_circles; ++i) {
float angle = i * TWO_PI / nbr_circles;
float x = cx + cos(angle) * lg_rad;
float y = cy + sin(angle) * lg_rad;
ellipse(x, y, sm_diam, sm_diam);
}
I'm sure you mean well, but it's coming across as very patronising.
You needed to recalculate x and y inside the loop each time. If you look again at the pseudocode Graham posted on page 1 I'm sure you can do it. Here is some code which will draw a straight line of circles.
void draw () {
int x, y; // Declared x and y circle coordinates
int numIterations = 10;
for (int i = 0; i < numIterations; i++) // for loop executes 10 times
{ // This is where the loop body starts, so
// whatever is in the brackets will be
// run 10 times
x = 10 * i; // calculate x
y = 20 * i; // calculate y
ellipse(x, y, 5, 5); // draw ellipse
} // Loop body ends
}
Note that x and y are recalculated inside the loop body each iteration and then used as parameters for the ellipse method (I.e. the newly calculated position of the circle is used to draw the circle, then on the next iteration we calculate the position again and redraw in a new position).
Thanks Chambourd. I'll have a look at that when the rest of my assignments are finished.
I've had Graham's writing on a post-it in front of me all day.
My issue is getting it to work in processing. I don't think I'm writing the formulae in the correct format (syntax?).
Thanks again for taking the time to help.
Good luck in the PhD.
My issue is getting it to work in processing. I don't think I'm writing the formulae in the correct format (syntax?).
Do you realise if you right click the function you can find it in the reference?
lemonysam!!!
I had no idea!
Thank you!
It's little things like that that aren't taught with distance learning and make it so much harder.
Can you go to your supervisor and just explain that you've misread the dates and could you have an extra week?
P.S.
Have you drawn a picture of what you're doing? If not, do so right now. On the picture mark all the distances and angles.
[quote=makecoldplayhistory ]I can see how this could be easily adapted for my purpose.
size(200,200);
smooth();
background(255);
int nbr_circles = 24;
float lg_diam = width * .85;
float lg_rad = lg_diam / 2;
float lg_circ = PI * lg_diam;
float sm_diam = (lg_circ / nbr_circles);
float cx = width/2.0;
float cy = height/2.0;
fill(0);
for (int i = 1; i <= nbr_circles; ++i) {
float angle = i * TWO_PI / nbr_circles;
float x = cx + cos(angle) * lg_rad;
float y = cy + sin(angle) * lg_rad;
ellipse(x, y, sm_diam, sm_diam);
}
That is almost exactly the code you needed. Are you suggesting you can't translate that into processing? Because that looks like java, and processing is java - all you need to do is take that code and rearrange it into the processing specific functions (setup() and draw()). No translation needed.
The frustrating thing for us onlookers is that you got so close. You posted this before submitting I think:
[quote=makecoldplayhistory ]In pseudo code, in my mind, I need something that says
for (int circleNo = 0; circleNo < MaxCircles; circleNo ++)
ellipse (110*cos(CircleNo/360)+300, 110*sin(CircleNo/360)+300, 20, 20)
Is pretty much spot on - you just needed to replace the 360 with TWO_PI because sin and cos work in radians not degrees (oh and you need to watch your case - you have circleNo in the loop and CircleNo in the ellipse command). I think to some extent it's a lack of confidence rather than a lack of understanding which is the problem - why didn't you just try coding that, after fixing the case and adding a ; to the end of the ellipse function it should compile and work.
Edit: actually there is a mistake in the angle formula - you need
[code]360 * circleNo / MaxCircles[/code]
not
[code]circleNo / 360[/code]
(obviously replace 360 with TWO_PI as above)
[quote=toys19 ]I can't comment on the coding but I'd wonder if rather than using the parametric equation of a circle couldn't you do this with the pythagorean form which is simpler and more elegant? (is posted in the the link above)
x^2 + y^2 = r^2
Neat, but not an easy formula to use to create points evenly spaced around a circle (off the top of my head I can't think how to do that at all).
oldnpastit -
It's an online degree. I thought I'd save money and go through Goldsmiths as opposed to The OU.
I don't have a supervisor nor anyone to contact. There's no online discussion board.
I wasn't exaggerating when I said you are sent a reading list, examination dates and an assignment. This assignment (plus 2 others) was set 6 weeks ago. Due on the 15th.
I've got sketches (on several sheets of paper) from where I was working out the x,y co-ords manually.
How will they help me if it's being calculated inside Processing?
Thanks
[quote=makecoldplayhistory ]I don't have a supervisor nor anyone to contact. There's no online discussion board.
I wasn't exaggerating when I said you are sent a reading list, examination dates and an assignment.
Sounds tough - the trouble is, everybody else on this thread is a coder, and it's hard for us to understand why it's difficult as we don't remember not being able to code! Though you have been given some links to places you can discuss stuff - best bet is usually to search for something similar (though not always easy to know what to search for - don't do it too much as you will irritate, but if you post a question which has been asked before usually somebody will link to a previous answer).
Does your reading list include a basic tutorial on coding? If not you could do worse than something like this: http://www.amazon.co.uk/Beginning-Programming-Java-Dummies-Computers/dp/1118407814/ref=dp_ob_title_bk
(as an experienced coder, when I want to learn something new I tend to google "NAME_OF_THING_I_WANT_TO LEARN tutorial", which comes up with http://docs.oracle.com/javase/tutorial/ for java, though this might be a bit tough for you - though you could try https://www.google.co.uk/#q=coding+tutorial)
I've got sketches (on several sheets of paper) from where I was working out the x,y co-ords manually.
How will they help me if it's being calculated inside Processing?
All you need to do is understand how you were working out the co-ords manually and turn that into pseudo code, which you can then turn into processing/java. Is one of the fundamental skills of coding.
Didn't realise this was still trundling along.
OP: you [i]REALLY[/i] need to get your head around basic flow-control (like for loops) and the ideas of assigning values to variable and calling functions.
[url= http://en.wikipedia.org/wiki/For_loop#Syntax ]The syntax varies[/url], but these core concepts are absolutely fundamental to programming in almost any language.
Here is a basic for-loop in Java/Processing:
[code]for (int i = 1; i < 4; i++)
{
my_function(i);
}[/code]
The three clauses between the brackets work as follows:
[code]int i = 1;[/code] - [i]the initialiser[/i]. This sets up the variables you will use to control the loop. It is only executed once. In this case it declares an integer named "i" and initialises it to 1. So in the first iteration of the loop i will be 1.
[code]i < 4;[/code] - [i]the condition[/i]. This is tested BEFORE each iteration of the loop. The loop is only executed when this is true. If it is false then the loop is finished and the program continues on to the code after the loop. Here it checks that i is less than 4.
[code]i++[/code] - [i]the afterthought[/i]. This is executed AFTER each iteration of the loop. It will usually modify the value of a variable that is tested in the [i]condition[/i] so that at some point the condition will be false. Here it just increments i by one.
So... that bit of code will work like this:
[list][li][i]Initialiser: [/i]Declare i and set it to 1[/li]
[li][i]Condition: [/i]Is i less than 4? Yes, okay carry on.[/li]
[li][i]Body: [/i][b]Call my_function(1)[/b][/li]
[li][i]Afterthought: [/i]Increment i. i is now 2.[/li]
[li][i]Condition: [/i]Is i less than 4? Yes, okay carry on.[/li]
[li][i]Body: [/i][b]Call my_function(2)[/b][/li]
[li][i]Afterthought: [/i]Increment i. i is now 3.[/li]
[li][i]Condition: [/i]Is i less than 4? Yes, okay carry on.[/li]
[li][i]Body: [/i][b]Call my_function(3)[/b][/li]
[li][i]Afterthought: [/i]Increment i. i is now 4.[/li]
[li][i]Condition: [/i]Is i less than 4? Nope, we're done.[/li]
[/list]
^^ Although convention is that you start with i = 0, so that the i < 4 limit will perform 4 iterations.
Indeed, zero is typical, but I thought it was important for the OP to realise it doesn't [i]have[/i] to be zero.
(Especially if he doesn't have to draw the case with zero circles 🙂 )
I've got sketches (on several sheets of paper) from where I was working out the x,y co-ords manually.
How will they help me if it's being calculated inside Processing?
One of the most fundamental skills in programming is working your way through your own thought processes and then turning that into a process you can write.
In this instance when you computed the positions for the circles by hand I'm imagining you went something like.
Ok, so I have to fit... lets say five... circles around the circumference of this circle so I guess that means they have to form 72 degree angles* with the centre of the middle circle and one another.Ok, that's easy so now I need to work out what the position is of the centre of the circles on the circumference of the circle where I'm starting - the first one's easy enough, it's straight up by the radius of the circle, but after that I need to use some trig. God I hate trig. Mr Wright at school had a stupid beard and smelt like chips, I could never really listen to him... Anyway, SOHCAHTOA and all that jazz.
ITERATION ONE (Let I = 1)
So the first one is going to be at 72 degrees to the first line, the radius of the circle will form the hypoteneuse of a triangle which will give me the coordinates to get from the middle of the circle to the centre of the new circle. Great. Erm... well the SOH part gives me opposite over hypoteneuse and the CAH part gives me the adjacent over the hypoteneuse so I'll need one of each. That means that the centre of the new circle will be at:
x = CentreMainCircle + RadiusMainCircle * sin(72)
y = CentreMainCircle + RadiusMainCircle * cos(72)So let's assume that the radius is 10 and the centre is at (0,0), does that look right - the point is at (9.5, 3.1) looks about right to me. Ok, draw my circle there. Boom!
ITERATION TWO (I = 2)
OK on a roll now, what's the new angle I need. Ok well it seems to be TWO times 72 degrees or 144 degrees. That gives mex = 0 + 10 * sin(144) = 5.9
y = 0 + 10 * cos(144) = -8.1Draw the circle at (5.9, -8.1). Looks good!
ITERATION THREE (I = 3)
Hmm... so now we're using THREE times 72 (Hmmm... I*72?) or 216 degrees.
x = 0 + 10 * sin(216) = -5.9
y = 0 + 10 * cos(216) = -8.1Hot damn I'm good.
ITERATION FOUR (I = 4)
So Let's go straight for it.
x = 0 + 10 * sin(I * (360/NumberOfCircles)) = -9.5
y = 0 + 10 * cos(I * (360/NumberOfCircles)) = -3.1Bosh, I AM INVINCIBLE!
Hmmm... If I do one more I reckon I wouldn't have needed to work out the initial circle's position first. sooooo...
ITERATION FIVE(I = NumberOfCircles )
x = 0 + 10 * sin(I * (360/NumberOfCircles)) = 0
y = 0 + 10 * cos(I * (360/NumberOfCircles)) = 10Amazing, job done!
So then, generalising it.
1.) Well I took a number of circles
2.) I divided 360 by the number of circles
3.) I looped from I = 1 up to I = the number of circles doing:
x = 0 + 10 * sin(I * (360/NumberOfCircles))
and
y = 0 + 10 * cos(I * (360/NumberOfCircles))to get pairs of coordinates
4.) I drew circles at each of those points.
5.) I danced around the room waving my hands in the air.*sooo...
var n = NumberOfCircles
var Ox = CentreOfMainCircleX
var Oy = CentreOfMainCircleY
var r = RadiusMainCircle
var r2 = RadiusLittleCircle
for I=1 to I=n do
var x = Ox + RadiusMainCircle * sin(I * (360/n))
var y = Oy + RadiusMainCircle * cos(I * (360/n))
elipse(x,y,r2,r2)
end for...
Profit
This might seem patronising but it's pretty much exactly how my brain will run through a problem like this and it serves me well enough to write code for a living. I'm sure I've made some trivial mistake in here but I hope it helps.
*6. Realise I should have done this in Radians
paste this into the editor. 0-50 circles adjusted with left and right arrow keys. It works.
int numberOfCircles = 10;
void setup() {
size (600, 600);
}
void draw() {
background (255, 255, 255);
ellipse(width/2, height/2, 200, 200);
float a = 360.0/numberOfCircles;
for (int i = 0; i < numberOfCircles; i++) {
float x = 210*cos((a*i) * PI / 180.0)+width/2;
float y = 210*sin((a*i) * PI / 180.0)+height/2;
ellipse(x, y, 20, 20);
}
}
void keyPressed() {
if (keyCode == LEFT) {
numberOfCircles = max(numberOfCircles - 1, 0);
}
if (keyCode == RIGHT) {
numberOfCircles = min(numberOfCircles + 1, 50);
}
}
Thanks for the replies.
I teach English as a 2nd Language for a living. I know how hard it can be to dumb things down enough; especially when they seem so simple to you.
Lemony - that certainly seems like a sensible approach. I'll try it with the next question!
With help from here, I got to
int nbr_circles = 8;
void setup() {
size(300,300);
smooth();
background(255);
}void draw() {
background(255);
float cx = width/2.0;
float cy = height/2.0;
fill(0);
//float x, y;
for (int i = 0; i < nbr_circles; i++)
{float angle = i * TWO_PI / nbr_circles;
float x = cx + 110.0 * cos(angle); // calculate x
float y = cy + 110.0 * sin(angle); // calculate y
ellipse(x, y, 20, 20);
}
}void mousePressed() {
if (mouseButton == LEFT) {
nbr_circles = nbr_circles + 1;
} else if (mouseButton == RIGHT) {
if (nbr_circles > 2) {
nbr_circles = nbr_circles - 1;
}
}
}
AND... understand what it all does.
It wasn't the idea of loops that I was struggling with, nor the formula, it was how it combines.
My brain, doesn't work like a coder but as a human (no offence). I mean, when I saw the problem, I thought I would calculate the 54 circles for n=2 to n = 8 and then get the code to display it.
Thanks agian for all help.
[quote=makecoldplayhistory ]I teach English as a 2nd Language for a living. I know how hard it can be to dumb things down enough; especially when they seem so simple to you.
You understand about how to learn then - I don't know why you're finding this so difficult 😉
With help from here, I got to[code]some code[/code]
AND... understand what it all does.
Yay!!!
You haven't got to the deadline yet have you? You can resubmit?
lol @lemonysam, that explains exactly what happens when doing maintenance stuff with another chap I work with who is far less geeky than me. It is frustrating that sometimes writing the script takes almost as long as it would have taken to do it by hand, but experience suggests that most things get repeated more than once, so that the actual trade off point ends up fairly close to where I first decided a script was needed.
I can't re-submit the code. I've submitted that particular question.
However, the next question says 'alter the code you have so that..."
I'll be able to use the code in the next section. Also, this isn't a coding module so much as perceptions of what's happening on the screen. The majority of the marks are for your academic writing about what you see the code doing.
We do need an accompanying running commentary on writing the code. I don't imagine I'll lose many marks for the code from section 1 being improved by section 2.
Other code, I didn't struggle with, was creating a square, offset in the window and rotating it about the centre of the window. You had to talk about how, as the frame rate increased, it became a circle on the screen. The code for this question was obviously a massive leap in complexity compared to
draw a square
make it rotate
right click mouse increases rotation speed
left click mouse decreases rotation speed
Thanks again for the replies.
And this is for a Computer Science BSc??
Wow, things have changed a bit. When I did mine (20 odd years ago) I don't think we even touched on graphics till the second year!
When I did mine 10 years ago we had a package called Turtle Java to introduce loops and things because it provided instant visual feedback into the concepts of loops / recursion / if-else etc.
"Computer Graphics" was an entirely separate module which I didn't do.
Ilama: I've never been taught anything about this by anyone.
Sorry, I'm going to pick up this because it sounds a bit... mental.
Every experience I've ever had of being taught something follows the pattern of "here's a technique... now here's an assignment for you to do using that technique to show you've understood it," right back to when I was in high school. Indeed, you could be penalised for doing it "correctly" rather than for following what you'd been taught, as the implication would be that someone else did it for you. In the absence of other information, it'd make sense to me for lesson 1 to be "just do this manually and get it working" and lesson 2 to be "right, now we're going to introduce loops and show you how much better they are" but it sounds like they've not even done that.
The other thing that strikes me is, for a "programming 101" situation, the task they've set is insanely difficult. For context, it'd give me pause to work out, and I was constructing FOR loops before I hit puberty. I'd argue that the maths side of it is much harder than the coding.
This is why pseudocode is so important, so you can work out your logic flow in natural language before you even think about getting code that parses. If you try to tackle it directly in code you'll be spending all your time trying to understand why you're getting variable type errors whilst simultaneously trying to rewrite the work flow so that it makes sense and that's a challenging thing to do.
The manual method you've submitted is horrible code, as I'm sure you know, but I'm struggling to see what else they'd expect you to come up with when you've no previous experience and they're not giving you any guidance.
FOR loops 101.
A FOR loop repeats code, so you don't have to write the same things out over and over. Your manual approach may appear fine for five circles, but what if you'd to draw 20? A hundred?
The loop has an internal counter which you assign a variable to. You set parameters for the start and finish of the loop, and when you get to the end of the loop the counter is incremented by 1 automagically. Critically, this variable is available to you to frob about with inside your code, so you can use it to affect the contents of the loop or even just see where you're going.
A basic (ho ho) example,
[code]
FOR f = 1 TO 10
PRINT f
NEXT f
[/code]
Don't worry about the syntax here (pseudocode, yes?), look at the concept. The first line says "hey, let's start a loop. We're using "f" as the counter variable, and we want to loop from 1 to 10." The second line is your repeating code; here I'm just printing the contents of the variable on screen. The final line closes the loop, it's the closing } in your actual code; the parser adds 1 to f and goes back to the start of the loop for another pass, unless f is 10 in which case it carts on with the rest of the code. Coding this up and running it, I'd expect to see something like,
[code]
1
2
3
4
5
6
7
8
9
10
[/code]
(or perhaps 12345678910, matters not)
The froody bit about this is, in your example, you've got 'f' to tell you which circle you're drawing. If you can programatically calculate the position of your circles individually using trig then you can do it in a loop.
Eg, lets take four circles (nice and easy to envisage), you'd have to find the positions at 0', 90', 180' and 270'. I'm going to remove the maths for clarity - we're breaking down the problem into bite-sized manageable chunks - and say that we have some handwavey maths which takes an angle and returns co-ordinates.
So, manually, you'd have
[code]
calculatePosition(0)
calculatePosition(90)
calculatePosition(180)
calculatePosition(270)
[/code]
But, we can calculate those figures rather than hard-coding them.
[code]
calculatePosition(90*0)
calculatePosition(90*1)
calculatePosition(90*2)
calculatePosition(90*3)
[/code]
See what's happening here? We're changing the value by an incrementing number, where have we seen this before? Let's go loopy.
[code]
FOR f = 0 to 3
calculatePosition(90*f)
NEXT f
[/code]
Simples, yes? The beauty of this is, apart from avoiding having to write the same code a squillion times, it's portable. If we need a different number of circles, all that changes is that '90' figure. Where's 90 come from? Of course, it's a full circle divided by the number of circles we want. So what happens if we put a variable in there?
[code]
circles = 4
angle = 360/circles
FOR f = 0 to 3
calculatePosition(angle*f)
NEXT f
[/code]
Boom, a chunk of pseudocode that will generate any number of circles from 1 to infinity.
If you've followed all this, you should now be thinking "that hard-coded '4', how do I change that to generate successive images with 1, 2, 3, 4 circles? If only there was some form of code that repeated a code bloke using a number that went up by 1 each time..."
This is, fundamentally, the foundation to the solution for your assignment. The maths is a chunk of code that you'll need to work out and it looks like you've got that largely nailed, it's just a spot of trig. And at each stage you've got the task of turning pseudocode into real code of course.
The way you eat an elephant is one bite at a time, you cannot do the whole thing in one drop (or rather you might be able to, but you're making life very difficult for yourself if you try). Break it down. Maths giving you gyp? Get it printing the numbers on the screen before worrying about what to do with those numbers. Loops a problem? Get the control structure down before you worry about what it's doing inside that control. Or do it the other way, get the calculatePosition working first if that's the area you're more comfortable with, it'll give your confidence a boost when you start to see parts of it working.
One last thing, modern IDEs often give you the ability to trace through code but there's nothing to stop you adding temporary code to punch up additional information whilst you debug it, eg, send your variable values to the screen if you want to see what's going on.
Oh, for completeness I should probably add,
FOR loops are typically incremented, but don't have to be. Depending on your programming language you can usually tell it to decrement or go up in multiples if that's what's required.
I wouldn't worry about that for now though, just figured it was worth throwing out there before someone corrects me. (-:
<pedantic_hat>
Shouldn't;
[code]circles = 4
angle = 360/circles
FOR f = 0 to 3
calculatePosition([u][b]90[/b][/u]*f)
NEXT f
[/code]
be;
[code]circles = 4
angle = 360/circles
FOR f = 0 to 3
calculatePosition([u][b]angle[/b][/u]*f)
NEXT f
[/code]
mcph, please ignore, I'm playing geek one upmanship with Cougar
[quote=Cougar ]FOR loops are typically incremented, but don't have to be. Depending on your programming language you can usually tell it to decrement or go up in multiples if that's what's required.
or exponential:
[code]for (i=1; i<256; i*=2)[/code]
or pretty much anything else you want to do:
[code]for (i=1; i!=5; i=(i*2)%9)[/code]
...and you don't have to test on the loop variable
[code]for (i=0, input=0; input != ' '; i++) {
input = getchar()
}[/code]
or even have a loop variable
[code]for (input=0; input !=' '; input=getchar());[/code]
(though admittedly that would probably be better as a do...while loop)
I wouldn't worry about that for now though, just figured it was worth throwing out there before someone corrects me. (-:
😉
<pedantic_hat>
FFS, nice spot. I'll abuse my privs and change it.
I'm playing geek one upmanship with Cougar
Yeah, I think that's beyond the scope of what I was trying to say (-: I was trying to simplify as much as possible, as the OP said he was struggling to get his head round it.
To be fair, I've very rusty when it comes to programming, I've never touched Java or even heard of "Procedure" or what ever it's called, I'm assuming it's some form of C derivative? But most of my coding these days is around system scripting and automation, login scripts and the like, and even then it's not a common thing for me to have to do. There's a reason my pseudocode looks a little unconventional...

